運用 ML Kit 和 CameraX 辨識、辨識語言及翻譯文字:Android

1. 簡介

ML Kit 是行動 SDK,功能強大且簡單易用,可將 Google 的機器學習專業知識導入 Android 和 Android 應用程式。無論您是機器學習新手,還是有經驗的新手,只要使用幾行程式碼,就能輕鬆實作所需的功能。您不需要具備神經網路或模型最佳化方面的專業知識,就能開始使用。

運作方式

透過將 Google 的機器學習技術 (例如 Mobile VisionTensorFlow Lite) 整合至單一 SDK 中,ML Kit 可讓您輕鬆將機器學習技術套用至應用程式中。無論您需要 Mobile Vision 裝置端模型的即時功能,還是自訂 TensorFlow Lite 模型的彈性,只要編寫幾行程式碼,就能透過 ML Kit 實現這些功能。

本程式碼研究室將逐步說明如何在現有 Android 應用程式中,透過即時攝影機畫面新增文字辨識、語言辨識和翻譯功能。本程式碼研究室也會說明如何搭配使用 CameraX 和 ML Kit API 的最佳做法。

建構目標

在本程式碼研究室中,您將使用 ML Kit 建構 Android 應用程式。您的應用程式會使用 ML Kit Text Recognition 裝置端 API,從即時攝影機畫面中辨識文字。它會使用 ML Kit Language Identification API 來識別辨識文字的語言。最後,您的應用程式會使用 ML Kit Translation API,將這段文字翻譯成 59 種選項中所選的任何語言。

最後,您應該會看到類似下圖的畫面。

e2a9b80f1ff442d7.png

課程內容

  • 如何使用 ML Kit SDK,輕鬆為任何 Android 應用程式新增機器學習功能。
  • ML Kit 文字辨識、語言辨識、翻譯 API 及其功能。
  • 如何搭配 ML Kit API 使用 CameraX 程式庫。

軟硬體需求

  • 最新版 Android Studio (4.0 以上版本)
  • 實體 Android 裝置
  • 程式碼範例
  • 對 Kotlin 中的 Android 開發作業有基本瞭解

本程式碼研究室著重於 ML Kit。Google 已為您導入不相關的概念和程式碼區塊。

2. 開始設定

下載程式碼

點選下方連結即可下載這個程式碼研究室的所有程式碼:

將下載的 ZIP 檔案解壓縮。這麼做會將根資料夾 (mlkit-android) 解壓縮到所有所需資源。在本程式碼研究室中,您只需要 translate 子目錄中的資源。

mlkit-android 存放區中的 translate 子目錄包含下列目錄:

  • android_studio_folder.pngstarter:您在本程式碼研究室中建構的範例程式碼。

3. 匯入專案並驗證 ML Kit 和 CameraX 依附元件

將啟動專案匯入 Android Studio。在 app/build.gradle 檔案中,確認已納入必要的 ML Kit 和 CameraX 依附元件:

// CameraX dependencies
def camerax_version = "1.0.0-beta05"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-view:1.0.0-alpha12"

// ML Kit dependencies
implementation 'com.google.android.gms:play-services-mlkit-text-recognition:16.0.0'
implementation 'com.google.mlkit:language-id:16.0.0'
implementation 'com.google.mlkit:translate:16.0.0'

4. 執行範例應用程式

現在您已將專案匯入 Android Studio 並檢查 ML Kit 依附元件,可以開始執行應用程式了!按一下 Android Studio 工具列中的「Run」圖示 ( execute.png)。

應用程式應會在裝置上啟動,你可以將攝影機對準各種文字,查看即時影像,但文字辨識功能尚未實作。

bd1489441c334de3.png

5. 新增文字辨識功能

在這個步驟中,我們會為應用程式新增功能,以便從攝影機辨識文字。

將 ML Kit 文字偵測器例項化

請取代 TextAnalyzer.kt 頂端的 TODO,以便例項化 TextRecognition。這就是取得文字辨識器句柄的方式,可在後續步驟中使用。我們也需要將偵測器新增為生命週期觀察器,才能在不再需要時正確關閉偵測器。

TextAnalyzer.kt

private val detector = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)

init {
   lifecycle.addObserver(detector)
}

在輸入圖片 (使用相機緩衝區建立) 上執行文字辨識

CameraX 程式庫會提供相機的圖片串流,以便進行圖片分析。取代 TextAnalyzer 類別中的 recognizeText() 方法,在每個圖片影格使用 ML Kit 文字辨識。

TextAnalyzer.kt

private fun recognizeText(
   image: InputImage
): Task<Text> {
   // Pass image to an ML Kit Vision API
   return detector.process(image)
       .addOnSuccessListener { text ->
           // Task completed successfully
           result.value = text.text
       }
       .addOnFailureListener { exception ->
           // Task failed with an exception
           Log.e(TAG, "Text recognition error", exception)
           val message = getErrorMessage(exception)
           message?.let {
               Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
           }
       }
}

