1. ข้อควรทราบก่อนที่จะเริ่มต้น
TensorFlow เป็นเฟรมเวิร์กแมชชีนเลิร์นนิงอเนกประสงค์ โดยใช้สําหรับการฝึกโมเดลขนาดใหญ่ในคลัสเตอร์ในระบบคลาวด์ หรือเรียกใช้โมเดลในเครื่องในระบบแบบฝัง เช่น โทรศัพท์
Codelab นี้ใช้ TensorFlow Lite เพื่อเรียกใช้โมเดลการจัดประเภทเสียงในอุปกรณ์ Android
สิ่งที่คุณจะได้เรียนรู้
- วิธีค้นหาโมเดลแมชชีนเลิร์นนิงก่อนการฝึกที่พร้อมใช้งาน
- วิธีการจัดประเภทเสียงในเสียงที่บันทึกแบบเรียลไทม์
- วิธีใช้ไลบรารีสนับสนุน TensorFlow Lite เพื่อประมวลผลอินพุตโมเดลล่วงหน้าและเอาต์พุตโมเดลหลังการประมวลผล
- วิธีใช้ไลบรารีงานเสียงเพื่อทํางานที่เกี่ยวข้องกับเสียงทั้งหมด
สิ่งที่คุณจะสร้าง
แอปจดจําเสียงที่ใช้งานง่ายซึ่งใช้โมเดลการจดจําเสียงของ TensorFlow Lite เพื่อระบุเสียงจากไมโครโฟนแบบเรียลไทม์
สิ่งที่ต้องมี
- Android Studio เวอร์ชันล่าสุด (v4.1.2+)
- อุปกรณ์ Android กายภาพที่ใช้ Android เวอร์ชัน 23 (Android 6.0)
- โค้ดตัวอย่าง
- ความรู้เบื้องต้นเกี่ยวกับการพัฒนา Android ใน Kotlin
2. รับโค้ดตัวอย่าง
ดาวน์โหลดโค้ด
คลิกลิงก์ต่อไปนี้เพื่อดาวน์โหลดโค้ดทั้งหมดสําหรับ Codelab นี้:
คลายการคลายไฟล์ ZIP ที่ดาวน์โหลด การดําเนินการนี้จะเปิดเผยโฟลเดอร์รูท (odml-pathways
) พร้อมทรัพยากรทั้งหมดที่จําเป็น แต่สําหรับ Codelab นี้ คุณจะต้องใช้แหล่งที่มาในไดเรกทอรีย่อยของ audio_classification/codelab1/android
เท่านั้น
หมายเหตุ: คุณโคลนที่เก็บได้หากต้องการ
git clone https://github.com/googlecodelabs/odml-pathways.git
ไดเรกทอรีย่อย android
ในที่เก็บ audio_classification/codelab1/android
จะมีไดเรกทอรี 2 ไดเรกทอรี ดังนี้
- เงื่อนไขเริ่มต้น - โค้ดเริ่มต้นที่สร้างขึ้นสําหรับ Codelab นี้
- final - โค้ดเสร็จสมบูรณ์สําหรับแอปตัวอย่างที่เสร็จสมบูรณ์
นําเข้าแอปเริ่มต้น
มาเริ่มกันด้วยการนําเข้าแอปเริ่มต้นไปยัง Android Studio
- เปิด Android Studio และเลือกนําเข้าโปรเจ็กต์ (Gradle, Eclipse ADT ฯลฯ)
- เปิดโฟลเดอร์
starter
(audio_classification/codelab1/android/starter
) จากซอร์สโค้ดที่คุณดาวน์โหลดไว้ก่อนหน้านี้
หากต้องการตรวจสอบว่าทรัพยากร Dependency ทั้งหมดพร้อมใช้งานในแอป คุณควรซิงค์โปรเจ็กต์กับไฟล์ Gradle เมื่อระบบนําเข้าเสร็จแล้ว
- เลือกซิงค์โปรเจ็กต์กับไฟล์ Gradle ( ) จากแถบเครื่องมือ Android Studio
เรียกใช้แอปเริ่มต้น
หลังจากที่นําเข้าโปรเจ็กต์ไปยัง Android Studio แล้ว คุณก็พร้อมที่จะเรียกใช้แอปเป็นครั้งแรก
เชื่อมต่ออุปกรณ์ Android ผ่าน USB กับคอมพิวเตอร์ แล้วคลิกเรียกใช้ ( ) ในแถบเครื่องมือ Android Studio
3. ค้นหาโมเดลก่อนการฝึก
ในการแยกประเภทเสียง คุณจะต้องใช้โมเดล เริ่มต้นด้วยโมเดลก่อนการฝึก คุณจึงไม่ต้องฝึกด้วยตัวเอง
หากต้องการค้นหาโมเดลก่อนการฝึก ให้ใช้ TensorFlow Hub (www.tfhub.dev)
โมเดลจะได้รับการจัดหมวดหมู่ตามโดเมน ปัจจุบันคุณต้องมาจากโดเมนที่เป็นปัญหาเกี่ยวกับเสียง
สําหรับแอป คุณจะต้องแยกประเภทเหตุการณ์ด้วยโมเดล YAMNet
YAMNet เป็นตัวแยกประเภทเหตุการณ์เสียงที่ใช้รูปแบบคลื่นเสียงเป็นอินพุต และทําการคาดการณ์อิสระต่อเหตุการณ์เสียง 521 เหตุการณ์
โมเดล yamnet/classification ได้แปลงเป็น TensorFlow Lite แล้ว และมีข้อมูลเมตาเฉพาะที่ช่วยให้ไลบรารีงานของ TFLite Task Library สําหรับเสียงใช้โมเดลได้ง่ายขึ้น #39
เลือกแท็บที่ถูกต้อง: TFLite (yamnet/classification/tflite) และคลิกดาวน์โหลด คุณจะเห็นข้อมูลเมตาของโมเดลที่ด้านล่างด้วย
ระบบจะใช้ไฟล์โมเดล (lite-model_yamnet_classification_tflite_1.tflite
) ในขั้นตอนถัดไป
4. นําเข้าโมเดลใหม่ไปยังแอปฐาน
ขั้นตอนแรกคือย้ายโมเดลที่ดาวน์โหลดจากขั้นตอนก่อนหน้าไปยังโฟลเดอร์เนื้อหาในแอป
ใน Android Studio ให้คลิกขวาที่โฟลเดอร์เนื้อหาใน Android Explorer
คุณจะเห็นป๊อปอัปพร้อมรายการตัวเลือก โฟลเดอร์ใดโฟลเดอร์หนึ่งต่อไปนี้จะเปิดโฟลเดอร์ในระบบไฟล์ สําหรับ Mac จะเป็นแสดงใน Finder สําหรับ Windows จะเป็น Open in Explorer และใน Ubuntu จะเป็น Show in Files หาส่วนขยายที่เหมาะสมสําหรับระบบปฏิบัติการของคุณ แล้วเลือกส่วนขยายดังกล่าว
จากนั้นคัดลอกรูปแบบที่ดาวน์โหลดลงในโมเดล
เมื่อคุณดําเนินการข้างต้นแล้ว ให้กลับไปที่ Android Studio คุณจะเห็นไฟล์ในโฟลเดอร์เนื้อหา
5. โหลดโมเดลใหม่ในแอปฐาน
ตอนนี้คุณจะทําตาม TODO บางส่วนและเปิดใช้การจัดประเภทเสียงด้วยโมเดลที่คุณเพิ่งเพิ่มลงในโปรเจ็กต์ในขั้นตอนก่อนหน้า
ไปที่เมนู View > Tool Windows > TODO เพื่อให้พบสิ่งที่ต้องทําใน Android Studio ได้อย่างง่ายดาย จากนั้นหน้าต่างจะเปิดขึ้นพร้อมกับรายการ และคุณสามารถคลิกเพื่อไปยังโค้ดได้โดยตรง
ในไฟล์ build.gradle
(เวอร์ชันโมดูล) คุณจะเห็นงานแรก
สิ่งที่ต้องทํา 1 คือเพิ่มทรัพยากร Dependency ของ Android ดังนี้
implementation 'org.tensorflow:tensorflow-lite-task-audio:0.2.0'
การเปลี่ยนแปลงโค้ดที่เหลือทั้งหมดจะอยู่ใน MainActivity
TODO 2.1 สร้างตัวแปรด้วยชื่อโมเดลเพื่อโหลดในขั้นตอนถัดไป
var modelPath = "lite-model_yamnet_classification_tflite_1.tflite"
TODO 2.2 คุณจะกําหนดเกณฑ์ขั้นต่ําเพื่อยอมรับการคาดคะเนจากโมเดล ระบบจะใช้ตัวแปรนี้ในภายหลัง
var probabilityThreshold: Float = 0.3f
TODO 2.3 คือที่จะโหลดโมเดลจากโฟลเดอร์เนื้อหา คลาส AudioClassifier ที่กําหนดไว้ในไลบรารีงานเสียงเตรียมพร้อมที่จะโหลดโมเดลและให้วิธีการทั้งหมดที่จําเป็นในการเรียกใช้การอนุมาน ตลอดจนช่วยสร้างโปรแกรมอัดเสียง
val classifier = AudioClassifier.createFromFile(this, modelPath)
6. บันทึกเสียง
Audio Tasks API มีวิธีผู้ช่วยที่จะช่วยคุณสร้างโปรแกรมอัดเสียงด้วยการกําหนดค่าที่เหมาะสมสําหรับโมเดล (เช่น อัตราการสุ่มตัวอย่าง อัตราบิต จํานวนช่อง) ซึ่งช่วยให้คุณไม่ต้องหาไฟล์เองและจะสร้างออบเจ็กต์การกําหนดค่าได้ด้วย
TODO 3.1: สร้างตัวแปร Tensor ที่จะจัดเก็บเสียงบันทึกสําหรับการอนุมานและสร้างข้อกําหนดรูปแบบสําหรับโปรแกรมอัดเสียง
val tensor = classifier.createInputTensorAudio()
TODO 3.2: แสดงข้อมูลจําเพาะของโปรแกรมอัดเสียงที่กําหนดโดยข้อมูลเมตาโมเดล #39 ในขั้นตอนก่อนหน้า
val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
"Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs
TODO 3.3: สร้างโปรแกรมอัดเสียงและเริ่มบันทึก
val record = classifier.createAudioRecord()
record.startRecording()
ขณะนี้แอปของคุณกําลังฟังในไมโครโฟนของโทรศัพท์ แต่ ##99 ยังคงไม่อนุมาน คุณจะแก้ไขปัญหานี้ได้ในขั้นตอนถัดไป
7. เพิ่มการอนุมานให้โมเดลของคุณ
ในขั้นตอนนี้ คุณจะต้องเพิ่มโค้ดการอนุมานลงในแอปและแสดงบนหน้าจอ โค้ดนี้มีชุดข้อความตัวจับเวลาที่ดําเนินการทุกครึ่งวินาทีแล้ว และเป็นการอนุมานที่จะเรียกใช้
พารามิเตอร์ของเมธอด scheduleAtFixedRate
คือระยะเวลาที่ระบบจะรอในการดําเนินการและเริ่มเวลาระหว่างการทํางานที่ต่อเนื่องกันในโค้ดด้านล่างทุกๆ 500 มิลลิวินาที
Timer().scheduleAtFixedRate(1, 500) {
...
}
TODO 4.1 เพิ่มโค้ดเพื่อใช้โมเดล ก่อนอื่น ให้โหลดไฟล์บันทึกเสียงลงใน Tensor เสียง แล้วส่งไปยังตัวแยกประเภท โดยทําดังนี้
tensor.load(record)
val output = classifier.classify(tensor)
TODO 4.2 เพื่อให้ได้ผลลัพธ์ที่อนุมานได้ดีขึ้น คุณจะกรองการแยกประเภทที่มีความน่าจะเป็นต่ํามากออกได้ ในที่นี้คุณจะใช้ตัวแปรที่สร้างขึ้นในขั้นตอนก่อนหน้า (probabilityThreshold
) ดังนี้
val filteredModelOutput = output[0].categories.filter {
it.score > probabilityThreshold
}
TODO 4.3: เพื่อช่วยให้อ่านผลลัพธ์ได้ง่ายขึ้น มาสร้างสตริงที่มีผลลัพธ์ที่กรองดังนี้
val outputStr = filteredModelOutput.sortedBy { -it.score }
.joinToString(separator = "\n") { "${it.label} -> ${it.score} " }
TODO 4.4 อัปเดต UI ผลการค้นหาจะแสดงใน TextView ในแอปที่เรียบง่ายมากนี้ เนื่องจากไม่มีการจัดประเภทในชุดข้อความหลัก คุณจึงต้องใช้เครื่องจัดการในการอัปเดตนี้
runOnUiThread {
textView.text = outputStr
}
คุณได้เพิ่มโค้ดทั้งหมดที่จําเป็นในการ
- โหลดโมเดลจากโฟลเดอร์เนื้อหา
- สร้างโปรแกรมอัดเสียงด้วยการกําหนดค่าที่ถูกต้อง
- การอนุมานที่ทํางานอยู่
- แสดงผลลัพธ์ที่ดีที่สุดบนหน้าจอ
สิ่งที่ต้องมีในตอนนี้คือการทดสอบแอป
8. เรียกใช้แอปสุดท้าย
คุณได้ผสานรวมโมเดลการจัดประเภทเสียงเข้ากับแอป แล้วค่อยทดสอบดู
เชื่อมต่ออุปกรณ์ Android แล้วคลิกเรียกใช้ ( ) ในแถบเครื่องมือ Android Studio
ในการดําเนินการแรก คุณจะต้องให้สิทธิ์การบันทึกเสียงของแอป
หลังจากให้สิทธิ์แล้ว แอปเริ่มต้นจะใช้ไมโครโฟนของโทรศัพท์ หากต้องการทดสอบ ให้เริ่มพูดใกล้กับโทรศัพท์เนื่องจากชั้นเรียนหนึ่งที่ YAMNet ตรวจพบการพูด ชั้นเรียนอีกคลาสที่ทดสอบง่ายคือการสแนปหรือตบมือ
นอกจากนี้ คุณยังลองหาเสียงสุนัขเห่าและกิจกรรมอื่นๆ อีกมากมายที่เป็นไปได้ (521) ได้อีกด้วย ดูรายการทั้งหมดได้ที่ซอร์สโค้ด หรือจะอ่านข้อมูลเมตาด้วยไฟล์ป้ายกํากับโดยตรงได้ด้วย
9. ยินดีด้วย
ใน Codelab นี้ คุณจะได้ทราบวิธีค้นหาโมเดลก่อนการฝึกสําหรับการแยกประเภทเสียง และวิธีทําให้โมเดลดังกล่าวในแอปบนอุปกรณ์เคลื่อนที่โดยใช้ TensorFlow Lite ดูข้อมูลเพิ่มเติมเกี่ยวกับ TFLite ได้ที่ตัวอย่าง TFLite
สิ่งที่เราพูดถึง
- วิธีทําให้โมเดล TensorFlow Lite ใช้งานได้ในแอป Android
- วิธีค้นหาและใช้โมเดลจาก TensorFlow Hub
ขั้นตอนถัดไป
- ปรับแต่งโมเดลด้วยข้อมูลของคุณเอง
ดูข้อมูลเพิ่มเติม
- เอกสารประกอบเกี่ยวกับ TensorFlow Lite
- ไลบรารีการสนับสนุนของ TensorFlow Lite
- ไลบรารีงานของ TensorFlow Lite
- เอกสารประกอบเกี่ยวกับ TensorFlow Hub
- แมชชีนเลิร์นนิงในอุปกรณ์ด้วยเทคโนโลยีของ Google