ML Kit と CameraX を使用した言語の認識、識別、テキストの翻訳: Android

ML Kit と CameraX を使用した言語の認識、識別、テキストの翻訳:
Android

この Codelab について

subject最終更新: 11月 4, 2021
account_circle作成者: carenc

1. はじめに

ML Kit は、Google の機械学習に関する専門知識を Android アプリや Android アプリにパワフルかつ使いやすいパッケージで提供するモバイル SDK です。ML の初心者でも経験者でも、必要な機能はわずか数行のコードで簡単に実装できます。開始するためにニューラル ネットワークやモデルの最適化に関する深い知識は必要ありません。

ML Kit を使用すると、Mobile VisionTensorFlow 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 個のオプションの中から選択した言語に翻訳します。

最終的に、次の画像のような画面が表示されます。

e2a9b80f1ff442d7.png

学習内容

  • 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 サブディレクトリには、次のディレクトリが含まれています。

  • android_studio_folder.pngstarter - この 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 ツールバーの実行アイコン(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 ツールバーの実行アイコン(execute.png)をクリックします。アプリが読み込まれると、カメラからのテキストの認識がリアルタイムで開始されます。確認したいテキストにカメラを向けます。アプリでテキストを認識しない場合は、「リセット」してみてくださいテキストにカメラを向ける前に、空白部分にカメラを向けて検出します。

6. 言語 ID を追加

ML Kit 言語識別子をインスタンス化する

MainViewModel.kt はメインフォルダにあります。このファイルに移動し、次のフィールドを MainViewModel.kt に追加します。これにより、次のステップで使用する言語識別子のハンドルを取得できます。

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 ツールバーの実行アイコン(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 ツールバーの実行アイコン(execute.png)をクリックします。アプリが読み込まれると、下の動画のような表示になり、テキスト認識と識別された言語の結果、選択した言語に翻訳されたテキストが表示されます。59 の言語のいずれかを選択できます。

e2a9b80f1ff442d7.png

8. お疲れさまでした

これで、ML Kit を使用して、オンデバイスのテキスト認識、言語識別、翻訳をアプリに追加しました。ライブカメラ フィードからテキストとその言語を認識し、選択した言語にリアルタイムで翻訳できます。

学習した内容

  • ML Kit を Android アプリに追加する方法
  • ML Kit でオンデバイスのテキスト認識を使用して画像内のテキストを認識する方法
  • ML Kit でデバイス上の言語識別を使用してテキストの言語を識別する方法
  • ML Kit でオンデバイス翻訳を使用してテキストを動的に 59 の言語に翻訳する方法
  • CameraX と ML Kit API を組み合わせて使用する方法

次のステップ

  • ML Kit と CameraX を独自の Android アプリで使用する。

詳細