以下行程式碼顯示如何呼叫上述方法,開始執行文字辨識。在 analyze() 方法的結尾處加入下列指令行。請注意,在圖片分析完成後,您必須呼叫 imageProxy.close,否則即時攝影機動態饋給將無法處理其他圖片以供分析。

TextAnalyzer.kt

recognizeText(InputImage.fromBitmap(croppedBitmap, 0)).addOnCompleteListener {
   imageProxy.close()
}

在裝置上執行應用程式

接著,請在 Android Studio 工具列中按一下「Run」圖示 ( execute.png)。應用程式載入後,應會開始即時辨識攝影機畫面中的文字。將相機鏡頭對準要確認的文字。如果應用程式無法辨識任何文字,請先將相機鏡頭對準空白空間,再對準文字,嘗試「重設」偵測功能。

6. 新增語言識別功能

將 ML Kit 語言 ID 執行個體化

MainViewModel.kt 位於主資料夾中。請前往該檔案,並將下列欄位新增至 MainViewModel.kt。這是取得語言 ID 的句柄,以便在後續步驟中使用。

MainViewModel.kt

private val languageIdentifier = LanguageIdentification.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)

此外,您也應確保用戶端在不再需要時能正確關閉。方法是覆寫 ViewModelonCleared() 方法。

MainViewModel.kt

override fun onCleared() {
   languageIdentifier.close()
   translators.evictAll()
}

對偵測到的文字執行裝置端語言辨識

使用 ML Kit 語言辨識器,取得圖片中偵測到的文字語言。

MainViewModel.ktsourceLang 欄位定義中的 TODO 替換為下列程式碼。這個程式碼片段會呼叫語言辨識方法,並指派結果 (如果未定義則為「und」)。如果語言未定義,表示 API 無法根據支援的語言清單識別語言。

MainViewModel.kt

val sourceLang = Transformations.switchMap(sourceText) { text ->
   val result = MutableLiveData<Language>()
   languageIdentifier.identifyLanguage(text)
       .addOnSuccessListener { languageCode ->
           if (languageCode != "und")
               result.value = Language(languageCode)
       }
   result
}

在裝置上執行應用程式

接著,請在 Android Studio 工具列中按一下「Run」圖示 ( execute.png)。應用程式載入後,應開始從攝影機辨識文字,並即時辨識文字的語言。將相機鏡頭對準任何文字即可確認。

7. 新增翻譯

MainViewModel.kt 中的 translate() 函式替換為以下程式碼。這個函式會使用原文語言值、目標語言值和原文,執行翻譯作業。請注意,如果所選目標語言模型尚未下載到裝置上,我們會呼叫 downloadModelIfNeeded() 來下載,然後繼續進行翻譯。

MainViewModel.kt

private fun translate(): Task<String> {
   val text = sourceText.value
   val source = sourceLang.value
   val target = targetLang.value
   if (modelDownloading.value != false || translating.value != false) {
       return Tasks.forCanceled()
   }
   if (source == null || target == null || text == null || text.isEmpty()) {
       return Tasks.forResult("")
   }
   val sourceLangCode = TranslateLanguage.fromLanguageTag(source.code)
   val targetLangCode = TranslateLanguage.fromLanguageTag(target.code)
   if (sourceLangCode == null || targetLangCode == null) {
       return Tasks.forCanceled()
   }
   val options = TranslatorOptions.Builder()
       .setSourceLanguage(sourceLangCode)
       .setTargetLanguage(targetLangCode)
       .build()
   val translator = translators[options]
   modelDownloading.setValue(true)

   // Register watchdog to unblock long running downloads
   Handler().postDelayed({ modelDownloading.setValue(false) }, 15000)
   modelDownloadTask = translator.downloadModelIfNeeded().addOnCompleteListener {
       modelDownloading.setValue(false)
   }
   translating.value = true
   return modelDownloadTask.onSuccessTask {
       translator.translate(text)
   }.addOnCompleteListener {
       translating.value = false
   }
}

在模擬器上執行應用程式

接著,請在 Android Studio 工具列中按一下「Run」圖示 ( execute.png)。應用程式載入後,畫面應會顯示下方的動畫圖片,顯示文字辨識和識別的語言結果,以及翻譯成所選語言的文字。您可以選擇任一 59 種語言。

e2a9b80f1ff442d7.png

8. 恭喜!

恭喜!您剛使用 ML Kit,將裝置端文字辨識、語言識別和翻譯功能新增至應用程式!你現在可以從即時攝影機影像中辨識文字和語言,並即時將文字翻譯成所選語言。

涵蓋內容

  • 如何將 ML Kit 新增至 Android 應用程式
  • 如何使用 ML Kit 中的裝置端文字辨識功能,辨識圖片中的文字
  • 如何使用 ML Kit 中的裝置端語言辨識功能,識別文字的語言
  • 如何在 ML Kit 中使用裝置端翻譯功能,將文字動態翻譯成 59 種語言
  • 如何搭配使用 CameraX 和 ML Kit API

後續步驟

  • 在自家 Android 應用程式中使用 ML Kit 和 CameraX!

瞭解詳情