תרגם טקסט באמצעות ערכת ML ב- iOS

אתה יכול להשתמש ב- ML Kit כדי לתרגם טקסט בין שפות. ML קיט כרגע תומך בתרגום בין 59 שפות .

לפני שאתה מתחיל

  1. אם לא כבר הוסיף Firebase באפליקציה, לעשות זאת על ידי ביצוע השלבים במדריך להפעלה .
  2. כלול את הספריות קיט ML ב Podfile שלך:
    pod 'Firebase/MLNLTranslate', '6.25.0'
    
    לאחר להתקין או לעדכן שקיקים של הפרויקט שלך, להיות בטוח כדי לפתוח פרויקט Xcode שלך באמצעות שלה .xcworkspace .
  3. ייבא את Firebase באפליקציה שלך:

    מָהִיר

    import Firebase

    מטרה-ג

    @import Firebase;

תרגם מחרוזת טקסט

לתרגום מחרוזת בין שתי שפות:

  1. צור Translator אובייקט, מגדיר את זה עם שפות המקור והיעד:

    מָהִיר

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

    מטרה-ג

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

    מטרה-ג

    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 מגה-בייט, לכן אל תורידו אותם שלא לצורך, והורידו אותם רק באמצעות WiFi, אלא אם כן המשתמש ציין אחרת. עליכם למחוק גם דגמים לא נחוצים. ראה מפורש וניהול מודלי תרגום .

  3. לאחר שתאשר את המודל כבר הורד, לעבור שורה של טקסט בשפת המקור כדי translate(_:completion:) :

    מָהִיר

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

    מטרה-ג

    [englishGermanTranslator translateText:text
                                completion:^(NSString *_Nullable translatedText,
                                             NSError *_Nullable error) {
      if (error != nil || translatedText == nil) {
        return;
      }
    
      // Translation succeeded.
    }];
    

    ערכת ML מתרגמת את הטקסט לשפת היעד שהגדרת ומעבירה את הטקסט המתורגם למטפל ההשלמה.

נהל במפורש מודלים של תרגום

כאשר אתה משתמש בממשק ה- API לתרגום כמתואר לעיל, ML Kit מוריד באופן אוטומטי דגמי תרגום ספציפיים לשפה למכשיר בהתאם לצורך. אתה יכול גם לנהל במפורש את מודלי התרגום שאתה רוצה שיהיה זמין במכשיר באמצעות ממשק ה- API לניהול מודלים תרגום של ML Kit. זה יכול להיות שימושי אם ברצונך להוריד דגמים מבעוד מועד, או למחוק דגמים לא נחוצים מהמכשיר.

כדי לשמור את דגמי התרגום המאוחסנים במכשיר:

מָהִיר

let localModels = ModelManager.modelManager().downloadedTranslateModels

מטרה-ג

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

מטרה-ג

// 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 , לרשום משקיפים על firebaseMLModelDownloadDidSucceed ו firebaseMLModelDownloadDidFail . הקפד להשתמש בהתייחסות חלש 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]
    // ...
}

מטרה-ג

// 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 . הקפד להשתמש בהתייחסות חלשה 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];
 }];