Android에서 ML Kit를 사용하여 텍스트 번역

ML Kit를 사용하여 언어 간에 텍스트를 번역할 수 있습니다. ML Kit는 50개가 넘는 언어 간에 번역할 수 있습니다.

사용해 보기

  • 샘플 앱을 사용해 이 API의 사용 예를 살펴보세요.

시작하기 전에

  1. 프로젝트 수준 build.gradle 파일의 buildscriptallprojects 섹션에 Google의 Maven 저장소가 포함되어야 합니다.
  2. 모듈의 앱 수준 Gradle 파일(일반적으로 app/build.gradle)에 ML Kit Android 라이브러리의 종속 항목을 추가합니다.
    dependencies {
      // ...
    
      implementation 'com.google.mlkit:translate:17.0.3'
    }

텍스트 문자열 번역

언어 간에 문자열을 번역하는 방법은 다음과 같습니다.

  1. Translator 객체를 만들고 출발어와 도착어를 구성합니다.

    Kotlin

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

    자바

    // 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.
            // ...
        }

    자바

    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.
                // ...
              }
            });

    언어 모델은 약 30MB이므로 필요 이상으로 다운로드하지 마세요. 이때 사용자가 다르게 지정하지 않은 한 Wi-Fi를 사용해서만 다운로드합니다. 불필요한 모델도 삭제해야 합니다. 명시적으로 번역 모델 관리를 참고하세요.

  3. 모델이 다운로드된 것이 확인되었으면 출발어로 작성된 텍스트 문자열을 translate()에 전달합니다.

    Kotlin

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

    자바

    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에서 Translator를 사용하는 경우 쉬운 방법은 Fragment 또는 AppCompatActivity에서 LifecycleOwner.getLifecycle()을 호출한 다음 Lifecycle.addObserver를 호출하는 것입니다. 예를 들면 다음과 같습니다.

    Kotlin

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

    자바

    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.
        }
    });