สร้างแอปพื้นฐานสําหรับการแยกประเภทเสียง

1. ข้อควรทราบก่อนที่จะเริ่มต้น

TensorFlow เป็นเฟรมเวิร์กแมชชีนเลิร์นนิงอเนกประสงค์ โดยใช้สําหรับการฝึกโมเดลขนาดใหญ่ในคลัสเตอร์ในระบบคลาวด์ หรือเรียกใช้โมเดลในเครื่องในระบบแบบฝัง เช่น โทรศัพท์

Codelab นี้ใช้ TensorFlow Lite เพื่อเรียกใช้โมเดลการจัดประเภทเสียงในอุปกรณ์ Android

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

  • วิธีค้นหาโมเดลแมชชีนเลิร์นนิงก่อนการฝึกที่พร้อมใช้งาน
  • วิธีการจัดประเภทเสียงในเสียงที่บันทึกแบบเรียลไทม์
  • วิธีใช้ไลบรารีสนับสนุน TensorFlow Lite เพื่อประมวลผลอินพุตโมเดลล่วงหน้าและเอาต์พุตโมเดลหลังการประมวลผล
  • วิธีใช้ไลบรารีงานเสียงเพื่อทํางานที่เกี่ยวข้องกับเสียงทั้งหมด

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

แอปจดจําเสียงที่ใช้งานง่ายซึ่งใช้โมเดลการจดจําเสียงของ TensorFlow Lite เพื่อระบุเสียงจากไมโครโฟนแบบเรียลไทม์

33af0fdb0a027fa8.png

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

  • 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 ไดเรกทอรี ดังนี้

  • android_studio_folder.เงื่อนไขเริ่มต้น - โค้ดเริ่มต้นที่สร้างขึ้นสําหรับ Codelab นี้
  • android_studio_folder.final - โค้ดเสร็จสมบูรณ์สําหรับแอปตัวอย่างที่เสร็จสมบูรณ์

นําเข้าแอปเริ่มต้น

มาเริ่มกันด้วยการนําเข้าแอปเริ่มต้นไปยัง Android Studio

  1. เปิด Android Studio และเลือกนําเข้าโปรเจ็กต์ (Gradle, Eclipse ADT ฯลฯ)
  2. เปิดโฟลเดอร์ starter (audio_classification/codelab1/android/starter) จากซอร์สโค้ดที่คุณดาวน์โหลดไว้ก่อนหน้านี้

7c0f27882a2698ac.png

หากต้องการตรวจสอบว่าทรัพยากร Dependency ทั้งหมดพร้อมใช้งานในแอป คุณควรซิงค์โปรเจ็กต์กับไฟล์ Gradle เมื่อระบบนําเข้าเสร็จแล้ว

  1. เลือกซิงค์โปรเจ็กต์กับไฟล์ Gradle ( b451ab2d04d835f9.png) จากแถบเครื่องมือ Android Studio

เรียกใช้แอปเริ่มต้น

หลังจากที่นําเข้าโปรเจ็กต์ไปยัง Android Studio แล้ว คุณก็พร้อมที่จะเรียกใช้แอปเป็นครั้งแรก

เชื่อมต่ออุปกรณ์ Android ผ่าน USB กับคอมพิวเตอร์ แล้วคลิกเรียกใช้ ( png) ในแถบเครื่องมือ Android Studio

5518972c21705945.png

3. ค้นหาโมเดลก่อนการฝึก

ในการแยกประเภทเสียง คุณจะต้องใช้โมเดล เริ่มต้นด้วยโมเดลก่อนการฝึก คุณจึงไม่ต้องฝึกด้วยตัวเอง

หากต้องการค้นหาโมเดลก่อนการฝึก ให้ใช้ TensorFlow Hub (www.tfhub.dev)

91e39900ff58818c.png

โมเดลจะได้รับการจัดหมวดหมู่ตามโดเมน ปัจจุบันคุณต้องมาจากโดเมนที่เป็นปัญหาเกี่ยวกับเสียง

9d44d38c297bf3dc.png

สําหรับแอป คุณจะต้องแยกประเภทเหตุการณ์ด้วยโมเดล YAMNet

