Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

iOS에서 ML Kit를 사용하여 텍스트 번역

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

ML Kit를 사용하여 언어 간에 텍스트를 번역할 수 있습니다. ML Kit는 현재 59개 언어 간 번역을 지원합니다.

시작하기 전에

  1. 아직 앱에 Firebase를 추가하지 않았다면 시작하기 가이드 의 단계에 따라 추가하세요.
  2. Podfile에 ML Kit 라이브러리 포함:
    pod 'Firebase/MLNLTranslate', '6.25.0'
    
    프로젝트의 Pod를 설치하거나 업데이트한 후 .xcworkspace 를 사용하여 Xcode 프로젝트를 열어야 합니다.
  3. 앱에서 Firebase를 가져옵니다.

    빠른

    import Firebase

    오브젝티브-C

    @import Firebase;

텍스트 문자열 번역

두 언어 간에 문자열을 번역하려면:

  1. 원본 및 대상 언어로 구성하여 Translator 개체를 만듭니다.

    빠른

    // Create an English-German translator:
    let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .de)
    let englishGermanTranslator = NaturalLanguage.naturalLanguage().translator(options: options)
    

    오브젝티브-C

    // Create an English-German translator:
    FIRTranslatorOptions *options =
        [[FIRTranslatorOptions alloc] initWithSourceLanguage:FIRTranslateLanguageEN
                                              targetLanguage:FIRTranslateLanguageDE];
    FIRTranslator *englishGermanTranslator =
        [[FIRNaturalLanguage naturalLanguage] translatorWithOptions:options];
    

    입력 텍스트의 언어를 모르는 경우 먼저 언어 식별 API 를 사용할 수 있습니다. (하지만 장치에 너무 많은 언어 모델을 한 번에 유지하지 않도록 하십시오.)

  2. 필요한 번역 모델이 장치에 다운로드되었는지 확인하십시오. 모델을 사용할 수 있다는 것을 알 때까지 translate(_:completion:) 을 호출하지 마십시오.

    빠른

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

    오브젝티브-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.
    }];
    

    언어 모델은 약 30MB이므로 사용자가 별도로 지정하지 않는 한 불필요하게 다운로드하지 말고 WiFi를 통해서만 다운로드하십시오. 불필요한 모델도 삭제해야 합니다. 명시적으로 번역 모델 관리 를 참조하십시오.

  3. 모델이 다운로드되었음을 확인한 후, 소스 언어로 된 텍스트 문자열을 translate(_:completion:) 에 전달하십시오:

    빠른

    englishGermanTranslator.translate(text) { translatedText, error in
        guard error == nil, let translatedText = translatedText else { return }
    
        // Translation succeeded.
    }
    

    오브젝티브-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를 사용하여 기기에서 사용하려는 번역 모델을 명시적으로 관리할 수도 있습니다. 미리 모델을 다운로드하거나 장치에서 불필요한 모델을 삭제하려는 경우에 유용할 수 있습니다.

기기에 저장된 번역 모델을 가져오려면:

빠른

let localModels = ModelManager.modelManager().downloadedTranslateModels

오브젝티브-C

NSSet<FIRTranslateRemoteModel *> *localModels =
    [FIRModelManager modelManager].downloadedTranslateModels;

모델을 삭제하려면:

빠른

// 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.
}

오브젝티브-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.
                                           }];

모델을 다운로드하려면:

빠른

// 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 로 다운로드 상태를 확인하려면 firebaseMLModelDownloadDidSucceedfirebaseMLModelDownloadDidFail 에 대한 관찰자를 등록하세요. 다운로드에 시간이 걸릴 수 있고 다운로드가 완료될 때 원래 개체가 해제될 수 있으므로 관찰자 블록에서 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]
    // ...
}

오브젝티브-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 로 다운로드 상태를 얻으려면 FIRModelDownloadDidSucceedNotificationFIRModelDownloadDidFailNotification 에 대한 관찰자를 등록하십시오. 다운로드에 시간이 걸릴 수 있고 다운로드가 완료될 때 원래 개체가 해제될 수 있으므로 관찰자 블록에서 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];
 }];