คุณใช้ ML Kit เพื่อแปลข้อความระหว่างภาษาได้ ชุดอุปกรณ์ ML สามารถแปลระหว่างคำที่มากกว่า 50 ภาษา
ลองเลย
- ลองใช้แอปตัวอย่างเพื่อ ดูตัวอย่างการใช้ API นี้
ก่อนเริ่มต้น
- ใส่พ็อด ML Kit ต่อไปนี้ใน Podfile
pod 'GoogleMLKit/Translate', '3.2.0'
- หลังจากที่คุณติดตั้งหรืออัปเดตพ็อดของโปรเจ็กต์แล้ว ให้เปิดโปรเจ็กต์ Xcode โดยใช้
.xcworkspace
ทั้งนี้ ML Kit รองรับ Xcode เวอร์ชัน 12.4 ขึ้นไป
แปลสตริงข้อความ
หากต้องการแปลสตริงระหว่าง 2 ภาษา ให้ทำดังนี้
สร้างออบเจ็กต์
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];
หากคุณไม่ทราบภาษาของข้อความที่ป้อน คุณสามารถใช้ภาษา API การระบุ ซึ่ง จะให้แท็กภาษาแก่คุณ แล้วแปลงแท็กภาษาเป็น enum ของ ML Kit โค้ดขึ้นอยู่กับภาษาที่คุณใช้อยู่ ดังนี้
- สวิฟต์: โทรหา
TranslateLanguage.fromLanguageTag()
เพื่อรับTranslateLanguage
- Objective-C: โทรติดต่อ
MLKTranslateLanguageForLanguageTag()
เพื่อขอรับMLKTranslateLanguage
หลีกเลี่ยงการเก็บโมเดลภาษาหลายรายการในอุปกรณ์พร้อมกันมากเกินไป
- สวิฟต์: โทรหา
ตรวจดูว่าได้ดาวน์โหลดโมเดลการแปลที่กำหนดลงในอุปกรณ์แล้ว อย่าโทรหา
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. }];
โมเดลภาษามีขนาดประมาณ 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 แปลข้อความเป็นภาษาเป้าหมายที่คุณกำหนดค่าไว้และ ผ่านข้อความที่แปลไปยังเครื่องจัดการการเสร็จสิ้น
วงจรของนักแปลจะควบคุมโดย ARC (การนับการอ้างอิงอัตโนมัติ) ซึ่งเป็นแบบแผนที่แนะนำสำหรับการพัฒนา iOS นักพัฒนาซอฟต์แวร์สามารถคาดหวังว่า นักแปลที่จะถูกจัดการเมื่อได้นำการอ้างอิงที่สำคัญทั้งหมดออก
นักแปลสามารถใช้พื้นที่ 30MB-150MB เมื่อโหลดในหน่วยความจำ นักพัฒนาซอฟต์แวร์ควร คำนึงถึงงบประมาณหน่วยความจำของอุปกรณ์/แอปอยู่เสมอเมื่อสร้างเครือข่ายพร้อมกัน อินสแตนซ์ของนักแปล และหลีกเลี่ยงการเก็บโมเดลภาษาไว้ในอุปกรณ์มากเกินไป พร้อมกัน
จัดการโมเดลการแปลอย่างชัดแจ้ง
เมื่อคุณใช้ API การแปลตามที่อธิบายไว้ข้างต้น ML Kit จะทำงานโดยอัตโนมัติ ดาวน์โหลดโมเดลการแปลเฉพาะภาษาลงในอุปกรณ์ตามที่จำเป็น คุณ ยังสามารถจัดการโมเดลการแปล ที่คุณต้องการให้มีอยู่ใน โดยใช้ API การจัดการโมเดลการแปลของ ML Kit ได้ ประเภท มีประโยชน์ในกรณีที่คุณต้องการดาวน์โหลดโมเดลล่วงหน้า หรือลบโมเดลที่ไม่จำเป็น จากอุปกรณ์
หากต้องการรับโมเดลการแปลที่จัดเก็บไว้ในอุปกรณ์ ให้ทำดังนี้
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
ให้ลงทะเบียน
ผู้สังเกตการณ์สำหรับmlkitModelDownloadDidSucceed
และ
mlkitModelDownloadDidFail
โปรดใช้การอ้างอิงที่ไม่รัดกุมไปยัง 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
ให้ลงทะเบียน
ผู้สังเกตการณ์สำหรับMLKModelDownloadDidSucceedNotification
และ
MLKModelDownloadDidFailNotification
อย่าลืมใช้การอ้างอิงที่ไม่รัดกุมเพื่อ
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]; }];