16 กรกฎาคม 2562

Published กรกฎาคม 16, 2562 by with 0 comment

ทำ Hotword Detection เหมือน OK Google ง่าย ๆ ด้วย Mycroft Precise

สวัสดีผู้อ่านทุกท่านครับ หลาย ๆ คนคงเคยได้พูดว่า OK Google! หรือ Hey Siri กันมาไม่มากก็น้อย คงเกิดความสงสัยว่าถ้าอยากทำแบบนี้บ้างต้องทำอย่างไร และ เทคนิคนี้เรียกว่าอะไร ?


คำเรียกผู้ช่วยอย่าง คือ Wake up word / Hot word เป็นคำใช้เรียกหรือสั่งงานโปรแกรม ช่วยอำนวยความสะดวกในการใช้งานโปรแกรมผู้ช่วยส่วนตัว ถูกนำไปใช้งานอย่าง siri ใน iPhone และ Ok Google ของ Google

ในภาษาไพทอน มีเครื่องมือง่าย ๆ อย่าง Mycroft Precise ให้เราสามารถสร้าง Wake up word / Hot word ง่าย ๆ ไม่ซับซ้อน

แนะนำให้ train บน Linux ไม่แนะนำให้ใช้ Windows ในการ train

เรามาสร้าง Wake up word / Hot word กันเลยครับ

เริ่มแรก ให้เราใช้โปรแกรม Audacity อัดเสียง  โดยตั้งค่า Project Rate (Hz) เป็น 16000 Hz แล้วกดอัดเสียง ตัวอย่างเช่น ผมอัดคำว่า "น้ำฟ้า" ประมาณ 10 ไฟล์ โดยบันทึกเป็น WAV 16-bit PCM
ใช้โปรแกรม Audacity อัดเสียง
โดยต้องอัดเสียง Hot word ที่ต้องการให้ได้เยอะประมาณหนึ่ง จากนั้นต้องอัดเสียงที่ไม่ใช่ Hot word ไว้แยกว่าเสียงนี้ไม่ใช่ Hot word

จากนั้น เรามาสร้างโฟลเดอร์ และแยกไฟล์ตามที่ Mycroft Precise กำหนด ตัวอย่างเช่น
hi-numfa/
├── wake-word/
│   ├── numfa.00.wav
│   ├── numfa.01.wav
│   ├── numfa.02.wav
│   ├── numfa.03.wav
│   ├── numfa.04.wav
│   ├── numfa.05.wav
│   ├── numfa.06.wav
│   ├── numfa.07.wav
│   └── numfa.08.wav
├── not-wake-word/
└── test/
    ├── wake-word/
    │   ├── numfa.09.wav
    │   ├── numfa.10.wav
    │   ├── numfa.11.wav
    │   └── numfa.12.wav
    └── not-wake-word/

โฟลเดอร์ wake-word ใช้เก็บไฟล์เสียง Hot word ส่วนโฟลเดอร์ not-wake-word ใช้เก็บไฟล์เสียงที่ไม่ใช่ Hot word โดยแบ่งส่วนหนึ่งไว้สำหรับ Test ในโฟลเดอร์ test

จากนั้น ติดตั้งเครื่องมือสำหรับ Train Model กัน ด้วยคำสั่ง
pip3 install https://github.com/MycroftAI/mycroft-precise/archive/dev.zip
จากนั้นเปิดเทอร์มินัท เข้าไปยังที่ตั้งที่เก็บโฟลเดอร์ hey-numfa หรือ Hot word ของเรา จากนั้น Train ด้วยคำสั่ง
precise-train -e จำนวนการtrain ชื่อmodel.net ที่ตั้ง/
ตัวอย่างเช่น
precise-train -e 100 hi-numfa.net hi-numfa/
เราจะเห็นผลลัพธ์การ train โดยจะโชว์ดังเช่น
...
98/98 [==============================] - 0s 941us/step - loss: 0.0297 - acc: 0.9592 - val_loss: 0.0057 - val_acc: 1.0000
Epoch 100/100
98/98 [==============================] - 0s 354us/step - loss: 0.0275 - acc: 0.9796 - val_loss: 0.0057 - val_acc: 1.0000

จากนั้นให้แปลงออกมาเป็นไฟล์ model ให้นำไปใช้งาน ด้วยคำสั่ง
precise-convert ชื่อmodel.net
ตัวอย่างเช่น
precise-convert hi-numfa.net
จะได้ไฟล์ hi-numfa.pb และ hi-numfa.pb.params

บนเครื่องผู้ใช้ ให้ทำการติดตั้งตัวรัน model ด้วยคำสั่ง
pip install precise-runner
จากนั้น ให้เขียนโค้ด Python
import time
from precise_runner import PreciseEngine, PreciseRunner

print('start')
def on_prediction(prob):
    print('!' if prob > 0.5 else '.', end='', flush=True)

def on_activation():
    print('Activation')

engine = PreciseEngine('C:\\Users\\Tontan\\Miniconda3\\Scripts\\precise-engine.exe', 'hi-numfa.pb') 

# PreciseEngine(ที่ตั้งโฟลเดอร์ Scripts ของ precise-engine ,  ไฟล์ model)
# หากรันบน Linux ใช้ precise-engine/precise-engine ใน precise-engine
runner = PreciseRunner(engine, on_prediction=on_prediction, on_activation=on_activation, trigger_level=0)
runner.start()

while 1:
    time.sleep(1)

โดยไฟล์จะต้องอยู่โฟลเดอร์เดียวกันกับไฟล์ model (เพื่อความสะดวกในการตั้งค่า) จากนั้นลองรันไฟล์ Python โดยลองพูดออกมา
start
........................!Activation
!!!..!.!...............................................................................................................................................


Activation คือ พบเสียง Hotword

อ่านเอกสารเพิ่มเติมได้ที่ https://github.com/MycroftAI/mycroft-precise
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)