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. 言語 ID を追加する

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

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 の言語識別子を使用して、画像から検出されたテキストの言語を取得します。

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 を組み合わせて使用する方法

次のステップ

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

詳細