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

ML Kit를 사용하여 언어 간에 텍스트를 번역할 수 있습니다. ML 키트 여러 단어 간에 번역이 가능합니다 50개 언어

사용해 보기

  • 샘플 앱을 사용하여 이 API의 사용 예를 참조하세요.

시작하기 전에

  1. Podfile에 다음 ML Kit 포드를 포함합니다.
    pod 'GoogleMLKit/Translate', '3.2.0'
    
  2. 프로젝트의 포드를 설치하거나 업데이트한 후 포드를 사용하여 Xcode 프로젝트를 엽니다. .xcworkspace 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];

    입력 텍스트의 언어를 모를 경우 언어 Identification API: 언어 태그가 제공됩니다. 그런 다음 언어 태그를 ML Kit 열거형입니다. 코드는 사용 중인 언어에 따라 다릅니다.

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

  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는 텍스트를 구성된 도착어로 번역하고 는 번역된 텍스트를 완료 핸들러에 전달합니다.

번역사 수명 주기는 ARC (자동 참조 계산)에서 제어하며 이는 iOS 개발에 권장되는 규칙입니다. 개발자는 모든 강력한 참조가 삭제되면 번역사가 할당 해제됩니다.

변환기는 메모리에 로드될 때 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];
 }];