Traduzir texto com o Kit de ML no iOS

É possível usar o Kit de ML para traduzir texto entre idiomas. Kit de ML podem traduzir entre mais de 50 idiomas.

Faça um teste

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 seu 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. Criar um objeto Translator e configurá-lo com a origem e o destino idiomas:

    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 souber o idioma do texto de entrada, use a guia Idioma API Identification que fornece uma tag de idioma. Em seguida, converta a tag de idioma para um tipo enumerado do kit de ML. O código depende da linguagem que você está usando:

    Evite manter muitos modelos de idioma no dispositivo ao mesmo tempo.

  2. Verifique se o modelo de tradução necessário foi baixado 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. Por isso, não faça o download deles desnecessariamente e fazer o download por Wi-Fi, a menos que o usuário tenha especificado o contrário. Você precisa excluir modelos quando não forem mais necessários. Consulte Gerenciar explicitamente modelos de tradução.

  3. Depois de confirmar que o modelo foi baixado, transmita uma string de texto o 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 que você configurou 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 para iOS. Os desenvolvedores podem esperar o tradutor será 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 tenha em mente a cota de memória do dispositivo/app ao criar instâncias instâncias de tradutor e evite manter muitos modelos de idioma no dispositivo de uma só vez.

Gerenciar explicitamente modelos de tradução

Quando você usa a API Translation conforme descrito acima, o Kit de ML automaticamente faz o download de modelos de tradução específicos do idioma para o dispositivo, conforme necessário. Você também pode gerenciar explicitamente os modelos de tradução que você quer 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 acessar 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
    )
)

Para conferir o status de download com NotificationCenter, registre-se observadores para mlkitModelDownloadDidSucceed e mlkitModelDownloadDidFail Use uma referência fraca a self. no bloco de observadores, já que os downloads podem demorar um pouco, e a origem pode 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];

Para conferir o status de download com NSNotificationCenter, registre-se observadores para MLKModelDownloadDidSucceedNotification e MLKModelDownloadDidFailNotification Use uma referência fraca para self no bloco de observadores, já que os downloads podem levar algum tempo, e a O objeto de origem pode 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];
 }];