จดจำ ระบุภาษา และแปลข้อความด้วย ML Kit และ CameraX: Android

ML Kit เป็น SDK สําหรับอุปกรณ์เคลื่อนที่ที่นําความเชี่ยวชาญด้านแมชชีนเลิร์นนิงของ Google มาสู่ Android และแอป Android ในแพ็กเกจที่มีประสิทธิภาพแต่ใช้งานง่าย ไม่ว่าคุณจะเพิ่งเริ่มหรือมีประสบการณ์ด้านแมชชีนเลิร์นนิง ก็สามารถใช้ฟังก์ชันการทำงานที่ต้องการได้ง่ายๆ ด้วยโค้ดเพียงไม่กี่บรรทัด คุณไม่จำเป็นต้องมีความรู้เชิงลึกเกี่ยวกับโครงข่ายประสาทหรือการเพิ่มประสิทธิภาพโมเดลเพื่อเริ่มต้นใช้งาน

หลักการทำงาน

ML Kit ช่วยให้การใช้เทคนิค ML ในแอปเป็นเรื่องง่ายด้วยการนำเทคโนโลยี ML ของ Google เช่น Mobile Vision และ TensorFlow Lite มารวมไว้ใน SDK เดียว ไม่ว่าคุณต้องการความสามารถแบบเรียลไทม์ของโมเดลในอุปกรณ์ของ Mobile Vision หรือความยืดหยุ่นของโมเดล TensorFlow Lite ที่กําหนดเอง ML Kit ก็ทําได้โดยใช้โค้ดเพียงไม่กี่บรรทัด

โค้ดแล็บนี้จะแนะนำขั้นตอนง่ายๆ ในการเพิ่มการจดจำข้อความ การระบุภาษา และการแปลจากฟีดกล้องแบบเรียลไทม์ลงในแอป Android ที่มีอยู่ นอกจากนี้ โค้ดแล็บนี้จะไฮไลต์แนวทางปฏิบัติแนะนำเกี่ยวกับการใช้ CameraX กับ ML Kit API ด้วย

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ คุณจะได้สร้างแอป Android ด้วย ML Kit แอปจะใช้ ML Kit Text Recognition on-device API เพื่อจดจำข้อความจากฟีดกล้องแบบเรียลไทม์ โดยจะใช้ ML Kit Language Identification API เพื่อระบุภาษาของข้อความที่จดจำได้ สุดท้าย แอปจะแปลข้อความนี้เป็นภาษาใดก็ได้จาก 59 ภาษาที่เลือกโดยใช้ ML Kit Translation API

สุดท้าย คุณควรเห็นภาพคล้ายกับด้านล่าง

สิ่งที่คุณจะได้เรียนรู้

  • วิธีใช้ ML Kit SDK เพื่อเพิ่มความสามารถด้านแมชชีนเลิร์นนิงลงในแอป Android ได้อย่างง่ายดาย
  • การจดจำข้อความ การระบุภาษา และ Translation API ของ ML Kit รวมถึงความสามารถของ API เหล่านี้
  • วิธีใช้ไลบรารี CameraX กับ ML Kit API

สิ่งที่ต้องมี

  • Android Studio เวอร์ชันล่าสุด (v4.0 ขึ้นไป)
  • อุปกรณ์ Android จริง
  • โค้ดตัวอย่าง
  • ความรู้พื้นฐานเกี่ยวกับการพัฒนาแอป Android ใน Kotlin

Codelab นี้จะเน้นที่ ML Kit เรามีแนวคิดและบล็อกโค้ดที่ไม่เกี่ยวข้องซึ่งติดตั้งใช้งานให้คุณแล้ว

ดาวน์โหลดโค้ด

คลิกลิงก์ต่อไปนี้เพื่อดาวน์โหลดโค้ดทั้งหมดของ Codelab นี้

ดาวน์โหลดซอร์สโค้ด

แตกไฟล์ ZIP ที่ดาวน์โหลด ซึ่งจะแตกไฟล์โฟลเดอร์รูท (mlkit-android) ที่มีทรัพยากรทั้งหมดที่คุณต้องการ สําหรับโค้ดแล็บนี้ คุณจะใช้ได้เฉพาะทรัพยากรในไดเรกทอรีย่อย translate เท่านั้น

ไดเรกทอรีย่อย translate ในที่เก็บ mlkit-android มีไดเรกทอรีต่อไปนี้

  • android_studio_folder.pngstarter - โค้ดเริ่มต้นที่คุณนำไปต่อยอดใน Codelab นี้ได้

ในไฟล์ app/build.gradle ให้ตรวจสอบว่ามีไลบรารี 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'

เมื่อนําเข้าโปรเจ็กต์ไปยัง Android Studio และตรวจสอบรายการที่ต้องใช้ของ ML Kit แล้ว คุณก็พร้อมเรียกใช้แอปเป็นครั้งแรก เริ่มโปรแกรมจำลอง Android Studio แล้วคลิกเรียกใช้ (execute.png) ในแถบเครื่องมือของ Android Studio

แอปควรเปิดขึ้นในอุปกรณ์และคุณสามารถเล็งกล้องไปที่ข้อความต่างๆ เพื่อดูฟีดสดได้ แต่ยังไม่ได้ติดตั้งใช้งานฟังก์ชันการจดจำข้อความ

