在 iOS 系统中使用机器学习套件翻译文本

您可以使用机器学习套件在多种语言之间翻译文本。机器学习套件可以在 50 多种语言之间进行互译。

试试看

准备工作

  1. 在您的 Podfile 中添加以下机器学习套件 Pod:
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. 安装或更新项目的 Pod 之后,请使用 Xcode 项目的 .xcworkspace 来打开项目。Xcode 12.4 版或更高版本支持机器学习套件。

翻译文本字符串

如需在两种语言之间翻译字符串,请执行以下操作:

  1. 创建一个 Translator 对象,并使用源语言和目标语言对其进行配置:

    Swift

        // Create an English-German translator:
        let options = TranslatorOptions(sourceLanguage: .english, targetLanguage: .german)
        let englishGermanTranslator = Translator.translator(options: options)

    Objective-C

        // Create an English-German translator:
        MLKTranslatorOptions *options =
            [[MLKTranslatorOptions alloc] initWithSourceLanguage:MLKTranslateLanguageEnglish
                                                  targetLanguage:MLKTranslateLanguageGerman];
        MLKTranslator *englishGermanTranslator =
            [MLKTranslator translatorwithOptions:options];

    如果您不知道输入文本的语言,可以使用提供语言标记的 Language Identification API。然后,将语言标记转换为机器学习套件枚举。具体代码取决于您使用的语言:

    避免同时在设备上保留过多语言模型。

  2. 确保已将所需的翻译模型下载到设备上。 确定模型可用之后,再调用 translate(_:completion:)

    Swift

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

    Objective-C

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

    语言模型大约为 30MB,因此,如无必要,请勿下载语言模型。除非用户另行指定,否则应仅使用 Wi-Fi 下载语言模型。您应删除不再需要的模型。 请参阅显式管理翻译模型

  3. 确认模型已下载后,将源语言的文本字符串传递给 translate(_:completion:)

    Swift

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

    Objective-C

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

    机器学习套件会将文本翻译为您配置的目标语言,并将译文传递给完成处理程序。

翻译器生命周期由 ARC(自动引用计数)控制,ARC 是 iOS 开发的推荐惯例。移除所有强引用后,开发者将需要解除译者的分配。

译者在内存中加载时可能会占用 30MB-150MB 的内存。创建并发翻译器实例时,开发者应牢记设备/应用的内存预算,并避免同时在设备上保留过多语言模型。

显式管理翻译模型

在您按上述说明使用翻译 API 时,机器学习套件会根据需要自动将特定语言的翻译模型下载到设备上。您还可以使用机器学习套件的翻译模型管理 API 明确管理您希望在设备上提供的翻译模型。如果您想提前下载模型或从设备中删除不需要的模型,这种做法会非常有用。

如需获取设备上存储的翻译模型,请运行以下命令:

Swift

let localModels = ModelManager.modelManager().downloadedTranslateModels

Objective-C

NSSet *localModels =
    [MLKModelManager modelManager].downloadedTranslateModels;

要删除模型,请执行以下操作:

Swift

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

Objective-C

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

如需下载模型,请执行以下操作:

Swift

// Download the French model.
let frenchModel = TranslateRemoteModel.translateRemoteModel(language: .french)

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

如果您要使用 NotificationCenter 获取下载状态,请注册 mlkitModelDownloadDidSucceedmlkitModelDownloadDidFail 的观察者。请务必在观察者块中使用对 self 的弱引用,因为下载可能需要一些时间,并且源对象可以在下载完成时释放。例如:

NotificationCenter.default.addObserver(
    forName: .mlkitModelDownloadDidSucceed,
    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 == frenchModel
        else { return }
    // The model was downloaded and is available on the device
}

NotificationCenter.default.addObserver(
    forName: .mlkitModelDownloadDidFail,
    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]
    // ...
}

Objective-C

// Download the French model.
MLKModelDownloadConditions *conditions =
    [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:NO
                                         allowsBackgroundDownloading:YES];
MLKTranslateRemoteModel *frenchModel =
    [MLKTranslateRemoteModel translateRemoteModelWithLanguage:MLKTranslateLanguageFrench];

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

如果您要使用 NSNotificationCenter 获取下载状态,请注册 MLKModelDownloadDidSucceedNotificationMLKModelDownloadDidFailNotification 的观察者。请务必在观察者块中使用对 self 的弱引用,因为下载可能需要一些时间,并且源对象可以在下载完成时释放。

__block MyViewController *weakSelf = self;

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

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

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

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