Traduzir textos com o Kit de ML no iOS

É possível usar o Kit de ML para traduzir texto entre idiomas. O Kit de ML pode fazer traduções entre mais de 50 idiomas.

Testar

Antes de começar

  1. Inclua os seguintes pods do Kit de ML no seu Podfile:
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. Depois de instalar ou atualizar os pods do projeto, abra o projeto Xcode usando o .xcworkspace. O Kit de ML é compatível com a versão 12.4 ou mais recente do Xcode.

Traduzir uma string de texto

Para traduzir uma string entre dois idiomas:

  1. Crie um objeto Translator, configurando-o com os idiomas de origem e de destino:

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

    Se você não sabe o idioma do texto de entrada, use a API de identificação de idioma, que fornece uma tag de idioma. Depois converta a tag de idioma em um tipo enumerado do Kit de ML. O código depende da linguagem que você está usando:

    Evite manter muitos modelos de linguagem no dispositivo de uma só vez.

  2. Verifique se o modelo de tradução necessário foi transferido por download para o dispositivo. Não chame translate(_:completion:) até saber que o modelo está disponível.

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

    Os modelos de linguagem têm cerca de 30 MB. Portanto, não faça o download deles desnecessariamente e só faça o download por Wi-Fi, a menos que o usuário especifique o contrário. Exclua os modelos quando eles não forem mais necessários. Consulte Gerenciar explicitamente modelos de tradução.

  3. Depois de confirmar que o modelo foi transferido por download, transmita uma string de texto no idioma de origem para 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.
          }];

    O Kit de ML traduz o texto para o idioma de destino configurado e transmite o texto traduzido para o gerenciador de conclusão.

Os ciclos de vida do tradutor são controlados pela contagem automática de referências (ARC, na sigla em inglês), que é a convenção recomendada para o desenvolvimento no iOS. Os desenvolvedores podem esperar que o tradutor seja desalocado depois que todas as referências fortes forem removidas.

Os tradutores podem ocupar de 30 MB a 150 MB quando carregados na memória. Os desenvolvedores precisam considerar a capacidade de memória do dispositivo/app ao criar instâncias de tradutor simultâneas e evitar muitos modelos de idioma no dispositivo ao mesmo tempo.

Gerenciar explicitamente modelos de tradução

Quando você usa a API de tradução, conforme descrito acima, o Kit de ML faz o download automático de modelos de tradução de idiomas específicos para o dispositivo, conforme necessário. Também é possível gerenciar explicitamente os modelos de tradução que você quer disponibilizar no dispositivo usando a API de gerenciamento de modelos de tradução do Kit de ML. Isso pode ser útil se você quiser fazer o download de modelos antecipadamente ou excluir modelos desnecessários do dispositivo.

Para ver os modelos de tradução armazenados no dispositivo:

Swift

let localModels = ModelManager.modelManager().downloadedTranslateModels

Objective-C

NSSet *localModels =
    [MLKModelManager modelManager].downloadedTranslateModels;

Para excluir um modelo:

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.

Para fazer o download de um modelo:

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

Se você quiser saber o status do download com NotificationCenter, registre observadores para mlkitModelDownloadDidSucceed e mlkitModelDownloadDidFail. Use uma referência fraca a self no bloco de observadores, já que os downloads podem levar algum tempo e o objeto de origem poderá ser liberado quando o download for concluído. Exemplo:

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

Se você quiser saber o status do download com NSNotificationCenter, registre observadores para MLKModelDownloadDidSucceedNotification e MLKModelDownloadDidFailNotification. Certifique-se de usar uma referência fraca para self no bloco de observadores, já que os downloads podem levar algum tempo e o objeto de origem poderá ser liberado quando o download for concluído.

__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];
 }];