1. บทนำ
ML Kit เป็น SDK สำหรับอุปกรณ์เคลื่อนที่ที่นำความเชี่ยวชาญด้านแมชชีนเลิร์นนิงของ Google มาสู่แอป Android และ Android ในแพ็กเกจที่ทรงพลังแต่ใช้งานง่าย ไม่ว่าคุณจะเป็นมือใหม่หรือมีประสบการณ์ด้านแมชชีนเลิร์นนิง ก็ติดตั้งใช้งานฟังก์ชันที่ต้องการได้ง่ายๆ ด้วยโค้ดเพียงไม่กี่บรรทัด คุณไม่จำเป็นต้องมีความรู้ที่ลึกซึ้งเกี่ยวกับโครงข่ายประสาทหรือการเพิ่มประสิทธิภาพโมเดลเพื่อเริ่มต้นใช้งานเลย
หลักการทำงาน
ML Kit ช่วยให้การใช้เทคนิค ML ในแอปเป็นเรื่องง่ายด้วยการนำเทคโนโลยี ML ของ Google เช่น Mobile Vision และ TensorFlow Lite มาใช้ด้วยกันใน SDK เดียว ไม่ว่าคุณจะต้องการขุมพลังของความสามารถแบบเรียลไทม์ของโมเดลบนอุปกรณ์ของ Mobile Vision หรือความยืดหยุ่นของโมเดล TensorFlow Lite ที่กำหนดเอง ML Kit ก็ทำให้ทุกอย่างเป็นไปได้ด้วยโค้ดเพียงไม่กี่บรรทัด
Codelab นี้จะแนะนำขั้นตอนง่ายๆ ในการเพิ่มการจดจำข้อความ การระบุภาษา และการแปลจากฟีดกล้องแบบเรียลไทม์ลงในแอป Android ที่คุณมีอยู่ Codelab นี้จะไฮไลต์แนวทางปฏิบัติแนะนำเกี่ยวกับการใช้ CameraX กับ ML Kit API ด้วย
สิ่งที่คุณจะสร้าง
ใน Codelab นี้ คุณจะได้สร้างแอป Android ด้วย ML Kit แอปจะใช้ API การรู้จำข้อความในอุปกรณ์ ML Kit เพื่อจดจำข้อความจากฟีดกล้องแบบเรียลไทม์ โดยจะใช้ API การระบุภาษาของ ML Kit เพื่อระบุภาษาของข้อความที่ระบบรู้จัก สุดท้าย แอปจะแปลข้อความนี้เป็นภาษาที่คุณเลือกจาก 59 ตัวเลือก โดยใช้ ML Kit Translation API
ท้ายที่สุดแล้ว คุณจะเห็นสิ่งที่คล้ายกับรูปภาพด้านล่าง
สิ่งที่คุณจะได้เรียนรู้
- วิธีใช้ ML Kit SDK เพื่อเพิ่มความสามารถของแมชชีนเลิร์นนิงในแอป Android ทุกแอป
- ML Kit Text Recognition, การระบุภาษา, Translation API และความสามารถต่างๆ
- วิธีใช้ไลบรารี CameraX กับ ML Kit API
สิ่งที่คุณต้องมี
- Android Studio เวอร์ชันล่าสุด (v4.0+)
- อุปกรณ์ Android จริง
- โค้ดตัวอย่าง
- ความรู้พื้นฐานเกี่ยวกับการพัฒนา Android ใน Kotlin
Codelab นี้มุ่งเน้นไปที่ ML Kit เราได้จัดเตรียมแนวคิดและโค้ดบล็อกที่ไม่เกี่ยวข้องให้คุณแล้ว
2. การตั้งค่า
ดาวน์โหลดโค้ด
คลิกลิงก์ต่อไปนี้เพื่อดาวน์โหลดโค้ดทั้งหมดสำหรับ Codelab นี้:
แตกไฟล์ ZIP ที่ดาวน์โหลด การดำเนินการนี้จะคลายแพ็กโฟลเดอร์รูท (mlkit-android
) ที่มีทรัพยากรทั้งหมดที่คุณต้องใช้ สำหรับ Codelab นี้ คุณจะต้องใช้ทรัพยากรในไดเรกทอรีย่อย translate
เท่านั้น
ไดเรกทอรีย่อย translate
ในที่เก็บ mlkit-android
มีไดเรกทอรีต่อไปนี้
starter - โค้ดเริ่มต้นที่คุณสร้างใน Codelab นี้
3. นำเข้าโปรเจ็กต์และยืนยันทรัพยากร Dependency ของ ML Kit และ CameraX
นำเข้าโปรเจ็กต์เริ่มต้นลงใน Android Studio ในไฟล์ app/build.gradle
ให้ตรวจสอบว่ามีทรัพยากร Dependency ของ ML Kit และ CameraX ที่จำเป็นรวมอยู่ด้วย
// CameraX dependencies
def camerax_version = "1.0.0-beta05"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-view:1.0.0-alpha12"
// ML Kit dependencies
implementation 'com.google.android.gms:play-services-mlkit-text-recognition:16.0.0'
implementation 'com.google.mlkit:language-id:16.0.0'
implementation 'com.google.mlkit:translate:16.0.0'
4. เรียกใช้แอปเริ่มต้น
เมื่อนำเข้าโปรเจ็กต์ไปยัง Android Studio และตรวจสอบทรัพยากร Dependency ของ ML Kit แล้ว คุณก็พร้อมที่จะเรียกใช้แอปเป็นครั้งแรกแล้ว คลิกเรียกใช้ ( ) ในแถบเครื่องมือ Android Studio
แอปควรเปิดในอุปกรณ์ของคุณและคุณจะสามารถเล็งกล้องไปที่ข้อความต่างๆ เพื่อดูฟีดสดได้ แต่ยังไม่ใช้งานฟังก์ชันการจดจำข้อความ
5. เพิ่มการจดจำข้อความ
ในขั้นตอนนี้ เราจะเพิ่มฟังก์ชันลงในแอปเพื่อจดจำข้อความจากกล้องวิดีโอ
ทำให้ตัวตรวจจับข้อความ ML Kit ทำงาน
แทนที่ TODO
ที่ด้านบนของ TextAnalyzer.kt
เพื่อสร้าง TextRecognition
ซึ่งเป็นวิธีนำแฮนเดิลตัวจดจำข้อความมาใช้ในขั้นตอนต่อๆ ไป นอกจากนี้ เรายังต้องเพิ่มตัวตรวจจับเป็นผู้สังเกตการณ์วงจรเพื่อให้ปิดตัวตรวจจับได้อย่างเหมาะสมเมื่อไม่จำเป็นต้องใช้อีกต่อไป
TextAnalyzer.kt
private val detector = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
init {
lifecycle.addObserver(detector)
}
เรียกใช้การจดจำข้อความในรูปภาพอินพุต (สร้างด้วยบัฟเฟอร์จากกล้องถ่ายรูป)
ไลบรารี CameraX จะแสดงสตรีมรูปภาพจากกล้องที่พร้อมสำหรับการวิเคราะห์รูปภาพ แทนที่เมธอด recognizeText()
ในคลาส TextAnalyticsr เพื่อใช้การจดจำข้อความ ML Kit ในแต่ละเฟรมรูปภาพ
TextAnalyzer.kt
private fun recognizeText(
image: InputImage
): Task<Text> {
// Pass image to an ML Kit Vision API
return detector.process(image)
.addOnSuccessListener { text ->
// Task completed successfully
result.value = text.text
}
.addOnFailureListener { exception ->
// Task failed with an exception
Log.e(TAG, "Text recognition error", exception)
val message = getErrorMessage(exception)
message?.let {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
}
}
บรรทัดต่อไปนี้แสดงวิธีการที่เราเรียกว่าวิธีการข้างต้นเพื่อเริ่มต้นการจดจำข้อความ เพิ่มบรรทัดต่อไปนี้ที่ส่วนท้ายของเมธอด analyze()
โปรดทราบว่าคุณต้องเรียกใช้ imageProxy.close
เมื่อการวิเคราะห์รูปภาพเสร็จสมบูรณ์ มิฉะนั้นฟีดกล้องแบบสดจะประมวลผลรูปภาพเพิ่มเติมสำหรับการวิเคราะห์ไม่ได้
TextAnalyzer.kt
recognizeText(InputImage.fromBitmap(croppedBitmap, 0)).addOnCompleteListener {
imageProxy.close()
}
เรียกใช้แอปในอุปกรณ์
จากนั้นคลิกเรียกใช้ ( ) ในแถบเครื่องมือ Android Studio เมื่อแอปโหลดแล้ว แอปจะเริ่มจดจำข้อความจากกล้องแบบเรียลไทม์ เล็งกล้องไปที่ข้อความเพื่อยืนยัน หากแอปไม่จดจำข้อความใดๆ ให้ลอง "รีเซ็ต" ด้วยการเล็งกล้องไปยังพื้นที่ว่างก่อนที่จะเล็งกล้องไปที่ข้อความ
6. เพิ่มการระบุภาษา
สร้างอินสแตนซ์สำหรับตัวระบุภาษา ML Kit
MainViewModel.kt
อยู่ในโฟลเดอร์หลัก ไปยังไฟล์และเพิ่มช่องต่อไปนี้ใน MainViewModel.kt
คุณจะใช้แฮนเดิลตัวระบุภาษาเพื่อนำไปใช้ในขั้นตอนต่อไปนี้ได้ดังนี้
MainViewModel.kt
private val languageIdentifier = LanguageIdentification.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
นอกจากนี้ คุณควรตรวจสอบว่าไคลเอ็นต์ปิดการทำงานอย่างเหมาะสมเมื่อไม่จำเป็นต้องใช้แล้ว หากต้องการดำเนินการนี้ ให้ลบล้างเมธอด onCleared()
ของ ViewModel
MainViewModel.kt
override fun onCleared() {
languageIdentifier.close()
translators.evictAll()
}
เรียกใช้การระบุภาษาในอุปกรณ์ในข้อความที่ตรวจพบ
ใช้ตัวระบุภาษาของ ML Kit เพื่อดูภาษาของข้อความที่ตรวจพบจากรูปภาพ
แทนที่ TODO
ในคำจำกัดความช่อง sourceLang
ใน MainViewModel.kt
ด้วยโค้ดต่อไปนี้ ข้อมูลโค้ดนี้จะเรียกวิธีการระบุภาษาและกำหนดผลลัพธ์หากไม่ได้กำหนด ("und") ภาษาที่ไม่ได้กำหนดหมายความว่า API ไม่สามารถระบุภาษาตามรายการภาษาที่รองรับ
MainViewModel.kt
val sourceLang = Transformations.switchMap(sourceText) { text ->
val result = MutableLiveData<Language>()
languageIdentifier.identifyLanguage(text)
.addOnSuccessListener { languageCode ->
if (languageCode != "und")
result.value = Language(languageCode)
}
result
}
เรียกใช้แอปในอุปกรณ์
จากนั้นคลิกเรียกใช้ ( ) ในแถบเครื่องมือ Android Studio เมื่อแอปโหลดแล้ว แอปจะเริ่มจดจำข้อความจากกล้องและระบุภาษาของข้อความแบบเรียลไทม์ เล็งกล้องไปที่ข้อความเพื่อยืนยัน
7. เพิ่มคำแปล
แทนที่ฟังก์ชัน translate()
ใน MainViewModel.kt
ด้วยรหัสต่อไปนี้ ฟังก์ชันนี้ใช้ค่าภาษาต้นฉบับ ค่าภาษาเป้าหมาย และข้อความต้นฉบับ และดำเนินการแปล โปรดสังเกตว่าหากระบบยังไม่ได้ดาวน์โหลดโมเดลภาษาเป้าหมายที่เลือกลงในอุปกรณ์ เราจะเรียกใช้ downloadModelIfNeeded()
เพื่อดำเนินการแปล จากนั้นจึงดำเนินการแปลต่อ
MainViewModel.kt
private fun translate(): Task<String> {
val text = sourceText.value
val source = sourceLang.value
val target = targetLang.value
if (modelDownloading.value != false || translating.value != false) {
return Tasks.forCanceled()
}
if (source == null || target == null || text == null || text.isEmpty()) {
return Tasks.forResult("")
}
val sourceLangCode = TranslateLanguage.fromLanguageTag(source.code)
val targetLangCode = TranslateLanguage.fromLanguageTag(target.code)
if (sourceLangCode == null || targetLangCode == null) {
return Tasks.forCanceled()
}
val options = TranslatorOptions.Builder()
.setSourceLanguage(sourceLangCode)
.setTargetLanguage(targetLangCode)
.build()
val translator = translators[options]
modelDownloading.setValue(true)
// Register watchdog to unblock long running downloads
Handler().postDelayed({ modelDownloading.setValue(false) }, 15000)
modelDownloadTask = translator.downloadModelIfNeeded().addOnCompleteListener {
modelDownloading.setValue(false)
}
translating.value = true
return modelDownloadTask.onSuccessTask {
translator.translate(text)
}.addOnCompleteListener {
translating.value = false
}
}
เรียกใช้แอปในเครื่องจำลอง
จากนั้นคลิกเรียกใช้ ( ) ในแถบเครื่องมือ Android Studio เมื่อแอปโหลดแล้ว แอปควรมีลักษณะเหมือนรูปภาพเคลื่อนไหวด้านล่างซึ่งแสดงการจดจำข้อความ ผลลัพธ์ภาษาที่ระบุ และข้อความที่แปลเป็นภาษาที่เลือก คุณสามารถเลือกภาษาใดก็ได้จาก 59 ภาษา
8. ยินดีด้วย
ยินดีด้วย คุณเพิ่งเพิ่มการจดจำข้อความในอุปกรณ์ การระบุภาษา และการแปลภาษาในแอปโดยใช้ ML Kit ตอนนี้คุณจะจดจำข้อความและภาษาของข้อความจากฟีดกล้องแบบสด รวมถึงแปลข้อความนี้เป็นภาษาที่คุณเลือกทั้งหมดได้แบบเรียลไทม์แล้ว
หัวข้อที่ครอบคลุม
- วิธีเพิ่ม ML Kit ลงในแอป Android
- วิธีใช้การจดจำข้อความในอุปกรณ์ใน ML Kit เพื่อจดจำข้อความในรูปภาพ
- วิธีใช้การระบุภาษาในอุปกรณ์ใน ML Kit เพื่อระบุภาษาของข้อความ
- วิธีใช้การแปลในอุปกรณ์ใน ML Kit เพื่อแปลข้อความแบบไดนามิกเป็น 59 ภาษา
- วิธีใช้ CameraX ร่วมกับ ML Kit API
ขั้นตอนถัดไป
- ใช้ ML Kit และ CameraX ในแอป Android ของคุณเอง