iOS で ML Kit を使用してテキストを翻訳する

ML Kit を使用すると、言語間でテキストを翻訳できます。ML Kit 1 つ以上の言語の間で翻訳できます。 50 言語

試してみる

始める前に

  1. Podfile に次の ML Kit Pod を追加します。
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. プロジェクトの Pod をインストールまたは更新したら、Xcode プロジェクトを開きます。 .xcworkspace。ML Kit は Xcode バージョン 12.4 以降でサポートされています。

テキスト文字列を翻訳する

2 つの言語間で文字列を翻訳するには:

  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 を使用すると、 言語タグが提供されます次に、言語タグを ML Kit の列挙型です。コードは、使用している言語によって異なります。

    一度に多数の言語モデルをデバイスに保持することは避けてください。

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

    言語モデルは約 30 MB であるため、不必要にダウンロードしないでください。 ユーザーが特に指定しない限り、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.
          }];

    ML Kit では、構成したターゲット言語にテキストが翻訳され、 翻訳されたテキストを完了ハンドラに渡します。

翻訳ツールのライフサイクルは、ARC(自動参照カウント)によって制御されます。 これは iOS 開発で推奨される規則です。開発者は 強い参照がすべて削除されると、Translator の割り当てが解除されます。

翻訳者がメモリに読み込む場合、30 MB ~ 150 MB を占有します。開発者は 同時実行インスタンスを作成する際は、デバイス/アプリのメモリ容量を念頭に置く 翻訳者インスタンスを作成し、デバイス上に多くの言語モデルを保持しすぎないようにする できます。

翻訳モデルを明示的に管理する

上記のように Translation API を使用すると、ML Kit は自動的に 必要に応じて言語固有の翻訳モデルをデバイスにダウンロードします。マイページ Google Cloud 上で使用可能な翻訳モデルを明示的に管理することも ML Kit の翻訳モデル管理 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 でダウンロード ステータスを取得するには、登録してください mlkitModelDownloadDidSucceed のオブザーバーと mlkitModelDownloadDidFailself への弱い参照を使用してください ダウンロードに時間がかかります。また、ダウンロードに ダウンロードが完了するまでにオブジェクトを解放できます。例:

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 でダウンロード ステータスを取得するには、登録してください MLKModelDownloadDidSucceedNotification のオブザーバーと MLKModelDownloadDidFailNotification。必ず弱い参照を使用して、 ダウンロードに時間がかかるため、observer ブロックの 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];
 }];