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

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

程式碼研究室簡介

subject上次更新時間:11月 4, 2021
account_circle作者:carenc

1. 簡介

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

運作方式

ML Kit 將 Mobile VisionTensorFlow Lite 等 Google 機器學習技術整合至單一 SDK 中,方便您輕鬆將機器學習技術運用在自家應用程式中。無論是需要 Mobile Vision 裝置端模型的即時功能,還是自訂 TensorFlow Lite 模型的靈活性,只要加入幾行程式碼,就能透過 ML Kit 完成相關作業。

本程式碼研究室將逐步引導您完成幾個簡單的步驟,以便將即時相機動態饋給中的文字辨識、語言識別和翻譯功能新增到現有的 Android 應用程式。本程式碼研究室也會著重說明搭配使用 CameraX 與 ML Kit API 的最佳做法。

建構目標

在這個程式碼研究室中,您將使用 ML Kit 建構 Android 應用程式。您的應用程式將使用 ML Kit 文字辨識裝置端 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」圖示 執行.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」 ( 執行.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 語言 ID 取得圖中偵測到的文字語言。

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」 ( 執行.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」 ( 執行.png)。應用程式載入後,應會如下所示 (如下所示),顯示文字辨識和已識別的語言結果,以及所選語言的翻譯文字。共有 59 種語言任您選擇。

e2a9b80f1ff442d7.png

8. 恭喜!

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

涵蓋內容

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

後續步驟

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

瞭解詳情