この Codelab について
1. はじめに
ML Kit は、Google の機械学習に関する専門知識を Android アプリや Android アプリにパワフルかつ使いやすいパッケージで提供するモバイル SDK です。ML の初心者でも経験者でも、必要な機能はわずか数行のコードで簡単に実装できます。開始するためにニューラル ネットワークやモデルの最適化に関する深い知識は必要ありません。
仕組み
ML Kit を使用すると、Mobile Vision や TensorFlow Lite などの Google の ML テクノロジーを 1 つの SDK にまとめることで、ML 手法を簡単にアプリに適用できます。Mobile Vision のオンデバイス モデルのリアルタイム機能が必要な場合でも、カスタム TensorFlow Lite モデルの柔軟性が必要な場合でも、ML Kit を使用すれば、わずか数行のコードでそれを実現できます。
この Codelab では、リアルタイムのカメラフィードからテキスト認識、言語識別、翻訳を既存の Android アプリに追加する簡単な手順を説明します。この Codelab では、ML Kit API で CameraX を使用する場合のベスト プラクティスについても説明します。
作業内容
この Codelab では、ML Kit を使用して Android アプリを作成します。アプリは ML Kit テキスト認識オンデバイス API を使用して、リアルタイムのカメラフィードからのテキストを認識します。ML Kit Language Identification API を使用して、認識されたテキストの言語を識別します。最後に、アプリは ML Kit Translation API を使用して、このテキストを 59 個のオプションの中から選択した言語に翻訳します。
最終的に、次の画像のような画面が表示されます。
学習内容
- ML Kit SDK を使用して、Android アプリに ML 機能を簡単に追加する方法。
- ML Kit のテキスト認識、言語識別、Translation API とその機能。
- ML Kit API で CameraX ライブラリを使用する方法。
必要なもの
- Android Studio の最新バージョン(v4.0 以降)
- 物理的な Android デバイス
- サンプルコード
- Kotlin での Android 開発に関する基本的な知識
この Codelab は ML Kit に重点を置いています。関連のないコンセプトとコードブロックはすでに提供され、実装されています。
2. 設定方法
コードをダウンロードする
次のリンクをクリックして、この Codelab のコードをすべてダウンロードします。
ダウンロードした zip ファイルを解凍すると、これにより、必要なリソースがすべて含まれたルートフォルダ(mlkit-android
)が展開されます。この Codelab で必要になるのは translate
サブディレクトリ内のリソースのみです。
mlkit-android
リポジトリの translate
サブディレクトリには、次のディレクトリが含まれています。
starter - この Codelab で作成する開始コード。
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 ツールバーの実行アイコン()をクリックします。
デバイスでアプリが起動し、さまざまなテキストにカメラを向けてライブフィードを確認できますが、テキスト認識機能はまだ実装されていません。
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 ツールバーの実行アイコン()をクリックします。アプリが読み込まれると、カメラからのテキストの認識がリアルタイムで開始されます。確認したいテキストにカメラを向けます。アプリでテキストを認識しない場合は、「リセット」してみてくださいテキストにカメラを向ける前に、空白部分にカメラを向けて検出します。
6. 言語 ID を追加
ML Kit 言語識別子をインスタンス化する
MainViewModel.kt
はメインフォルダにあります。このファイルに移動し、次のフィールドを MainViewModel.kt
に追加します。これにより、次のステップで使用する言語識別子のハンドルを取得できます。
MainViewModel.kt
private val languageIdentifier = LanguageIdentification.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
さらに、クライアントが不要になったら適切にシャットダウンされるようにすることも必要です。そのためには、ViewModel
の onCleared()
メソッドをオーバーライドします。
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 ツールバーの実行アイコン()をクリックします。アプリが読み込まれると、カメラから取得したテキストとテキストの言語のリアルタイムでの認識が開始されます。確認したいテキストにカメラを向けます。
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 ツールバーの実行アイコン()をクリックします。アプリが読み込まれると、下の動画のような表示になり、テキスト認識と識別された言語の結果、選択した言語に翻訳されたテキストが表示されます。59 の言語のいずれかを選択できます。
8. お疲れさまでした
これで、ML Kit を使用して、オンデバイスのテキスト認識、言語識別、翻訳をアプリに追加しました。ライブカメラ フィードからテキストとその言語を認識し、選択した言語にリアルタイムで翻訳できます。
学習した内容
- ML Kit を Android アプリに追加する方法
- ML Kit でオンデバイスのテキスト認識を使用して画像内のテキストを認識する方法
- ML Kit でデバイス上の言語識別を使用してテキストの言語を識別する方法
- ML Kit でオンデバイス翻訳を使用してテキストを動的に 59 の言語に翻訳する方法
- CameraX と ML Kit API を組み合わせて使用する方法
次のステップ
- ML Kit と CameraX を独自の Android アプリで使用する。