程式碼研究室簡介
1. 簡介
ML Kit 是行動 SDK,功能強大且簡單易用,可將 Google 的機器學習專業知識導入 Android 和 Android 應用程式。無論您是機器學習新手,還是有經驗的新手,只要使用幾行程式碼,就能輕鬆實作所需的功能。您不需要深入瞭解類神經網路或模型最佳化,就能開始使用。
運作方式
ML Kit 將 Mobile Vision 和 TensorFlow 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 種選項中所選的任何語言。
最後,您應該會看到與下圖相似的圖片。
課程內容
- 如何使用 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
子目錄包含下列目錄:
starter:啟動您在本程式碼研究室中建構的程式碼。
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」圖示 。
應用程式應會在裝置上啟動,而您可以將相機鏡頭對準各種文字,即可查看即時影像,但尚未實作文字辨識功能。
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」 ( )。應用程式載入後,應用程式應會開始即時辨識相機中的文字。將相機鏡頭對準要確認的文字。如果您的應用程式無法辨識任何文字,請嘗試「重設」將相機指向空白處,再將相機鏡頭對準文字,即可偵測應用程式。
6. 新增語言識別
將 ML Kit 語言 ID 執行個體化
MainViewModel.kt
位於主要資料夾中。請前往該檔案,並將下列欄位新增至 MainViewModel.kt
。你可以透過這種方式取得語言 ID 的控制代碼,以便在後續步驟中使用。
MainViewModel.kt
private val languageIdentifier = LanguageIdentification.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
此外,您也必須確保用戶端在不再需要時可正常關閉。方法是覆寫 ViewModel
的 onCleared()
方法。
MainViewModel.kt
override fun onCleared() {
languageIdentifier.close()
translators.evictAll()
}
對偵測到的文字執行裝置端語言識別
使用 ML Kit 語言 ID 取得圖中偵測到的文字語言。
將 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」 ( )。應用程式載入後,應用程式應開始辨識相機中的文字,並即時辨識文字語言。將相機鏡頭對準要確認的文字。
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」 ( )。應用程式載入後,應會如下所示 (如下所示),顯示文字辨識和已識別的語言結果,以及所選語言的翻譯文字。共有 59 種語言任您選擇。
8. 恭喜!
恭喜!您剛使用 ML Kit,將裝置端文字辨識、語言識別和翻譯功能新增至應用程式!現在你可以從即時攝影機畫面辨識文字和語言,並將文字即時翻譯成你選擇的語言。
涵蓋內容
- 如何在 Android 應用程式中加入 ML Kit
- 如何在 ML Kit 中使用裝置端文字辨識功能來辨識圖片中的文字
- 如何在 ML Kit 中使用裝置端語言識別功能,辨識文字語言
- 如何在 ML Kit 中使用裝置端翻譯功能,將文字動態翻譯成 59 種語言
- 如何將 CameraX 與 ML Kit API 搭配使用
後續步驟
- 在自己的 Android 應用程式中使用 ML Kit 和 CameraX!