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

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

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ เม.ย. 7, 2022
account_circleเขียนโดย lgusm@ 2021-04-26

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

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

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

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

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

รายงานปัญหา