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

1. はじめに

ML Kit は、Google の機械学習の機能を Android アプリとして提供するモバイル SDK です。その強力で使いやすいパッケージは、機械学習の経験の有無を問わず、わずか数行のコードで必要な機能を簡単に実装できます。ニューラル ネットワークやモデルの最適化に関する詳しい知識は必要ありません。

仕組み

ML Kit を使用すると、Mobile VisionTensorFlow Lite などの Google の ML テクノロジーを 1 つの SDK にまとめることで、ML テクノロジーをアプリに簡単に適用できます。Mobile Vision のデバイス上モデルのリアルタイム機能のパワーが必要な場合でも、カスタム TensorFlow Lite モデルの柔軟性が必要な場合でも、ML Kit を使用すれば、わずか数行のコードで実現できます。

この Codelab では、リアルタイムのカメラフィードから既存の Android アプリにテキスト認識、言語識別、翻訳を追加する簡単な手順を説明します。また、ML Kit API で CameraX を使用する際のベスト プラクティスについても説明します。

作業内容

この Codelab では、ML Kit を使用して Android アプリを作成します。アプリは、ML Kit テキスト認識オンデバイス API を使用して、リアルタイムのカメラフィードからテキストを認識します。ML Kit 言語識別 API を使用して、認識されたテキストの言語を識別します。最後に、アプリは ML Kit Translation API を使用して、このテキストを 59 のオプションから選択した言語に翻訳します。

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

e2a9b80f1ff442d7.png

学習内容

  • ML Kit SDK を使用して、任意の Android アプリに機械学習機能を簡単に追加する方法。
  • ML Kit のテキスト認識、言語識別、翻訳 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. 言語識別を追加する

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 を使用して、アプリにオンデバイスのテキスト認識、言語識別、翻訳を追加しました。カメラのライブフィードからテキストとその言語を認識し、選択した言語にリアルタイムで翻訳できるようになりました。

学習した内容

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

次のステップ

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

詳細