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

Bạn có thể sử dụng ML Kit để dịch văn bản giữa các ngôn ngữ. ML Kit hiện hỗ trợ dịch giữa 59 ngôn ngữ .

Trước khi bắt đầu

  1. Nếu bạn chưa thêm Firebase vào ứng dụng của mình, hãy làm như vậy bằng cách làm theo các bước trong hướng dẫn bắt đầu .
  2. Bao gồm các thư viện ML Kit trong Podfile của bạn:
    pod 'Firebase/MLNLTranslate', '6.25.0'
    
    Sau khi bạn cài đặt hoặc cập nhật Pod của dự án, hãy nhớ mở dự án Xcode của bạn bằng cách sử dụng .xcworkspace .
  3. Trong ứng dụng của bạn, hãy nhập Firebase:

    Nhanh

    import Firebase

    Mục tiêu-C

    @import Firebase;

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

Để dịch một chuỗi giữa hai ngôn ngữ:

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

    Nhanh

    // Create an English-German translator:
    let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .de)
    let englishGermanTranslator = NaturalLanguage.naturalLanguage().translator(options: options)
    

    Mục tiêu-C

    // Create an English-German translator:
    FIRTranslatorOptions *options =
        [[FIRTranslatorOptions alloc] initWithSourceLanguage:FIRTranslateLanguageEN
                                              targetLanguage:FIRTranslateLanguageDE];
    FIRTranslator *englishGermanTranslator =
        [[FIRNaturalLanguage naturalLanguage] translatorWithOptions:options];
    

    Nếu bạn không biết ngôn ngữ của văn bản đầu vào, trước tiên bạn có thể sử dụng API nhận dạng ngôn ngữ . (Nhưng hãy đảm bảo bạn không 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 mô hình dịch cần thiết đã được tải xuống thiết bị. Đừng gọi translate(_:completion:) cho đến khi bạn biết mô hình có sẵn.

    Nhanh

    let conditions = ModelDownloadConditions(
        allowsCellularAccess: false,
        allowsBackgroundDownloading: true
    )
    englishGermanTranslator.downloadModelIfNeeded(with: conditions) { error in
        guard error == nil else { return }
    
        // Model downloaded successfully. Okay to start translating.
    }
    

    Mục tiêu-C

    FIRModelDownloadConditions *conditions =
        [[FIRModelDownloadConditions alloc] initWithAllowsCellularAccess:NO
                                             allowsBackgroundDownloading:YES];
    [englishGermanTranslator downloadModelIfNeededWithConditions:conditions
                                                      completion:^(NSError *_Nullable error) {
      if (error != nil) {
        return;
      }
      // Model downloaded successfully. Okay to start translating.
    }];
    

    Các mô hình ngôn ngữ có dung lượng khoảng 30MB, vì vậy đừng tải xuống khi không cần thiết và chỉ tải xuống bằng WiFi, trừ khi người dùng có chỉ định khác. Bạn cũng nên xóa những model không cần thiết. Xem Quản lý rõ ràng các mô hình dịch thuật .

  3. Sau khi bạn xác nhận mô hình đã được tải xuống, hãy chuyển một chuỗi văn bản bằng ngôn ngữ nguồn tới translate(_:completion:) :

    Nhanh

    englishGermanTranslator.translate(text) { translatedText, error in
        guard error == nil, let translatedText = translatedText else { return }
    
        // Translation succeeded.
    }
    

    Mục tiêu-C

    [englishGermanTranslator translateText:text
                                completion:^(NSString *_Nullable translatedText,
                                             NSError *_Nullable error) {
      if (error != nil || translatedText == nil) {
        return;
      }
    
      // Translation succeeded.
    }];
    

    Bộ công cụ ML dịch văn bản sang ngôn ngữ đích mà bạn đã định cấu hình và chuyển văn bản đã dịch sang trình xử lý hoàn thành.

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

Khi bạn sử dụng API dịch như mô tả ở trên, ML Kit 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 mà bạn muốn có trên thiết bị bằng cách sử dụng API quản lý mô hình dịch của ML Kit. Điều này có thể hữu ích nếu bạn muốn tải xuống trước các mô hình hoặc xóa các mô hình không cần thiết khỏi thiết bị.

Để lấy các mô hình dịch được lưu trữ trên thiết bị:

Nhanh

let localModels = ModelManager.modelManager().downloadedTranslateModels

Mục tiêu-C

NSSet<FIRTranslateRemoteModel *> *localModels =
    [FIRModelManager modelManager].downloadedTranslateModels;

Để xóa một mô hình:

Nhanh

// Delete the German model if it's on the device.
let deModel = TranslateRemoteModel.translateRemoteModel(language: .de)
ModelManager.modelManager().deleteDownloadedModel(deModel) { error in
    guard error == nil else { return }
    // Model deleted.
}

Mục tiêu-C

// Delete the German model if it's on the device.
FIRTranslateRemoteModel *deModel =
    [FIRTranslateRemoteModel translateRemoteModelWithLanguage:FIRTranslateLanguageDE];
[[FIRModelManager modelManager] deleteDownloadedModel:deModel
                                           completion:^(NSError * _Nullable error) {
                                               if (error != nil) {
                                                   return;
                                               }
                                               // Model deleted.
                                           }];

Để tải xuống một mô hình:

Nhanh

// Download the French model.
let frModel = TranslateRemoteModel.translateRemoteModel(language: .fr)

// Keep a reference to the download progress so you can check that the model
// is available before you use it.
progress = ModelManager.modelManager().download(
    frModel,
    conditions: ModelDownloadConditions(
        allowsCellularAccess: false,
        allowsBackgroundDownloading: true
    )
)

Nếu bạn muốn nhận trạng thái tải xuống bằng NotificationCenter , hãy đăng ký người quan sát firebaseMLModelDownloadDidSucceedfirebaseMLModelDownloadDidFail . Hãy đảm bảo sử dụng tham chiếu yếu tới self trong khối quan sát, vì quá trình tải xuống có thể mất chút thời gian và đối tượng ban đầu có thể được giải phóng khi quá trình tải xuống kết thúc. Ví dụ:

NotificationCenter.default.addObserver(
    forName: .firebaseMLModelDownloadDidSucceed,
    object: nil,
    queue: nil
) { [weak self] notification in
    guard let strongSelf = self,
        let userInfo = notification.userInfo,
        let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]
            as? TranslateRemoteModel,
        model == frModel
        else { return }
    // The model was downloaded and is available on the device
}