ในขั้นตอนนี้ เราจะเพิ่มฟังก์ชันการทำงานลงในแอปเพื่อจดจำข้อความจากกล้องวิดีโอ

สร้างอินสแตนซ์ตัวตรวจจับข้อความ ML Kit

เพิ่มช่องต่อไปนี้ที่ด้านบนของ TextAnalyzer.kt วิธีนี้ช่วยให้คุณได้รับแฮนเดิลไปยังโปรแกรมจดจำข้อความเพื่อใช้ในขั้นตอนต่อๆ ไป

TextAnalyzer.kt

private val detector = TextRecognition.getClient()

เรียกใช้การจดจําข้อความในอุปกรณ์บนรูปภาพ Vision ( สร้างด้วยบัฟเฟอร์จากกล้อง)

ไลบรารี CameraX จะให้สตรีมรูปภาพจากกล้องที่พร้อมสําหรับการวิเคราะห์รูปภาพ แทนที่เมธอด recognizeTextOnDevice() ในคลาส TextAnalyzer เพื่อใช้การจดจำข้อความ ML Kit ในเฟรมรูปภาพแต่ละเฟรม

TextAnalyzer.kt

private fun recognizeTextOnDevice(
   image: InputImage
): Task<Text> {
   // Pass image to an ML Kit Vision API
   return detector.process(image)
       .addOnSuccessListener { visionText ->
           // Task completed successfully
           result.value = visionText.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

recognizeTextOnDevice(InputImage.fromBitmap(croppedBitmap, 0)).addOnCompleteListener {
   imageProxy.close()
}

เรียกใช้แอปในอุปกรณ์

จากนั้นคลิกเรียกใช้ (execute.png) ในแถบเครื่องมือของ Android Studio เมื่อโหลดแอปแล้ว แอปจะเริ่มจดจำข้อความจากกล้องแบบเรียลไทม์ เล็งกล้องไปที่ข้อความที่ต้องการเพื่อยืนยัน

สร้างอินสแตนซ์ตัวระบุภาษา ML Kit

เพิ่มช่องต่อไปนี้ลงใน MainViewModel.kt วิธีนี้จะช่วยให้คุณได้รับแฮนเดิลสำหรับตัวระบุภาษาเพื่อใช้ในขั้นตอนถัดไป

MainViewModel.kt

private val languageIdentification = LanguageIdentification.getClient()

เรียกใช้การระบุภาษาในอุปกรณ์กับข้อความที่ตรวจพบ

ใช้ตัวระบุภาษา ML Kit เพื่อดูภาษาของข้อความที่ตรวจพบจากรูปภาพ

แทนที่ TODO ในคำจำกัดความของช่อง sourceLang ใน MainViewModel.kt ด้วยโค้ดต่อไปนี้ ข้อมูลโค้ดนี้เรียกเมธอดการระบุภาษาและกำหนดผลลัพธ์หากไม่ได้กำหนดไว้ ("und")

MainViewModel.kt

languageIdentification.identifyLanguage(text)
   .addOnSuccessListener {
       if (it != "und")
           result.value = Language(it)
   }

เรียกใช้แอปในอุปกรณ์

จากนั้นคลิกเรียกใช้ (execute.png) ในแถบเครื่องมือของ Android Studio เมื่อโหลดแอปแล้ว แอปจะเริ่มจดจำข้อความจากกล้องและระบุภาษาของข้อความแบบเรียลไทม์ เล็งกล้องไปที่ข้อความที่ต้องการเพื่อยืนยัน

แทนที่ฟังก์ชัน 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
   }
}

เรียกใช้แอปในโปรแกรมจำลอง

จากนั้นคลิกเรียกใช้ (execute.png) ในแถบเครื่องมือของ Android Studio เมื่อโหลดแอปแล้ว แอปควรมีลักษณะเหมือนภาพเคลื่อนไหวด้านล่าง ซึ่งแสดงการจดจำข้อความและผลการระบุภาษา รวมถึงข้อความที่แปลเป็นภาษาที่เลือก คุณเลือกภาษาใดก็ได้จาก 59 ภาษา

ขอแสดงความยินดี คุณเพิ่งเพิ่มการจดจำข้อความ การระบุภาษา และการแปลในอุปกรณ์ลงในแอปโดยใช้ ML Kit ตอนนี้คุณสามารถจดจำข้อความและภาษาของข้อความจากฟีดกล้องสด และแปลข้อความเป็นภาษาที่เลือกได้แบบเรียลไทม์

สิ่งที่เราได้พูดถึง

  • วิธีเพิ่ม ML Kit ลงในแอป Android
  • วิธีใช้การจดจำข้อความบนอุปกรณ์ใน ML Kit เพื่อจดจำข้อความในรูปภาพ
  • วิธีใช้การระบุภาษาในอุปกรณ์ใน ML Kit เพื่อระบุภาษาของข้อความ
  • วิธีใช้การแปลในอุปกรณ์ใน ML Kit เพื่อแปลข้อความเป็น 59 ภาษาแบบไดนามิก
  • วิธีใช้ CameraX ร่วมกับ ML Kit API

ขั้นตอนถัดไป

  • ใช้ ML Kit และ CameraX ในแอป Android ของคุณเอง

ดูข้อมูลเพิ่มเติม