【HMS Core】一張圖片帶你玩轉機器學習服務

華為開發者論壇發表於2023-02-10

1、介紹

總覽

Cloud DB(雲資料庫)是一款端雲協同的資料庫產品,提供端雲資料的協同管理、統一的資料模型和豐富的資料管理API介面等能力。在保證資料的可用性、可靠性、一致性,以及安全等特性基礎上,能夠實現資料在客戶端和雲端之間的無縫同步。

ML Kit為(機器學習服務)開發者提供簡單易用、服務多樣、技術領先的機器學習能力,助力開發者更快更好地開發各類AI應用。

您將建立什麼

在本次Codelab中,您將建立一個示例專案並整合ML Kit和Cloud DB。在該專案中,您可以:

1、使用鍵盤或影像分類進行影像搜尋

2、列出Cloud DB中的影像

3、檢測影像描述的語言

4、翻譯影像描述

5、聲化影像描述

您需要什麼

在本codelab中,你需要學習:

1、如何在AppGallery Connect中建立專案和應用程式

2、如何整合ML Kit和Cloud DB

3、如何使用ML Kit和Cloud DB

 

2、您需要什麼

硬體需求

  • 一臺筆記本或臺式電腦。

  • 華為手機:EMUI 8.0版本或以上,執行HMS Core (APK) 5.0.1.301及以上版本;非華為手機:Android 7.0或以上,執行HMS Core (APK) 5.0.1.301或以上版本。

  • 手機用於執行和除錯demo

軟體需求

  • JDK版本:1.8或以上

  • Android Studio版本:3.X或以上

  • minSdkVersion:24或以上

  • targetSdkVersion:29

  • compileSdkVersion:29

  • Gradle版本:4.6或以上

必備知識

安卓應用開發基礎知識

 

3、整合前準備

整合前,需要完成以下準備工作:

說明:

在進行準備前,請先註冊開發者帳號

  • 在AppGallery Connect中建立專案和應用。

  • 建立Android Studio專案。

  • 生成簽名證照。

  • 生成簽名證照指紋。

  • 在AppGallery Connect中將簽名指紋新增到應用中。

  • 新增必要配置。

  • 配置專案簽名。

  • 同步專案。

詳情請參見HUAWEI HMS Core整合準備

 

4、整合HMS Core SDK

新增您應用的AppGallery Connect配置檔案

  1. 登入AppGallery Connect,點選“我的專案”,在專案列表中找到並點選您的專案。

  2. 在“專案設定”頁面選擇“常規”頁籤。

  3. 在“專案”區域下點選“資料處理位置”後的“啟用”。

    1.png

  4. 點選“應用”區域的“agconnect-services.json”下載配置檔案。

    cke_20937.png

  5. 將配置檔案"agconnect-services.json"複製到應用級根目錄下。

    cke_7575.png

新增編譯依賴

  1. 開啟應用級的“build.gradle”檔案。

  2. 在dependencies程式碼段中新增如下編譯依賴。

    dependencies { 
         // Import Cloud DB. 
         implementation 'com.huawei.agconnect:agconnect-cloud-database:{version}' 
        // Import Image Classification
        implementation 'com.huawei.hms:ml-computer-vision-classification:{version}'
        // Import Image Classification Model
        Implementation 'com.huawei.hms:ml-computer-vision-image-classification-model:{version}'
        // Import Real-Time Translation
        implementation 'com.huawei.hms:ml-computer-translate:{version}'
        // Import Real-Time Language Detection
        implementation 'com.huawei.hms:ml-computer-language-detection:{version}'
        // Import Text To Speech
        implementation 'com.huawei.hms:ml-computer-voice-tts:{version}'
     }
    【HMS Core】一張圖片帶你玩轉機器學習服務

    具體說明如下:

    a.將{version}替換為Cloud DB的最新版本號,例如com.huawei.agconnect:agconnect-cloud-database:1.5.4.300。有關最新版本號的詳細資訊,請參見文件。

    b.將{version}替換為ML Kit的最新版本號,例如com.huawei.agconnect:agconnect-function-ktx 1.7.1.300。有關最新版本號的詳細資訊,請參見文件。

  3. 在build.gradle檔案中,設定Java原始碼的相容性模式為JDK1.8。

    compileOptions { 
    sourceCompatibility = 1.8 
    targetCompatibility = 1.8
    }
    【HMS Core】一張圖片帶你玩轉機器學習服務
  4. 在應用級build.gradle檔案中設定minSdkVersion。

    android {
     ... 
       defaultConfig {
          ... 
       minSdkVersion 26 
          ... 
      }
       ... 
    }
    【HMS Core】一張圖片帶你玩轉機器學習服務
  5. 檢查是否已新增AppGallery Connect外掛。如沒有,在應用級build.gradle檔案中新增該外掛。

    apply plugin: 'com.huawei.agconnect'
    【HMS Core】一張圖片帶你玩轉機器學習服務

