Dịch văn bản bằng Bộ công cụ học máy trên Android

Bạn có thể dùng Bộ công cụ học máy để dịch văn bản giữa các ngôn ngữ. Bộ công cụ học máy có thể chuyển đổi giữa nhiều hơn 50 ngôn ngữ.

Dùng thử

Trước khi bắt đầu

  1. Trong tệp build.gradle cấp dự án, hãy nhớ đưa vào Kho lưu trữ Maven của Google trong cả buildscriptallprojects mục.
  2. Thêm các phần phụ thuộc cho thư viện Android Bộ công cụ học máy vào mô-đun của bạn tệp gradle cấp ứng dụng, thường là app/build.gradle:
    dependencies {
      // ...
    
      implementation 'com.google.mlkit:translate:17.0.2'
    }
    

Dịch một chuỗi văn bản

Cách dịch chuỗi văn bản giữa hai ngôn ngữ:

  1. Tạo một Translator định cấu hình đối tượng bằng ngôn ngữ nguồn và ngôn ngữ đích:

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

    Nếu không biết ngôn ngữ của văn bản nhập, bạn có thể sử dụng Ngôn ngữ Nhận dạng API cho bạn một thẻ ngôn ngữ. Sau đó, hãy chuyển đổi thẻ thành TranslateLanguage sử dụng TranslateLanguage.fromLanguageTag().

    Tránh lưu giữ quá nhiều mẫu ngôn ngữ trên thiết bị cùng một lúc.

  2. Đảm bảo bạn đã tải mô hình dịch bắt buộc xuống thiết bị. Không gọi translate() cho đến khi bạn biết mô hình có sẵn.

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

    Mô hình ngôn ngữ khoảng 30MB nên đừng tải xuống những mô hình này khi không cần thiết và chỉ tải chúng xuống qua Wi-Fi trừ phi người dùng đã chỉ định khác. Bạn cũng nên xoá các mô hình không cần thiết. Xem bài viết Quản lý rõ ràng các mô hình dịch.

  3. Sau khi bạn xác nhận mô hình đã được tải xuống, hãy truyền một chuỗi văn bản vào ngôn ngữ gốc để 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.
                // ...
              }
            });

    Văn bản được dịch (bằng ngôn ngữ đích mà bạn đã định cấu hình) sẽ được chuyển đến trình nghe thành công.

  4. Đảm bảo rằng close() được gọi khi Translator thì đối tượng sẽ không được sử dụng nữa.

    Nếu bạn đang sử dụng Trình biên dịch trong một Mảnh hoặc AppCompatActivity, một thao tác đơn giản hãy gọi LifecycleOwner.getLifecycle() trên Fragment hoặc AppCompatActivity, sau đó gọi Lifecycle.addObserver. Ví dụ:

    Kotlin

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

    Java

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

    Hãy lưu ý rằng phương thức này giả định rằng mã nằm trong một lớp triển khai LifecycleOwner (ví dụ: Fragment hoặc AppCompatActivity).

Quản lý các mô hình dịch một cách rõ ràng

Khi bạn sử dụng API dịch như mô tả ở trên, Bộ công cụ học máy sẽ tự động tải các mô hình dịch theo ngôn ngữ cụ thể xuống thiết bị theo yêu cầu. Bạn cũng có thể quản lý rõ ràng các mô hình dịch bạn muốn có sẵn trên bằng cách sử dụng API quản lý mô hình dịch của Bộ công cụ học máy. Thông tin này có thể là hữu ích nếu bạn muốn tải trước các mô hình hoặc xoá các mô hình không cần thiết khỏi thiết bị.

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