NotificationCenter.default.addObserver(
    forName: .firebaseMLModelDownloadDidFail,
    object: nil,
    queue: nil
) { [weak self] notification in
    guard let strongSelf = self,
        let userInfo = notification.userInfo,
        let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]
            as? TranslateRemoteModel
        else { return }
    let error = userInfo[ModelDownloadUserInfoKey.error.rawValue]
    // ...
}

Mục tiêu-C

// Download the French model.
FIRModelDownloadConditions *conditions =
    [[FIRModelDownloadConditions alloc] initWithAllowsCellularAccess:NO
                                         allowsBackgroundDownloading:YES];
FIRTranslateRemoteModel *frModel =
    [FIRTranslateRemoteModel translateRemoteModelWithLanguage:FIRTranslateLanguageFR];

// Keep a reference to the download progress so you can check that the model
// is available before you use it.
self.downloadProgress = [[FIRModelManager modelManager] downloadModel:frModel
                                                           conditions:conditions];

Nếu bạn muốn nhận trạng thái tải xuống bằng NSNotificationCenter , hãy đăng ký người quan sát cho FIRModelDownloadDidSucceedNotificationFIRModelDownloadDidFailNotification . Hãy đảm bảo sử dụng tham chiếu yếu tới self trong khối quan sát, vì quá trình tải xuống có thể mất chút thời gian và đối tượng ban đầu có thể được giải phóng khi quá trình tải xuống kết thúc.

__block MyViewController *weakSelf = self;

[NSNotificationCenter.defaultCenter
 addObserverForName:FIRModelDownloadDidSucceedNotification
 object:nil
 queue:nil
 usingBlock:^(NSNotification * _Nonnull note) {
     if (weakSelf == nil | note.userInfo == nil) {
         return;
     }

     FIRTranslateRemoteModel *model = note.userInfo[FIRModelDownloadUserInfoKeyRemoteModel];
     if ([model isKindOfClass:[FIRTranslateRemoteModel class]]
         && model == frModel) {
         // The model was downloaded and is available on the device
     }
 }];

[NSNotificationCenter.defaultCenter
 addObserverForName:FIRModelDownloadDidFailNotification
 object:nil
 queue:nil
 usingBlock:^(NSNotification * _Nonnull note) {
     if (weakSelf == nil | note.userInfo == nil) {
         return;
     }

     NSError *error = note.userInfo[FIRModelDownloadUserInfoKeyError];
 }];