配置混淆指令碼

編譯APK前需要配置混淆指令碼,避免混淆HMS Core SDK。如果出現混淆,HMS Core SDK可能無法正常工作。

Android Studio開發環境裡的混淆指令碼是“proguard-rules.pro”。

加入排除HMS SDK的混淆配置。

-ignorewarnings 
-keepattributes *Annotation* 
-keepattributes Exceptions 
-keepattributes InnerClasses 
-keepattributes Signature 
-keepattributes SourceFile,LineNumberTable 
-keep class com.huawei.hianalytics.**{*;} 
-keep class com.huawei.updatesdk.**{*;} 
-keep class com.huawei.hms.**{*;}
【HMS Core】一張圖片帶你玩轉機器學習服務

 

5、設計UI

cke_5924.png

cke_8768.png

 

6、在AppGallery Connect中初始化雲資料庫

步驟一:建立雲資料庫的儲存區

1)登入AppGallery Connect,單擊我的專案。

2)在專案列表中選擇一個專案,單擊需要新增Cloud DB區域的應用。

3)在左側導航欄中,選擇“Serverless > 雲資料庫”。

4)點選雲資料庫區域選項卡。

5)點選“新增”,進入雲資料庫區域建立頁面。

cke_9515.png

cke_27389.png

步驟二:在AGC中建立雲資料庫物件型別

1)登入AppGallery Connect,單擊我的專案。

2)在專案列表中選擇一個專案,單擊需要新增Cloud DB區域的應用。

3)在左側導航欄中,選擇“Serverless > 雲資料庫”。

4)根據需求執行以下操作:

a.建立物件型別:點選“新增”

b.編輯現有物件型別:點選“修改”

cke_36196.png

cke_42957.png

 

7、初始化雲資料庫

步驟一:初始化雲資料庫

private lateinit var mCloudDB: AGConnectCloudDB
private var handler: CompletableDeferred<Result<Unit>>? = null
private var cloudDBZone: CloudDBZone? = null
override suspend fun initialize(): Result<Unit> {
    handler = CompletableDeferred()
    AGConnectCloudDB.initialize(context)
    initializeCloudDB()
    initializeZone()
    handler?.let { return it.await() }
        ?: run { return Result.Error("An error occurred") }
}
private fun initializeCloudDB() {
    val instance = AGConnectInstance.buildInstance(
        AGConnectOptionsBuilder().setRoutePolicy(
            AGCRoutePolicy.GERMANY
        ).build(context)
    )
    mCloudDB = AGConnectCloudDB.getInstance(
        instance, 
        AGConnectAuth.getInstance()
    )  mCloudDB.createObjectType(ObjectTypeInfoHelper.getObjectTypeInfo())
}
private fun initializeZone() {
    val mConfig = CloudDBZoneConfig(
        "ImageDbZone",
        CloudDBZoneConfig.CloudDBZoneSyncProperty.CLOUDDBZONE_CLOUD_CACHE,      CloudDBZoneConfig.CloudDBZoneAccessProperty.CLOUDDBZONE_PUBLIC
    )
    mConfig.persistenceEnabled = true
    val task = mCloudDB.openCloudDBZone2(mConfig, true)
    task.addOnSuccessListener {
        cloudDBZone = it
        handler?.complete(Result.Success(Unit))
    }.addOnFailureListener {
        handler?.complete(Result.Error(it.message ?: "An error occurred."))
    }
}
【HMS Core】一張圖片帶你玩轉機器學習服務

步驟二:將“query”作為搜尋入參。對於接收到的“query”。根據影像物件對應的“key”欄位在Cloud DB中完成過濾,根據過濾結果列出雲資料庫中的影像物件。

override suspend fun searchImage(query: String): List<Image> {
    val result = CompletableDeferred<List<Image>>()
    cloudDBZone?.let { dbZone ->
        dbZone.executeQuery(
            CloudDBZoneQuery.where(Image::class.java)
                .equalTo("key", query),
            CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_DEFAULT
        ).addOnCompleteListener{
            if(it.isSuccessful) {
                val cursor = it.result.snapshotObjects
                val images = mutableListOf<Image>()
                while(cursor.hasNext()) {
                    images.add(cursor.next())
                }
                result.complete(images)
            }else {
                throw it.exception
            }
        }
    }?: run {
        throw CloudDbNotInitializedException()
    }
    return result.await()}
