บทช่วยสอนนี้แสดงวิธีใช้ TensorFlow Lite กับโมเดลการเรียนรู้ของเครื่องที่สร้างไว้ล่วงหน้าเพื่อจดจำเสียงและคำพูดในแอป Android โมเดลการจัดหมวดหมู่เสียงเช่นเดียวกับที่แสดงในบทช่วยสอนนี้สามารถใช้เพื่อตรวจจับกิจกรรม ระบุการกระทำ หรือจดจำคำสั่งเสียงได้
บทช่วยสอนนี้จะแสดงวิธีดาวน์โหลดโค้ดตัวอย่าง โหลดโปรเจ็กต์ลงใน Android Studio และอธิบายส่วนสำคัญของตัวอย่างโค้ดเพื่อให้คุณเริ่มเพิ่มฟังก์ชันนี้ลงในแอปของคุณเองได้ โค้ดแอปตัวอย่างใช้ TensorFlow Task Library for Audio ซึ่งจัดการการบันทึกข้อมูลเสียงและการประมวลผลล่วงหน้าส่วนใหญ่ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการประมวลผลเสียงล่วงหน้าเพื่อใช้กับโมเดลการเรียนรู้ของเครื่อง โปรดดูที่ การเตรียมและเสริมข้อมูลเสียง
การจัดหมวดหมู่เสียงด้วยการเรียนรู้ของเครื่อง
โมเดลการเรียนรู้ของเครื่องในบทช่วยสอนนี้จะจดจำเสียงหรือคำศัพท์จากตัวอย่างเสียงที่บันทึกด้วยไมโครโฟนบนอุปกรณ์ Android แอปตัวอย่างในบทช่วยสอนนี้ช่วยให้คุณสามารถสลับระหว่าง YAMNet/ลักษณนาม โมเดลที่จดจำเสียง และโมเดลที่จดจำคำพูดเฉพาะ ซึ่งได้ รับการฝึกฝน โดยใช้เครื่องมือ TensorFlow Lite Model Maker แบบจำลองคาดการณ์คลิปเสียงที่มีตัวอย่าง 15,600 ตัวอย่างต่อคลิป และมีความยาวประมาณ 1 วินาที
ตัวอย่างการติดตั้งและรัน
สำหรับส่วนแรกของบทช่วยสอนนี้ คุณจะดาวน์โหลดตัวอย่างจาก GitHub และเรียกใช้โดยใช้ Android Studio ส่วนต่อไปนี้ของบทช่วยสอนนี้จะสำรวจส่วนที่เกี่ยวข้องของตัวอย่าง เพื่อให้คุณสามารถนำไปใช้กับแอป Android ของคุณเองได้
ความต้องการของระบบ
- Android Studio เวอร์ชัน 2021.1.1 (Bumblebee) หรือสูงกว่า
- Android SDK เวอร์ชัน 31 ขึ้นไป
- อุปกรณ์ Android ที่มีระบบปฏิบัติการเวอร์ชันขั้นต่ำ SDK 24 (Android 7.0 - Nougat) พร้อมเปิดใช้งานโหมดนักพัฒนาซอฟต์แวร์
รับโค้ดตัวอย่าง
สร้างสำเนาโค้ดตัวอย่างในเครื่อง คุณจะใช้โค้ดนี้เพื่อสร้างโปรเจ็กต์ใน Android Studio และเรียกใช้แอปพลิเคชันตัวอย่าง
หากต้องการโคลนและตั้งค่าโค้ดตัวอย่าง:
- โคลนที่เก็บ git
git clone https://github.com/tensorflow/examples.git
คุณสามารถเลือกกำหนดค่าอินสแตนซ์ git ของคุณเพื่อใช้การชำระเงินแบบกระจัดกระจาย เพื่อให้คุณมีเฉพาะไฟล์สำหรับแอปตัวอย่างเท่านั้น:
cd examples git sparse-checkout init --cone git sparse-checkout set lite/examples/audio_classification/android
นำเข้าและรันโครงการ
สร้างโปรเจ็กต์จากโค้ดตัวอย่างที่ดาวน์โหลด สร้างโปรเจ็กต์ จากนั้นรัน
หากต้องการนำเข้าและสร้างโปรเจ็กต์โค้ดตัวอย่าง:
- เริ่ม Android สตูดิโอ
- ใน Android Studio ให้เลือก ไฟล์ > ใหม่ > นำเข้าโครงการ
- นำทางไปยังไดเร็กทอรีโค้ดตัวอย่างที่มีไฟล์
build.gradle
(.../examples/lite/examples/audio_classification/android/build.gradle
) และเลือกไดเร็กทอรีนั้น
หากคุณเลือกไดเร็กทอรีที่ถูกต้อง Android Studio จะสร้างโปรเจ็กต์ใหม่และสร้างมันขึ้นมา กระบวนการนี้อาจใช้เวลาสักครู่ ขึ้นอยู่กับความเร็วของคอมพิวเตอร์ และหากคุณใช้ Android Studio สำหรับโปรเจ็กต์อื่นหรือไม่ เมื่อการสร้างเสร็จสมบูรณ์ Android Studio จะแสดงข้อความ BUILD SUCCESSFUL
ในแผงสถานะ Build Output
ในการดำเนินโครงการ:
- จาก Android Studio ให้รันโปรเจ็กต์โดยเลือก Run > Run 'app'
- เลือกอุปกรณ์ Android ที่เชื่อมต่อพร้อมไมโครโฟนเพื่อทดสอบแอป
ส่วนถัดไปจะแสดงให้คุณเห็นการแก้ไขที่คุณต้องทำกับโปรเจ็กต์ที่มีอยู่เพื่อเพิ่มฟังก์ชันการทำงานนี้ให้กับแอปของคุณเอง โดยใช้แอปตัวอย่างนี้เป็นจุดอ้างอิง
เพิ่มการพึ่งพาโครงการ
ในแอปพลิเคชันของคุณเอง คุณต้องเพิ่มการพึ่งพาโปรเจ็กต์เฉพาะเพื่อรันโมเดลแมชชีนเลิร์นนิงของ TensorFlow Lite และเข้าถึงฟังก์ชันยูทิลิตี้ที่แปลงรูปแบบข้อมูลมาตรฐาน เช่น เสียง ให้เป็นรูปแบบข้อมูลเทนเซอร์ที่โมเดลที่คุณใช้ประมวลผลได้
แอปตัวอย่างใช้ไลบรารี TensorFlow Lite ต่อไปนี้:
- Audio API ของไลบรารีงาน TensorFlow Lite - จัดเตรียมคลาสอินพุตข้อมูลเสียงที่จำเป็น การดำเนินการของโมเดล Machine Learning และผลลัพธ์เอาต์พุตจากการประมวลผลโมเดล
คำแนะนำต่อไปนี้แสดงวิธีเพิ่มการพึ่งพาโปรเจ็กต์ที่จำเป็นให้กับโปรเจ็กต์แอป Android ของคุณเอง
ในการเพิ่มการพึ่งพาโมดูล:
ในโมดูลที่ใช้ TensorFlow Lite ให้อัปเดตไฟล์
build.gradle
ของโมดูลเพื่อรวมการอ้างอิงต่อไปนี้ ในโค้ดตัวอย่าง ไฟล์นี้อยู่ที่นี่:.../examples/lite/examples/audio_classification/android/build.gradle
dependencies { ... implementation 'org.tensorflow:tensorflow-lite-task-audio' }
ใน Android Studio ให้ซิงค์การขึ้นต่อกันของโปรเจ็กต์โดยเลือก: ไฟล์ > ซิงค์โปรเจ็กต์กับไฟล์ Gradle
เริ่มต้นโมเดล ML
ในแอป Android คุณต้องเริ่มต้นโมเดลแมชชีนเลิร์นนิง TensorFlow Lite ด้วยพารามิเตอร์ก่อนที่จะเรียกใช้การคาดการณ์ด้วยโมเดล พารามิเตอร์การเริ่มต้นเหล่านี้ขึ้นอยู่กับรุ่นและอาจรวมถึงการตั้งค่า เช่น เกณฑ์ความแม่นยำขั้นต่ำที่เป็นค่าเริ่มต้นสำหรับการคาดคะเน และป้ายกำกับสำหรับคำหรือเสียงที่โมเดลสามารถจดจำได้
โมเดล TensorFlow Lite มีไฟล์ *.tflite
ที่มีโมเดลดังกล่าว ไฟล์โมเดลประกอบด้วยตรรกะการทำนาย และโดยทั่วไปจะมี ข้อมูลเมตา เกี่ยวกับวิธีตีความผลลัพธ์การทำนาย เช่น ชื่อคลาสการทำนาย ไฟล์โมเดลควรเก็บไว้ในไดเร็กทอรี src/main/assets
ของโปรเจ็กต์การพัฒนาของคุณ ดังตัวอย่างโค้ด:
-
<project>/src/main/assets/yamnet.tflite
เพื่อความสะดวกและความสามารถในการอ่านโค้ด ตัวอย่างจะประกาศออบเจ็กต์ที่แสดงร่วมกันซึ่งกำหนดการตั้งค่าสำหรับโมเดล
ในการเริ่มต้นโมเดลในแอปของคุณ:
สร้างออบเจ็กต์ที่แสดงร่วมเพื่อกำหนดการตั้งค่าสำหรับโมเดล:
companion object { const val DISPLAY_THRESHOLD = 0.3f const val DEFAULT_NUM_OF_RESULTS = 2 const val DEFAULT_OVERLAP_VALUE = 0.5f const val YAMNET_MODEL = "yamnet.tflite" const val SPEECH_COMMAND_MODEL = "speech.tflite" }
สร้างการตั้งค่าสำหรับโมเดลโดยการสร้างออบเจ็กต์
AudioClassifier.AudioClassifierOptions
:val options = AudioClassifier.AudioClassifierOptions.builder() .setScoreThreshold(classificationThreshold) .setMaxResults(numOfResults) .setBaseOptions(baseOptionsBuilder.build()) .build()
ใช้ออบเจ็กต์การตั้งค่านี้เพื่อสร้างออบเจ็กต์ TensorFlow Lite
AudioClassifier
ที่มีโมเดล:classifier = AudioClassifier.createFromFileAndOptions(context, "yamnet.tflite", options)
เปิดใช้งานการเร่งด้วยฮาร์ดแวร์
เมื่อเริ่มต้นโมเดล TensorFlow Lite ในแอปของคุณ คุณควรพิจารณาใช้ฟีเจอร์การเร่งด้วยฮาร์ดแวร์เพื่อเพิ่มความเร็วในการคำนวณการคาดการณ์ของโมเดล ผู้ร่วมประชุม TensorFlow Lite คือโมดูลซอฟต์แวร์ที่เร่งการดำเนินการโมเดลการเรียนรู้ของเครื่องโดยใช้ฮาร์ดแวร์การประมวลผลเฉพาะทางบนอุปกรณ์เคลื่อนที่ เช่น หน่วยประมวลผลกราฟิก (GPU) หรือหน่วยประมวลผลเทนเซอร์ (TPU) ตัวอย่างโค้ดใช้ NNAPI Delegate เพื่อจัดการการเร่งด้วยฮาร์ดแวร์ของการดำเนินการโมเดล:
val baseOptionsBuilder = BaseOptions.builder()
.setNumThreads(numThreads)
...
when (currentDelegate) {
DELEGATE_CPU -> {
// Default
}
DELEGATE_NNAPI -> {
baseOptionsBuilder.useNnapi()
}
}
แนะนำให้ใช้ผู้รับมอบสิทธิ์เพื่อเรียกใช้โมเดล TensorFlow Lite แต่ไม่จำเป็น สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ผู้ร่วมประชุมกับ TensorFlow Lite โปรดดูที่ TensorFlow Lite Delegates
เตรียมข้อมูลสำหรับโมเดล
ในแอป Android โค้ดของคุณจะให้ข้อมูลแก่โมเดลสำหรับการตีความโดยการแปลงข้อมูลที่มีอยู่ เช่น คลิปเสียง ให้เป็นรูปแบบข้อมูล Tensor ที่โมเดลของคุณสามารถประมวลผลได้ ข้อมูลในเทนเซอร์ที่คุณส่งไปยังโมเดลจะต้องมีขนาดหรือรูปร่างเฉพาะที่ตรงกับรูปแบบของข้อมูลที่ใช้ในการฝึกโมเดล
โมเดล YAMNet/ลักษณนาม และโมเดล คำสั่งคำพูด แบบกำหนดเองที่ใช้ในตัวอย่างโค้ดนี้ยอมรับออบเจ็กต์ข้อมูลเทนเซอร์ที่แสดงถึงคลิปเสียงช่องเดียวหรือโมโนที่บันทึกที่ 16kHz ในคลิป 0.975 วินาที (ตัวอย่าง 15600 ตัวอย่าง) เมื่อใช้การคาดการณ์ข้อมูลเสียงใหม่ แอปของคุณจะต้องแปลงข้อมูลเสียงนั้นเป็นออบเจ็กต์ข้อมูล Tensor ที่มีขนาดและรูปร่างดังกล่าว API เสียง ของไลบรารีงาน TensorFlow Lite จัดการการเปลี่ยนแปลงข้อมูลให้กับคุณ
ในโค้ดตัวอย่างคลาส AudioClassificationHelper
แอปบันทึกเสียงสดจากไมโครโฟนของอุปกรณ์โดยใช้วัตถุ Android AudioRecord รหัสนี้ใช้ AudioClassifier เพื่อสร้างและกำหนดค่าออบเจ็กต์นั้นให้บันทึกเสียงที่อัตราการสุ่มตัวอย่างที่เหมาะสมสำหรับโมเดล โค้ดยังใช้ AudioClassifier เพื่อสร้างออบเจ็กต์ TensorAudio เพื่อจัดเก็บข้อมูลเสียงที่แปลงแล้ว จากนั้นออบเจ็กต์ TensorAudio จะถูกส่งไปยังโมเดลเพื่อการวิเคราะห์
หากต้องการให้ข้อมูลเสียงแก่โมเดล ML:
ใช้วัตถุ
AudioClassifier
เพื่อสร้างวัตถุTensorAudio
และวัตถุAudioRecord
:fun initClassifier() { ... try { classifier = AudioClassifier.createFromFileAndOptions(context, currentModel, options) // create audio input objects tensorAudio = classifier.createInputTensorAudio() recorder = classifier.createAudioRecord() }
เรียกใช้การคาดการณ์
ในแอป Android เมื่อคุณเชื่อมต่อออบเจ็กต์ AudioRecord และออบเจ็กต์ TensorAudio กับออบเจ็กต์ AudioClassifier แล้ว คุณสามารถเรียกใช้โมเดลกับข้อมูลนั้นเพื่อสร้างการคาดคะเนหรือ การอนุมานได้ โค้ดตัวอย่างสำหรับบทช่วยสอนนี้เรียกใช้การคาดคะเนคลิปจากสตรีมอินพุตเสียงที่บันทึกสดในอัตราที่กำหนด
การดำเนินการกับโมเดลใช้ทรัพยากรจำนวนมาก ดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องรันการคาดการณ์โมเดล ML บนเธรดเบื้องหลังที่แยกต่างหาก แอปตัวอย่างใช้อ [ScheduledThreadPoolExecutor](https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor)
เพื่อแยกการประมวลผลโมเดลออกจากฟังก์ชันอื่นๆ ของแอป
โมเดลการจัดหมวดหมู่เสียงที่จดจำเสียงที่มีจุดเริ่มต้นและจุดสิ้นสุดที่ชัดเจน เช่น คำต่างๆ สามารถสร้างการคาดคะเนสตรีมเสียงขาเข้าที่แม่นยำยิ่งขึ้นโดยการวิเคราะห์คลิปเสียงที่ทับซ้อนกัน วิธีการนี้ช่วยให้โมเดลหลีกเลี่ยงการคาดคะเนคำที่ถูกตัดออกในตอนท้ายของคลิปพลาด ในแอพตัวอย่าง แต่ละครั้งที่คุณรันการทำนาย โค้ดจะดึงคลิป 0.975 วินาทีล่าสุดจากบัฟเฟอร์การบันทึกเสียงและวิเคราะห์ คุณสามารถทำให้โมเดลวิเคราะห์คลิปเสียงที่ทับซ้อนกันได้โดยตั้งค่า interval
พูลการดำเนินการเธรดการวิเคราะห์โมเดลให้มีความยาวที่สั้นกว่าความยาวของคลิปที่กำลังวิเคราะห์ ตัวอย่างเช่น หากโมเดลของคุณวิเคราะห์คลิป 1 วินาทีและคุณตั้งค่าช่วงเวลาเป็น 500 มิลลิวินาที โมเดลจะวิเคราะห์ครึ่งหลังของคลิปก่อนหน้าและข้อมูลเสียงใหม่ 500 มิลลิวินาทีในแต่ละครั้ง ทำให้เกิดการวิเคราะห์คลิปที่ทับซ้อนกัน 50%
หากต้องการเริ่มใช้การคาดคะเนข้อมูลเสียง:
ใช้เมธอด
AudioClassificationHelper.startAudioClassification()
เพื่อเริ่มการบันทึกเสียงสำหรับโมเดล:fun startAudioClassification() { if (recorder.recordingState == AudioRecord.RECORDSTATE_RECORDING) { return } recorder.startRecording() }
ตั้งค่าความถี่ที่โมเดลสร้างการอนุมานจากคลิปเสียงโดยการตั้ง
interval
อัตราคงที่ในออบเจ็กต์ScheduledThreadPoolExecutor
:executor = ScheduledThreadPoolExecutor(1) executor.scheduleAtFixedRate( classifyRunnable, 0, interval, TimeUnit.MILLISECONDS)
อ็อบเจ็กต์
classifyRunnable
ในโค้ดด้านบนดำเนินการเมธอดAudioClassificationHelper.classifyAudio()
ซึ่งจะโหลดข้อมูลเสียงล่าสุดที่มีอยู่จากเครื่องบันทึกและดำเนินการทำนาย:private fun classifyAudio() { tensorAudio.load(recorder) val output = classifier.classify(tensorAudio) ... }
หยุดการประมวลผลการคาดการณ์
ตรวจสอบให้แน่ใจว่าโค้ดของแอปของคุณหยุดการจัดหมวดหมู่เสียงเมื่อส่วนหรือกิจกรรมการประมวลผลเสียงของแอปของคุณสูญเสียโฟกัส การใช้โมเดลแมชชีนเลิร์นนิงอย่างต่อเนื่องมีผลกระทบอย่างมากต่ออายุการใช้งานแบตเตอรี่ของอุปกรณ์ Android ใช้เมธอด onPause()
ของกิจกรรม Android หรือส่วนที่เกี่ยวข้องกับการจัดหมวดหมู่เสียงเพื่อหยุดการประมวลผลเสียงและการทำนาย
หากต้องการหยุดการบันทึกและการจัดหมวดหมู่เสียง:
ใช้เมธอด
AudioClassificationHelper.stopAudioClassification()
เพื่อหยุดการบันทึกและการดำเนินการโมเดล ดังที่แสดงด้านล่างในคลาสAudioFragment
:override fun onPause() { super.onPause() if (::audioHelper.isInitialized ) { audioHelper.stopAudioClassification() } }
จัดการเอาต์พุตโมเดล
ในแอป Android ของคุณ หลังจากที่คุณประมวลผลคลิปเสียงแล้ว โมเดลจะสร้างรายการการคาดการณ์ที่โค้ดของแอปต้องจัดการโดยดำเนินการตรรกะทางธุรกิจเพิ่มเติม แสดงผลลัพธ์ต่อผู้ใช้ หรือดำเนินการอื่นๆ ผลลัพธ์ของโมเดล TensorFlow Lite ใดๆ จะแตกต่างกันไปในแง่ของจำนวนการคาดการณ์ที่สร้างขึ้น (หนึ่งรายการหรือหลายรายการ) และข้อมูลเชิงอธิบายสำหรับการคาดการณ์แต่ละรายการ ในกรณีของโมเดลในแอปตัวอย่าง การคาดคะเนอาจเป็นรายการเสียงหรือคำศัพท์ที่รู้จัก ออบเจ็กต์ตัวเลือก AudioClassifier ที่ใช้ในตัวอย่างโค้ดช่วยให้คุณตั้งค่าจำนวนการคาดคะเนสูงสุดด้วยวิธี setMaxResults()
ดังที่แสดงในส่วน เตรียมใช้งานโมเดล ML
หากต้องการรับผลลัพธ์การทำนายจากแบบจำลอง:
รับผลลัพธ์ของ
classify()
วิธีการของออบเจ็ กต์ AudioClassifier และส่งต่อไปยังออบเจ็กต์ Listener (การอ้างอิงโค้ด):private fun classifyAudio() { ... val output = classifier.classify(tensorAudio) listener.onResult(output[0].categories, inferenceTime) }
ใช้ฟังก์ชัน onResult() ของผู้ฟังเพื่อจัดการเอาต์พุตโดยดำเนินการตรรกะทางธุรกิจหรือแสดงผลลัพธ์แก่ผู้ใช้:
private val audioClassificationListener = object : AudioClassificationListener { override fun onResult(results: List<Category>, inferenceTime: Long) { requireActivity().runOnUiThread { adapter.categoryList = results adapter.notifyDataSetChanged() fragmentAudioBinding.bottomSheetLayout.inferenceTimeVal.text = String.format("%d ms", inferenceTime) } }
แบบจำลองที่ใช้ในตัวอย่างนี้จะสร้างรายการการคาดคะเนพร้อมป้ายกำกับสำหรับเสียงหรือคำที่จัดประเภท และคะแนนการทำนายระหว่าง 0 ถึง 1 เป็นการลอยตัวที่แสดงถึงความเชื่อมั่นของการทำนาย โดย 1 คือระดับความเชื่อมั่นสูงสุด โดยทั่วไป การทำนายที่มีคะแนนต่ำกว่า 50% (0.5) ถือว่าไม่สามารถสรุปได้ อย่างไรก็ตาม วิธีที่คุณจัดการกับผลลัพธ์การคาดการณ์ที่มีค่าต่ำนั้นขึ้นอยู่กับคุณและความต้องการของแอปพลิเคชันของคุณ
เมื่อแบบจำลองส่งคืนชุดผลลัพธ์การคาดการณ์แล้ว แอปพลิเคชันของคุณสามารถดำเนินการตามการคาดการณ์เหล่านั้นได้โดยการนำเสนอผลลัพธ์แก่ผู้ใช้ของคุณหรือดำเนินการตรรกะเพิ่มเติม ในกรณีของโค้ดตัวอย่าง แอปพลิเคชันจะแสดงรายการเสียงหรือคำที่ระบุในส่วนติดต่อผู้ใช้ของแอป
ขั้นตอนถัดไป
คุณสามารถค้นหาโมเดล TensorFlow Lite เพิ่มเติมสำหรับการประมวลผลเสียงได้ใน TensorFlow Hub และผ่านหน้า คำแนะนำเกี่ยวกับโมเดลก่อนการฝึก สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการนำแมชชีนเลิร์นนิงไปใช้ในแอปพลิเคชันมือถือของคุณด้วย TensorFlow Lite โปรดดู คู่มือนักพัฒนา TensorFlow Lite