ML Kit を使用すると、言語間のテキストを翻訳できます。ML Kit では、50 以上の言語間の翻訳が可能です。
試してみる
- サンプルアプリを試してみると、この API の使用例を確認できます。
始める前に
- Podfile に次の ML Kit Pod を含めます。
pod 'GoogleMLKit/Translate', '3.2.0'
- プロジェクトの Pod をインストールまたは更新したら、
.xcworkspace
を使用して Xcode プロジェクトを開きます。ML Kit は Xcode バージョン 12.4 以降でサポートされています。
文字列を翻訳する
2 つの言語間で文字列を翻訳するには:
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 列挙型に変換しますコードは、使用している言語によって異なります。
- Swift:
TranslateLanguage.fromLanguageTag()
を呼び出してTranslateLanguage
を取得します。 - Objective-C:
MLKTranslateLanguageForLanguageTag()
を呼び出してMLKTranslateLanguage
を取得する
デバイスに一度に保持する言語モデルの数を増やさないようにします。
- Swift:
必要な翻訳モデルがデバイスにダウンロードされていることを確認します。モデルが使用可能になるまで
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 を使用してのみダウンロードしてください。モデルが不要になった場合は削除する必要があります。翻訳モデルを明示的に管理するをご覧ください。
モデルがダウンロードされたことを確認したら、ソース言語のテキスト文字列を
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 は、構成したターゲット言語にテキストを翻訳し、翻訳したテキストを完了ハンドラに渡します。
翻訳者のライフサイクルは、iOS 開発で推奨される規則である ARC(自動参照カウント)によって制御されます。デベロッパーは、強力な参照がすべて削除されると、Translator が割り当て解除されることを期待できます。
翻訳者はメモリに読み込まれると 30 ~ 150 MB を占有することがあります。デベロッパーは、同時翻訳インスタンスを作成するときに、デバイス/アプリのメモリ バジェットに留意し、デバイス上で一度に多数の言語モデルを保持しないようにする必要があります。
翻訳モデルを明示的に管理する
上記のように翻訳 API を使用すると、ML Kit は必要に応じて言語固有の翻訳モデルをデバイスに自動的にダウンロードします。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
と mlkitModelDownloadDidFail
にオブザーバーを登録します。ダウンロードに時間がかかり、ダウンロードが完了するまでに元のオブジェクトが解放される可能性があります。そのため、Observer ブロックでは 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
でダウンロード ステータスを取得する場合は、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]; }];