【HMS Core】一張圖片帶你玩轉機器學習服務

 

8、整合機器學習服務

步驟一:檢視許可權。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
【HMS Core】一張圖片帶你玩轉機器學習服務

步驟二:ML Kit方法返回Task。建立Task.await()擴充套件函式,用於在協程和Task API之間轉換。Task.await()等待任務完成,而不阻塞執行緒,並返回未包裝的結果(Task<T>中的T)。

suspend fun <T> Task<T>.await(): T = suspendCoroutine { continuation ->
    addOnCompleteListener { task ->
        if (task.isSuccessful) {
            continuation.resume(task.result)
        } else {
            continuation.resumeWithException(
                task.exception ?: Exception("Unknown task exception")
            )
        }
    }
}
【HMS Core】一張圖片帶你玩轉機器學習服務

步驟三:影像分類

/**
 * Step 1: Create an image classification analyzer.
 *  Use customized parameter settings or default parameter settings
 *  for on-device recognition.
 *
 *      Customized ->
 *          var setting = MLLocalClassificationAnalyzerSetting
 *                        .Factory()
 *                        .setMinAcceptablePossibility(0.8f)
 *                        .create()
 *          var analyzer = MLAnalyzerFactory
 *                        .getInstance()
 *                        .getLocalImageClassificationAnalyzer(setting)
 *
 *      Default -> var analyzer = MLAnalyzerFactory
 *                               .getInstance()
 *                               .localImageClassificationAnalyzer
 *
 * Step 2: Create an MLFrame object using android.graphics.Bitmap.
 * JPG, JPEG, PNG, and BMP images are supported.
 *
 * Step 3: Call the asyncAnalyseFrame method to classify images.
 *
 * Step 4: After the recognition is complete, stop the analyzer to
 * release recognition resources.
*/
override suspend fun classifyImage(bitmap: Bitmap): List<MLImageClassification> {
    val analyzer = MLAnalyzerFactory
        .getInstance()
        .localImageClassificationAnalyzer //Step 1
    val frame = MLFrame.fromBitmap(bitmap) //Step 2
    val task = analyzer.asyncAnalyseFrame(frame) //Step 3
    val classificationResult = task.await()
    analyzer.stop() //Step 4
    return classificationResult
}
【HMS Core】一張圖片帶你玩轉機器學習服務

步驟四:語種檢測

/**
 * Step 1: Create a language detector.
 *  Use customized parameter settings or default parameter settings 
 *  to create a language detector.
 *  
 *      Customized -> val setting = MLRemoteLangDetectorSetting
 *                                  .Factory()
 *                                  .setTrustedThreshold(0.01f)
 *                                  .create()
 *                    val mlRemoteLangDetector = MLLangDetectorFactory
 *                                            .getInstance()
 *                                            .getRemoteLangDetector(setting)
 *
 *      Default -> val mlRemoteLangDetector = MLLangDetectorFactory
 *                                            .getInstance()
 *                                            .remoteLangDetector
 *
 * Step 2: Implement language detection.
 * 
 * Step 3: Release resources after the detection is complete.
 */
override suspend fun detectLanguage(text: String): String {
    val mlRemoteLangDetector = MLLangDetectorFactory  //Step 1
        .getInstance()
        .remoteLangDetector
    val firstBestDetectTask = mlRemoteLangDetector //Step 2
        .firstBestDetect(text)
    val detectResult = firstBestDetectTask.await()
    mlRemoteLangDetector.stop() //Step 3
    return detectResult
}
【HMS Core】一張圖片帶你玩轉機器學習服務

步驟五:文字翻譯

/**
 * Step 1: Create a real-time text translator.
 * Language Code -> The BCP-47 standard is used for Traditional Chinese,
 * and the ISO 639-1 standard is used for other languages.
 *
 * Step 2: Implement real-time translation.
 *
 * Step 3: Release resources after the translation is complete.
 */