YAMNet เป็นตัวแยกประเภทเหตุการณ์เสียงที่ใช้รูปแบบคลื่นเสียงเป็นอินพุต และทําการคาดการณ์อิสระต่อเหตุการณ์เสียง 521 เหตุการณ์

โมเดล yamnet/classification ได้แปลงเป็น TensorFlow Lite แล้ว และมีข้อมูลเมตาเฉพาะที่ช่วยให้ไลบรารีงานของ TFLite Task Library สําหรับเสียงใช้โมเดลได้ง่ายขึ้น #39

65dc0f610eb27762.png

เลือกแท็บที่ถูกต้อง: TFLite (yamnet/classification/tflite) และคลิกดาวน์โหลด คุณจะเห็นข้อมูลเมตาของโมเดลที่ด้านล่างด้วย

cfb3cfeb310e1f51.png

ระบบจะใช้ไฟล์โมเดล (lite-model_yamnet_classification_tflite_1.tflite) ในขั้นตอนถัดไป

4. นําเข้าโมเดลใหม่ไปยังแอปฐาน

ขั้นตอนแรกคือย้ายโมเดลที่ดาวน์โหลดจากขั้นตอนก่อนหน้าไปยังโฟลเดอร์เนื้อหาในแอป

ใน Android Studio ให้คลิกขวาที่โฟลเดอร์เนื้อหาใน Android Explorer

7cca2c22ed8cf4c8.png

คุณจะเห็นป๊อปอัปพร้อมรายการตัวเลือก โฟลเดอร์ใดโฟลเดอร์หนึ่งต่อไปนี้จะเปิดโฟลเดอร์ในระบบไฟล์ สําหรับ Mac จะเป็นแสดงใน Finder สําหรับ Windows จะเป็น Open in Explorer และใน Ubuntu จะเป็น Show in Files หาส่วนขยายที่เหมาะสมสําหรับระบบปฏิบัติการของคุณ แล้วเลือกส่วนขยายดังกล่าว

ไฟล์ 95e0eca881d35f6b.png

จากนั้นคัดลอกรูปแบบที่ดาวน์โหลดลงในโมเดล

เมื่อคุณดําเนินการข้างต้นแล้ว ให้กลับไปที่ Android Studio คุณจะเห็นไฟล์ในโฟลเดอร์เนื้อหา

703b1842fb09e893.png

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

92e81894674a5b0.png

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 แล้วคลิกเรียกใช้ ( png) ในแถบเครื่องมือ Android Studio

ในการดําเนินการแรก คุณจะต้องให้สิทธิ์การบันทึกเสียงของแอป

หลังจากให้สิทธิ์แล้ว แอปเริ่มต้นจะใช้ไมโครโฟนของโทรศัพท์ หากต้องการทดสอบ ให้เริ่มพูดใกล้กับโทรศัพท์เนื่องจากชั้นเรียนหนึ่งที่ YAMNet ตรวจพบการพูด ชั้นเรียนอีกคลาสที่ทดสอบง่ายคือการสแนปหรือตบมือ

นอกจากนี้ คุณยังลองหาเสียงสุนัขเห่าและกิจกรรมอื่นๆ อีกมากมายที่เป็นไปได้ (521) ได้อีกด้วย ดูรายการทั้งหมดได้ที่ซอร์สโค้ด หรือจะอ่านข้อมูลเมตาด้วยไฟล์ป้ายกํากับโดยตรงได้ด้วย

33af0fdb0a027fa8.png

9. ยินดีด้วย

ใน Codelab นี้ คุณจะได้ทราบวิธีค้นหาโมเดลก่อนการฝึกสําหรับการแยกประเภทเสียง และวิธีทําให้โมเดลดังกล่าวในแอปบนอุปกรณ์เคลื่อนที่โดยใช้ TensorFlow Lite ดูข้อมูลเพิ่มเติมเกี่ยวกับ TFLite ได้ที่ตัวอย่าง TFLite

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

  • วิธีทําให้โมเดล TensorFlow Lite ใช้งานได้ในแอป Android
  • วิธีค้นหาและใช้โมเดลจาก TensorFlow Hub

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

  • ปรับแต่งโมเดลด้วยข้อมูลของคุณเอง

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

หากมีข้อสงสัย

รายงานปัญหา