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

ML Kit를 사용하면 텍스트를 언어 간에 번역할 수 있습니다. ML Kit는 50개 이상의 언어 간에 번역할 수 있습니다.

사용해 보기

  • 샘플 앱을 살펴보고 이 API의 사용 예를 확인하세요.

시작하기 전에

  1. Podfile에 다음 ML Kit 포드를 추가합니다.
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. 프로젝트의 포드를 설치하거나 업데이트한 후 .xcworkspace를 사용하여 Xcode 프로젝트를 엽니다. ML Kit는 Xcode 버전 12.4 이상에서 지원됩니다.

텍스트 문자열 번역

두 언어 간 문자열을 번역하려면 다음 단계를 따르세요.

  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 enum으로 변환합니다. 코드는 사용 중인 언어에 따라 다릅니다.

    한 번에 너무 많은 언어 모델을 기기에 유지하지 마세요.

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

    언어 모델은 약 30MB이므로 불필요하게 다운로드하지 마세요. 또한 사용자가 별도로 지정하지 않는 한 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는 구성한 도착어로 텍스트를 번역하고 완료 핸들러에 번역된 텍스트를 전달합니다.

번역사 수명 주기는 iOS 개발에 권장되는 규칙인 ARC (자동 참조 집계)로 제어됩니다. 개발자는 강력한 참조가 모두 삭제되면 번역사가 할당 해제될 것으로 예상할 수 있습니다.

번역사는 메모리에 로드될 때 30MB~150MB를 차지할 수 있습니다. 개발자는 동시 번역기 인스턴스를 만들 때 기기/앱의 메모리 예산을 염두에 두고 기기에 한 번에 너무 많은 언어 모델을 유지하지 않아야 합니다.

명시적으로 번역 모델 관리

위에서 설명한 대로 번역 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로 다운로드 상태를 가져오려면 mlkitModelDownloadDidSucceedmlkitModelDownloadDidFail에 관찰자를 등록하세요. 다운로드하는 데 시간이 걸릴 수 있고 다운로드가 완료되면 원래 객체가 해제될 수 있으므로 관찰자 블록의 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로 다운로드 상태를 가져오려면 MLKModelDownloadDidSucceedNotificationMLKModelDownloadDidFailNotification에 관찰자를 등록하세요. 다운로드하는 데 시간이 걸릴 수 있고 다운로드가 완료되면 원래 객체가 해제될 수 있으므로 관찰자 블록의 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];
 }];