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

ML Kit は、Google の機械学習の機能を Android アプリや 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 のオプションから選択した言語にテキストを翻訳します。

最終的には、下の画像のような表示になります。

学習内容

  • ML Kit SDK を使用して、任意の Android アプリに機械学習機能を簡単に追加する方法。
  • ML Kit のテキスト認識、言語識別、翻訳 API とその機能。
  • ML Kit API で CameraX ライブラリを使用する方法。

必要なもの

  • 最新バージョンの Android Studio(v4.0 以降)
  • 物理 Android デバイス
  • サンプルコード
  • Kotlin による Android 開発に関する基本的な知識

この Codelab では、ML Kit を中心に説明します。関連のない概念やコードブロックはすでに提供されており、実装されています。

コードをダウンロードする

次のリンクをクリックして、この Codelab のコードをすべてダウンロードします。

ソースコードをダウンロード

ダウンロードした zip ファイルを解凍すると、ルートフォルダ(mlkit-android)が展開されます。このフォルダには、必要なすべてのリソースが含まれています。この Codelab では、translate サブディレクトリのリソースのみを使用します。

mlkit-android リポジトリの translate サブディレクトリには、次のディレクトリが含まれています。

  • android_studio_folder.pngstarter - この Codelab で作成する開始コード。

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'

プロジェクトを Android Studio にインポートし、ML Kit の依存関係を確認したので、アプリを初めて実行する準備が整いました。Android Studio エミュレータを起動し、Android Studio ツールバーの実行アイコン(execute.png)をクリックします。

アプリがデバイスで起動され、さまざまなテキストにカメラを向けるとライブフィードが表示されます。ただし、テキスト認識機能はまだ実装されていません。

このステップでは、ビデオカメラからテキストを認識する機能をアプリに追加します。

ML Kit テキスト検出機能をインスタンス化する

次のフィールドを TextAnalyzer.kt の先頭に追加します。後で使用するテキスト認識ツールへのハンドルを取得する方法は次のとおりです。

TextAnalyzer.kt

private val detector = TextRecognition.getClient()

Vision 画像(カメラのバッファで作成)でオンデバイスのテキスト認識を実行する

CameraX ライブラリは、画像分析の準備が整ったカメラからの画像のストリームを提供します。TextAnalyzer クラスの recognizeTextOnDevice() メソッドを置き換えて、各画像フレームで ML Kit テキスト認識を使用します。

TextAnalyzer.kt

private fun recognizeTextOnDevice(
   image: InputImage
): Task<Text> {
   // Pass image to an ML Kit Vision API
   return detector.process(image)
       .addOnSuccessListener { visionText ->
           // Task completed successfully
           result.value = visionText.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

recognizeTextOnDevice(InputImage.fromBitmap(croppedBitmap, 0)).addOnCompleteListener {
   imageProxy.close()
}

デバイスでアプリを実行する

Android Studio のツールバーで [実行](execute.png)をクリックします。アプリが読み込まれると、カメラからのテキストの認識がリアルタイムで開始されます。カメラをテキストに向けると、確認できます。

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

次のフィールドを MainViewModel.kt に追加します。次のステップで使用する言語 ID へのハンドルを取得する方法は次のとおりです。

MainViewModel.kt

private val languageIdentification = LanguageIdentification.getClient()

検出されたテキストに対してデバイス上の言語識別を実行する

ML Kit の言語識別子を使用して、画像から検出されたテキストの言語を取得します。

MainViewModel.ktsourceLang フィールド定義の TODO を次のコードに置き換えます。このスニペットは、言語識別メソッドを呼び出し、結果が未定義(「und」)でない場合、その結果を割り当てます。

MainViewModel.kt

languageIdentification.identifyLanguage(text)
   .addOnSuccessListener {
       if (it != "und")
           result.value = Language(it)
   }

デバイスでアプリを実行する

Android Studio のツールバーで [実行](execute.png)をクリックします。アプリが読み込まれると、カメラからのテキストの認識と、テキストの言語のリアルタイムでの識別が開始されます。カメラをテキストに向けると、確認できます。

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 の言語から選択できます。

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

学習した内容

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

次の手順

  • 独自の Android アプリで ML Kit と CameraX を使用してみましょう。

詳細