ML Kit を使用してテキストを翻訳する(Android)

ML Kit を使用すると、言語間でテキストを翻訳できます。ML Kit は 50 を超える言語間で翻訳できます。

試してみる

始める前に

  1. プロジェクト レベルの build.gradle ファイルにおいて、buildscript セクションと allprojects セクションの両方に Google の Maven リポジトリを組み込みます。
  2. ML Kit Android ライブラリの依存関係をモジュールのアプリレベルの Gradle ファイル(通常は app/build.gradle)に追加します。
    dependencies {
      // ...
    
      implementation 'com.google.mlkit:translate:17.0.3'
    }

文字列を翻訳する

2 つの言語間で文字列を翻訳するには:

  1. Translator オブジェクトを作成し、ソース言語とターゲット言語で構成します。

    Kotlin

    // Create an English-German translator:
    val options = TranslatorOptions.Builder()
        .setSourceLanguage(TranslateLanguage.ENGLISH)
        .setTargetLanguage(TranslateLanguage.GERMAN)
        .build()
    val englishGermanTranslator = Translation.getClient(options)

    Java

    // Create an English-German translator:
    TranslatorOptions options =
        new TranslatorOptions.Builder()
            .setSourceLanguage(TranslateLanguage.ENGLISH)
            .setTargetLanguage(TranslateLanguage.GERMAN)
            .build();
    final Translator englishGermanTranslator =
        Translation.getClient(options);

    入力テキストの言語がわからない場合は、Language Identification API を使用して言語タグを取得できます。次に、TranslateLanguage.fromLanguageTag() を使用してタグを TranslateLanguage に変換します。

    デバイスに一度に保存する言語モデルが多すぎないようにしてください。

  2. 必要な翻訳モデルがデバイスにダウンロードされていることを確認します。モデルが利用可能になるまで translate() を呼び出さないでください。

    Kotlin

    var conditions = DownloadConditions.Builder()
        .requireWifi()
        .build()
    englishGermanTranslator.downloadModelIfNeeded(conditions)
        .addOnSuccessListener {
            // Model downloaded successfully. Okay to start translating.
            // (Set a flag, unhide the translation UI, etc.)
        }
        .addOnFailureListener { exception ->
            // Model couldn’t be downloaded or other internal error.
            // ...
        }

    Java

    DownloadConditions conditions = new DownloadConditions.Builder()
        .requireWifi()
        .build();
    englishGermanTranslator.downloadModelIfNeeded(conditions)
        .addOnSuccessListener(
            new OnSuccessListener() {
              @Override
              public void onSuccess(Void v) {
                // Model downloaded successfully. Okay to start translating.
                // (Set a flag, unhide the translation UI, etc.)
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Model couldn’t be downloaded or other internal error.
                // ...
              }
            });

    言語モデルのサイズは約 30 MB です。不要なダウンロードは行わないでください。ユーザーが特に指定しない限り、Wi-Fi を使用してダウンロードしてください。不要なモデルも削除してください。翻訳モデルを明示的に管理するをご覧ください。

  3. モデルがダウンロードされたことを確認したら、ソース言語のテキスト文字列を translate() に渡します。

    Kotlin

    englishGermanTranslator.translate(text)
        .addOnSuccessListener { translatedText ->
            // Translation successful.
        }
        .addOnFailureListener { exception ->
             // Error.
             // ...
        }

    Java

    englishGermanTranslator.translate(text)
        .addOnSuccessListener(
            new OnSuccessListener() {
              @Override
              public void onSuccess(@NonNull String translatedText) {
                // Translation successful.
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Error.
                // ...
              }
            });

    構成した対象言語の翻訳されたテキストが、成功リスナーに渡されます。

  4. Translator オブジェクトが使用されなくなったときに、close() メソッドが呼び出されるようにします。

    Fragment または AppCompatActivity で翻訳を使用している場合は、Fragment または AppCompatActivity で LifecycleOwner.getLifecycle() を呼び出し、Lifecycle.addObserver を呼び出すのが簡単な方法です。次に例を示します。

    Kotlin

    val options = ...
    val translator = Translation.getClient(options)
    getLifecycle().addObserver(translator)

    Java

    TranslatorOptions options = ...
    Translator translator = Translation.getClient(options);
    getLifecycle().addObserver(translator);
    ... use translator ...

    ここでは、コードが LifecycleOwner を実装するクラス(Fragment や AppCompatActivity など)内にあることを前提としています。

翻訳モデルを明示的に管理する

上記のように翻訳 API を使用すると、ML Kit は必要に応じて言語固有の翻訳モデルをデバイスに自動的にダウンロードします。ML Kit の翻訳モデル管理 API を使用して、デバイスで利用する翻訳モデルを明示的に管理することもできます。この機能は、モデルを事前にダウンロードする場合や、不要なモデルをデバイスから削除する場合に便利です。

Kotlin

val modelManager = RemoteModelManager.getInstance()

// Get translation models stored on the device.
modelManager.getDownloadedModels(TranslateRemoteModel::class.java)
    .addOnSuccessListener { models ->
        // ...
    }
    .addOnFailureListener {
        // Error.
    }

// Delete the German model if it's on the device.
val germanModel = TranslateRemoteModel.Builder(TranslateLanguage.GERMAN).build()
modelManager.deleteDownloadedModel(germanModel)
    .addOnSuccessListener {
        // Model deleted.
    }
    .addOnFailureListener {
        // Error.
    }

// Download the French model.
val frenchModel = TranslateRemoteModel.Builder(TranslateLanguage.FRENCH).build()
val conditions = DownloadConditions.Builder()
    .requireWifi()
    .build()
modelManager.download(frenchModel, conditions)
    .addOnSuccessListener {
        // Model downloaded.
    }
    .addOnFailureListener {
        // Error.
    }

Java

RemoteModelManager modelManager = RemoteModelManager.getInstance();

// Get translation models stored on the device.
modelManager.getDownloadedModels(TranslateRemoteModel.class)
    .addOnSuccessListener(new OnSuccessListener<Set>() {
        @Override
        public void onSuccess(Set models) {
            // ...
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // Error.
        }
    });

// Delete the German model if it's on the device.
TranslateRemoteModel germanModel =
        new TranslateRemoteModel.Builder(TranslateLanguage.GERMAN).build();
modelManager.deleteDownloadedModel(germanModel)
    .addOnSuccessListener(new OnSuccessListener() {
        @Override
        public void onSuccess(Void v) {
            // Model deleted.
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // Error.
        }
    });

// Download the French model.
TranslateRemoteModel frenchModel =
        new TranslateRemoteModel.Builder(TranslateLanguage.FRENCH).build();
DownloadConditions conditions = new DownloadConditions.Builder()
    .requireWifi()
    .build();
modelManager.download(frenchModel, conditions)
    .addOnSuccessListener(new OnSuccessListener() {
        @Override
        public void onSuccess(Void v) {
            // Model downloaded.
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // Error.
        }
    });