override suspend fun translateText(
    text: String,
    sourceLanguage:String,
    targetLanguage: String
): String {
    val setting = MLRemoteTranslateSetting //Step 1
        .Factory()
        .setSourceLangCode(sourceLanguage)
        .setTargetLangCode(targetLanguage)
        .create()
    val mlRemoteTranslator = MLTranslatorFactory
        .getInstance()
        .getRemoteTranslator(setting)
    val translatorTask = mlRemoteTranslator //Step 2
        .asyncTranslate(text)
    val translationResult = translatorTask.await()
    mlRemoteTranslator.stop() //Step 3
    return translationResult
}
【HMS Core】一張圖片帶你玩轉機器學習服務

步驟六:語音合成

private lateinit var mlTtsEngine: MLTtsEngine
private lateinit var mlConfigs: MLTtsConfig
// Step 1: Create a TTS engine.
override fun createInstance(){
    // Use customized parameter settings to create a TTS engine.
    mlConfigs = MLTtsConfig()
        // Set the text converted from speech to English.
        .setLanguage(MLTtsConstants.TTS_EN_US)
        // Set the English timbre.
        .setPerson(MLTtsConstants.TTS_SPEAKER_FEMALE_EN)
        // Set the speech speed.
        // The range is (0,5.0]. 1.0 indicates a normal speed.
        .setSpeed(1.0f)
        // Set the volume.
        // The range is (0,2). 1.0 indicates a normal volume.
        .setVolume(1.0f)
    mlTtsEngine = MLTtsEngine(mlConfigs)
    mlTtsEngine.setTtsCallback(callback)
}
// Step 3: Control the playback
override fun startSpeaking(text: String) {
    mlTtsEngine.speak(text,MLTtsEngine.QUEUE_APPEND)
}
// Step 3: Control the playback
override fun resumeSpeaking() {
    mlTtsEngine.resume()
}
// Step 3: Control the playback
override fun pauseSpeaking() {
    mlTtsEngine.pause()
}
// Step 4: Stop the ongoing TTS tasks and clear all TTS tasks in the queue.
override fun stopSpeaking() {
    mlTtsEngine.stop()
}
// Step 5: Release resources after TTS ends.
override fun shutDownTextToSpeech() {
    mlTtsEngine.shutdown()
}

// Step 2: Create a TTS callback function to process the TTS result.
//Pass the TTS callback to the TTS engine created in Step 1 to perform TTS.
private var callback: MLTtsCallback = object : MLTtsCallback {
    override fun onEvent(taskId: String, eventName: Int, bundle: Bundle?) {
        when(eventName){
            MLTtsConstants.EVENT_PLAY_START -> {/* Handle Event */}
            MLTtsConstants.EVENT_PLAY_RESUME -> {/* Handle Event */}
            MLTtsConstants.EVENT_PLAY_PAUSE -> {/* Handle Event */}
            MLTtsConstants.EVENT_PLAY_STOP -> {/* Handle Event */}
            MLTtsConstants.EVENT_SYNTHESIS_START -> {/* Handle Event */}
            MLTtsConstants.EVENT_SYNTHESIS_END -> {/* Handle Event */}
            MLTtsConstants.EVENT_SYNTHESIS_COMPLETE -> {{/* Handle Event */}}
        }
    }
    override fun onError(taskId: String, err: MLTtsError) {
        //Processing logic for TTS failure.
    }
    override fun onWarn(taskId: String, warn: MLTtsWarn) {
        //Alarm handling without affecting service logic.
    }
    //Return the mapping between the currently played segment and text.
    //start: start position of the audio segment in the input text;
    //end (excluded): end position of the audio segment in the input text
    override fun onRangeStart(taskId: String, start: Int, end: Int) {
        //Process the mapping between the currently played segment and text.
    }
    //taskId: ID of an audio synthesis task corresponding to the audio.
    //audioFragment: audio data.
    //offset: offset of the audio segment to be transmitted in the queue.
    //One audio synthesis task corresponds to an audio synthesis queue.
    //range: text area where the audio segment to be transmitted is located;
    //range.first (included): start position;
    //range.second (excluded): end position.
    override fun onAudioAvailable(
        taskId: String?,
        audioFragment: MLTtsAudioFragment?,
        offset: Int,
        range: android.util.Pair<Int, Int>?,
        bundle: Bundle?
    ) {
    //Audio stream callback API,
    // which is used to return the synthesized audio data to the app.
    }
}
【HMS Core】一張圖片帶你玩轉機器學習服務

 

9、恭喜您

祝賀您,您已經成功完成本codelab並學到了:

  • 如何整合雲資料庫。

  • 如何使用ML Kit(影像分類、語種檢測、文字翻譯、語音合成)。

 

10、參考檔案

點選此處下載原始碼。

欲瞭解更多更全技術文章,歡迎訪問https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

相關文章