ML Kit を使用すると、言語間でテキストを翻訳できます。ML Kit では現在、59 言語間の翻訳をサポートしています。
始める前に
- まだアプリに Firebase を追加していない場合は、スタートガイドの手順に沿って追加してください。
- ML Kit ライブラリを Podfile に含めます:
pod 'Firebase/MLNLTranslate', '6.25.0'
プロジェクトの Pod をインストールまたは更新した後に、.xcworkspace
を使用して Xcode プロジェクトを開くようにしてください。 - アプリに Firebase をインポートします。
Swift
import Firebase
Objective-C
@import Firebase;
文字列を翻訳する
2 つの言語間で文字列を翻訳するには:
Translator
オブジェクトを作成し、ソース言語とターゲット言語で構成します。Swift
// Create an English-German translator: let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .de) let englishGermanTranslator = NaturalLanguage.naturalLanguage().translator(options: options)
Objective-C
// Create an English-German translator: FIRTranslatorOptions *options = [[FIRTranslatorOptions alloc] initWithSourceLanguage:FIRTranslateLanguageEN targetLanguage:FIRTranslateLanguageDE]; FIRTranslator *englishGermanTranslator = [[FIRNaturalLanguage naturalLanguage] translatorWithOptions:options];
入力テキストの言語がわからない場合は、まず言語識別 API を使用します(ただし、デバイスに一度に保存する言語モデルが多すぎないように注意してください)。
必要な翻訳モデルがデバイスにダウンロードされていることを確認します。モデルが利用可能になるまで
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
FIRModelDownloadConditions *conditions = [[FIRModelDownloadConditions 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 は構成したターゲット言語の翻訳されたテキストを完了ハンドラに渡します。
翻訳モデルを明示的に管理する
上記のように翻訳 API を使用すると、ML Kit は必要に応じて言語固有の翻訳モデルをデバイスに自動的にダウンロードします。ML Kit の翻訳モデル管理 API を使用して、デバイスで利用する翻訳モデルを明示的に管理することもできます。この機能は、モデルを事前にダウンロードする場合や、不要なモデルをデバイスから削除する場合に便利です。
デバイスに保存された翻訳モデルを取得するには以下を実行します。
Swift
let localModels = ModelManager.modelManager().downloadedTranslateModels
Objective-C
NSSet<FIRTranslateRemoteModel *> *localModels =
[FIRModelManager modelManager].downloadedTranslateModels;
モデルを削除するには以下を実行します。
Swift
// Delete the German model if it's on the device.
let deModel = TranslateRemoteModel.translateRemoteModel(language: .de)
ModelManager.modelManager().deleteDownloadedModel(deModel) { error in
guard error == nil else { return }
// Model deleted.
}
Objective-C
// Delete the German model if it's on the device.
FIRTranslateRemoteModel *deModel =
[FIRTranslateRemoteModel translateRemoteModelWithLanguage:FIRTranslateLanguageDE];
[[FIRModelManager modelManager] deleteDownloadedModel:deModel
completion:^(NSError * _Nullable error) {
if (error != nil) {
return;
}
// Model deleted.
}];
モデルをダウンロードするには以下を実行します。
Swift
// Download the French model.
let frModel = TranslateRemoteModel.translateRemoteModel(language: .fr)
// Keep a reference to the download progress so you can check that the model
// is available before you use it.
progress = ModelManager.modelManager().download(
frModel,
conditions: ModelDownloadConditions(
allowsCellularAccess: false,
allowsBackgroundDownloading: true
)
)
NotificationCenter
でダウンロード ステータスを取得する場合は、firebaseMLModelDownloadDidSucceed
と firebaseMLModelDownloadDidFail
にオブザーバを登録してください。ダウンロードに時間がかかり、ダウンロードが終了するまでに元のオブジェクトが解放される可能性があります。このため、observer ブロックでは self
への弱い参照を使用してください。次に例を示します。
NotificationCenter.default.addObserver(
forName: .firebaseMLModelDownloadDidSucceed,
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 == frModel
else { return }
// The model was downloaded and is available on the device
}
NotificationCenter.default.addObserver(
forName: .firebaseMLModelDownloadDidFail,
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.
FIRModelDownloadConditions *conditions =
[[FIRModelDownloadConditions alloc] initWithAllowsCellularAccess:NO
allowsBackgroundDownloading:YES];
FIRTranslateRemoteModel *frModel =
[FIRTranslateRemoteModel translateRemoteModelWithLanguage:FIRTranslateLanguageFR];
// Keep a reference to the download progress so you can check that the model
// is available before you use it.
self.downloadProgress = [[FIRModelManager modelManager] downloadModel:frModel
conditions:conditions];
NSNotificationCenter
でダウンロード ステータスを取得する場合は、FIRModelDownloadDidSucceedNotification
と FIRModelDownloadDidFailNotification
にオブザーバを登録してください。ダウンロードに時間がかかり、ダウンロードが終了するまでに元のオブジェクトが解放される可能性があります。このため、observer ブロックでは self
への弱い参照を使用してください。
__block MyViewController *weakSelf = self;
[NSNotificationCenter.defaultCenter
addObserverForName:FIRModelDownloadDidSucceedNotification
object:nil
queue:nil
usingBlock:^(NSNotification * _Nonnull note) {
if (weakSelf == nil | note.userInfo == nil) {
return;
}
FIRTranslateRemoteModel *model = note.userInfo[FIRModelDownloadUserInfoKeyRemoteModel];
if ([model isKindOfClass:[FIRTranslateRemoteModel class]]
&& model == frModel) {
// The model was downloaded and is available on the device
}
}];
[NSNotificationCenter.defaultCenter
addObserverForName:FIRModelDownloadDidFailNotification
object:nil
queue:nil
usingBlock:^(NSNotification * _Nonnull note) {
if (weakSelf == nil | note.userInfo == nil) {
return;
}
NSError *error = note.userInfo[FIRModelDownloadUserInfoKeyError];
}];