ML Kit を使用すると、言語間でテキストを翻訳できます。ML Kit 1 つ以上の言語の間で翻訳できます。 50 言語。
試してみる
- サンプルアプリを試してみましょう。 この API の使用例をご覧ください
始める前に
- Podfile に次の ML Kit Pod を追加します。
pod 'GoogleMLKit/Translate', '3.2.0'
- プロジェクトの Pod をインストールまたは更新したら、Xcode プロジェクトを開きます。
.xcworkspace
。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 では、構成したターゲット言語にテキストが翻訳され、 翻訳されたテキストを完了ハンドラに渡します。
翻訳ツールのライフサイクルは、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
のオブザーバーと
mlkitModelDownloadDidFail
。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]; }];