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

1. 簡介

ML Kit 是一個行動 SDK,可將 Google 的機器學習專業知識導入 Android 和 Android 應用程式,且功能強大又容易使用。無論您是機器學習新手還是經驗豐富的開發人員,都能輕鬆導入所需功能,只需幾行程式碼即可。您不需要深入瞭解類神經網路或模型最佳化,即可開始使用。

運作方式

ML Kit 將 Google 的機器學習技術 (例如 Mobile VisionTensorFlow Lite) 整合至單一 SDK 中,方便您輕鬆將機器學習技術運用在自家應用程式中。無論您需要 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 開發作業的基本知識

本程式碼研究室著重於機器學習套件,我們會事先準備好與主題無關的概念和程式碼區塊,屆時您只要複製及貼上即可。

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.kt 中,將 sourceLang 欄位定義中的 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!

瞭解詳情