Honk คือการปรับแต่ง Pytorch ใหม่ของเครือข่ายประสาทเทนเซอร์โฟลว์ของ Google สำหรับการระบุคำหลักซึ่งมาพร้อมกับการเปิดตัวชุดข้อมูลคำสั่งคำพูดล่าสุดของพวกเขา สำหรับรายละเอียดเพิ่มเติมโปรดปรึกษาการเขียนของเรา:
Honk มีประโยชน์สำหรับการสร้างความสามารถในการรับรู้การพูดในอุปกรณ์สำหรับตัวแทนอัจฉริยะเชิงโต้ตอบ รหัสของเราสามารถใช้เพื่อระบุคำสั่งง่ายๆ (เช่น "หยุด" และ "Go") และปรับให้เข้ากับการตรวจจับ "ทริกเกอร์คำสั่ง" ที่กำหนดเอง "(เช่น" เฮ้ Siri! ")
ลองดูวิดีโอนี้สำหรับการสาธิตของ Honk In Action!
ใช้คำแนะนำด้านล่างเพื่อเรียกใช้แอปพลิเคชันตัวอย่าง (แสดงในวิดีโอด้านบน) ด้วยตัวคุณเอง!
ปัจจุบัน Pytorch ได้รับการสนับสนุนอย่างเป็นทางการสำหรับ Linux และ OS X เท่านั้นดังนั้นผู้ใช้ Windows จะไม่สามารถเรียกใช้การสาธิตนี้ได้อย่างง่ายดาย
ในการปรับใช้การสาธิตให้เรียกใช้คำสั่งต่อไปนี้:
pip install -r requirements.txt
apt-get install freeglut3-dev
)./fetch_data.sh
python .
python utils/speech_demo.py
หากคุณต้องการปรับตัวเลือกเช่นการปิด cuda โปรดแก้ไข config.json
หมายเหตุเพิ่มเติมสำหรับ Mac OS X:
python .
ปรับใช้บริการเว็บเพื่อระบุว่าเสียงมีคำสั่งหรือไม่ โดยค่าเริ่มต้น config.json
ใช้สำหรับการกำหนดค่า แต่สามารถเปลี่ยนแปลงได้ด้วย --config=<file_name>
หากเซิร์ฟเวอร์อยู่เบื้องหลังไฟร์วอลล์เวิร์กโฟลว์หนึ่งขั้นตอนคือการสร้างอุโมงค์ SSH และใช้การส่งต่อพอร์ตด้วยพอร์ตที่ระบุใน config (เริ่มต้น 16888)
ในพื้นที่เก็บข้อมูล Honk-Models ของเรามีหลายรุ่นที่ผ่านการฝึกอบรมมาก่อนสำหรับ Caffe2 (ONNX) และ Pytorch สคริปต์ fetch_data.sh
ดึงโมเดลเหล่านี้และแยกออกไปยังไดเรกทอรี model
คุณสามารถระบุรุ่นและแบ็กเอนด์ที่จะใช้ใน model_path
ของไฟล์ config และ backend
ตามลำดับ โดยเฉพาะ backend
สามารถเป็น caffe2
หรือ pytorch
ขึ้นอยู่กับรูปแบบใดที่ model_path
อยู่ในโปรดทราบว่าเพื่อที่จะเรียกใช้โมเดล ONNX ของเราแพ็คเกจ onnx
และ onnx_caffe2
จะต้องอยู่ในระบบของคุณ สิ่งเหล่านี้ขาดหายไปในข้อกำหนด txt
น่าเสียดายที่การให้ห้องสมุดทำงานกับ RPI โดยเฉพาะอย่างยิ่ง Librosa ไม่ตรงไปตรงมาเหมือนกับการรันคำสั่งไม่กี่คำ เราร่างกระบวนการของเราซึ่งอาจใช้ได้หรือไม่เหมาะกับคุณ
sudo apt-get install -y protobuf-compiler libprotoc-dev python-numpy python-pyaudio python-scipy python-sklearn
pip install protobuf
pip install --no-deps onnx
caffe2
ไปยังตัวแปรสภาพแวดล้อม PYTHONPATH
สำหรับเราสิ่งนี้สามารถทำได้โดย export PYTHONPATH=$PYTHONPATH:/home/pi/caffe2/build
pip install onnx-caffe2
pip install -r requirements_rpi.txt
pip install --no-deps resampy librosa
python -c "import librosa"
ควรโยนข้อผิดพลาดเกี่ยวกับ NUMBA เนื่องจากเรายังไม่ได้ติดตั้ง@numba.jit
ออกจาก /home/pi/.local/lib/python2.7/site-packages/resampy/interpn.py
./fetch_data.sh
config.json
ให้เปลี่ยน backend
เป็น caffe2
และ model_path
เป็น model/google-speech-dataset-full.onnx
python .
หากไม่มีข้อผิดพลาดคุณได้ปรับใช้โมเดลสำเร็จแล้วสามารถเข้าถึงได้ผ่านพอร์ต 16888 โดยค่าเริ่มต้นpython utils/speech_demo.py
คุณจะต้องใช้ไมโครโฟนและลำโพงที่ใช้งานได้ หากคุณมีปฏิสัมพันธ์กับ RPI ของคุณจากระยะไกลคุณสามารถเรียกใช้การสาธิตคำพูดในเครื่องและระบุจุดสิ้นสุดระยะไกล --server-endpoint=http://[RPi IP address]:16888
น่าเสียดายที่ไคลเอนต์ QA ยังไม่สนับสนุนสาธารณะทั่วไปเนื่องจากต้องใช้บริการ QA ที่กำหนดเอง อย่างไรก็ตามมันยังสามารถใช้เพื่อกำหนดเป้าหมายคำสั่งคำสั่งอีกครั้ง
python client.py
เรียกใช้ไคลเอนต์ QA คุณสามารถกำหนดเป้าหมายคำหลักอีกครั้งโดยทำ python client.py --mode=retarget
โปรดทราบว่าข้อความเป็นคำพูดอาจใช้งานไม่ได้กับ linux distros; ในกรณีนี้โปรดจัดหาข้อมูลรับรองของ IBM Watson ผ่าน --watson-username
และ --watson--password
คุณสามารถดูตัวเลือกทั้งหมดได้โดยทำ python client.py -h
รุ่น CNN python -m utils.train --type [train|eval]
รถไฟหรือประเมินแบบจำลอง คาดว่าตัวอย่างการฝึกอบรมทั้งหมดจะทำตามรูปแบบเดียวกันกับชุดข้อมูลคำสั่งคำพูด เวิร์กโฟลว์ที่แนะนำคือการดาวน์โหลดชุดข้อมูลและเพิ่มคำหลักที่กำหนดเองเนื่องจากชุดข้อมูลมีตัวอย่างเสียงที่มีประโยชน์มากมายและเสียงรบกวนจากพื้นหลัง
รุ่นที่เหลือ เราขอแนะนำ HyperParameters ต่อไปนี้สำหรับการฝึกอบรม res{8,15,26}[-narrow]
โมเดลในชุดข้อมูลคำสั่งคำพูด:
python -m utils.train --wanted_words yes no up down left right on off stop go --dev_every 1 --n_labels 12 --n_epochs 26 --weight_decay 0.00001 --lr 0.1 0.01 0.001 --schedule 3000 6000 --model res{8,15,26}[-narrow]
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่เหลืออยู่ลึกของเราโปรดดูบทความของเรา:
มีตัวเลือกคำสั่งให้เลือก:
ตัวเลือก | รูปแบบอินพุต | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
--audio_preprocess_type | {mfccs, pcen} | MFCCS | ประเภทของการประมวลผลเสียงล่วงหน้าที่จะใช้ |
--batch_size | [1, N) | 100 | ขนาดมินิแบทช์ที่จะใช้ |
--cache_size | [0, inf) | 32768 | จำนวนรายการในแคชเสียงใช้ประมาณ 32 kb * n |
--conv1_pool | [1, inf) [1, inf) | 2 2 | ความกว้างและความสูงของตัวกรองสระว่ายน้ำ |
--conv1_size | [1, inf) [1, inf) | 10 4 | ความกว้างและความสูงของตัวกรองคอนเดอร์ |
--conv1_stride | [1, inf) [1, inf) | 1 1 | ความกว้างและความยาวของการก้าวย่าง |
--conv2_pool | [1, inf) [1, inf) | 1 1 | ความกว้างและความสูงของตัวกรองสระว่ายน้ำ |
--conv2_size | [1, inf) [1, inf) | 10 4 | ความกว้างและความสูงของตัวกรองคอนเดอร์ |
--conv2_stride | [1, inf) [1, inf) | 1 1 | ความกว้างและความยาวของการก้าวย่าง |
--data_folder | สาย | /data/speech_dataset | เส้นทางสู่ข้อมูล |
--dev_every | [1, inf) | 10 | ช่วงเวลาการพัฒนาในแง่ของยุค |
--dev_pct | [0, 100] | 10 | เปอร์เซ็นต์ของการตั้งค่าทั้งหมดที่จะใช้สำหรับ dev |
--dropout_prob | [0.0, 1.0) | 0.5 | อัตราการออกกลางคันที่จะใช้ |
--gpu_no | [-1, n] | 1 | GPU ที่จะใช้ |
--group_speakers_by_id | {true, false} | จริง | ไม่ว่าจะจัดกลุ่มลำโพงข้ามรถไฟ/พัฒนา/ทดสอบ |
--input_file | สาย | เส้นทางสู่โมเดลในการโหลด | |
--input_length | [1, inf) | 16000 | ความยาวของเสียง |
--lr | (0.0, inf) | {0.1, 0.001} | อัตราการเรียนรู้ที่จะใช้ |
--type | {รถไฟ, eval} | รถไฟ | โหมดที่จะใช้ |
--model | สาย | CNN-Trad-Pool2 | หนึ่งใน cnn-trad-pool2 , cnn-tstride-{2,4,8} , cnn-tpool{2,3} , cnn-one-fpool3 FPool3, cnn-one-fstride{4,8} , res{8,15,26}[-narrow] , cnn-trad-fpool3 , cnn-one-stride1 |
--momentum | [0.0, 1.0) | 0.9 | โมเมนตัมที่ใช้สำหรับ SGD |
--n_dct_filters | [1, inf) | 40 | จำนวนฐาน DCT ที่จะใช้ |
--n_epochs | [0, inf) | 500 | จำนวนยุค |
--n_feature_maps | [1, inf) | {19, 45} | จำนวนแผนที่คุณสมบัติที่จะใช้สำหรับสถาปัตยกรรมที่เหลือ |
--n_feature_maps1 | [1, inf) | 64 | จำนวนแผนที่คุณลักษณะสำหรับ Conv Net 1 |
--n_feature_maps2 | [1, inf) | 64 | จำนวนแผนที่คุณสมบัติสำหรับ Conv Net 2 |
--n_labels | [1, N) | 4 | จำนวนฉลากที่จะใช้ |
--n_layers | [1, inf) | {6, 13, 24} | จำนวนเลเยอร์ convolution สำหรับสถาปัตยกรรมที่เหลือ |
--n_mels | [1, inf) | 40 | จำนวนตัวกรอง MEL ที่จะใช้ |
--no_cuda | สวิตช์ | เท็จ | ไม่ว่าจะใช้ cuda |
--noise_prob | [0.0, 1.0] | 0.8 | ความน่าจะเป็นของการผสมกับเสียงรบกวน |
--output_file | สาย | รุ่น/Google-speech-dataset.pt | ไฟล์เพื่อบันทึกโมเดลเป็น |
--seed | (inf, inf) | 0 | เมล็ดพันธุ์ที่จะใช้ |
--silence_prob | [0.0, 1.0] | 0.1 | ความน่าจะเป็นของการเลือกความเงียบ |
--test_pct | [0, 100] | 10 | เปอร์เซ็นต์ของการตั้งค่าทั้งหมดที่ใช้สำหรับการทดสอบ |
--timeshift_ms | [0, inf) | 100 | เวลาเป็นมิลลิวินาทีเพื่อเลื่อนเสียงแบบสุ่ม |
--train_pct | [0, 100] | 80 | เปอร์เซ็นต์ของการตั้งค่าทั้งหมดที่จะใช้สำหรับการฝึกอบรม |
--unknown_prob | [0.0, 1.0] | 0.1 | ความน่าจะเป็นในการเลือกคำที่ไม่รู้จัก |
--wanted_words | String1 String2 ... Stringn | คำสั่งแบบสุ่ม | คำเป้าหมายที่ต้องการ |
Honkling เป็นการใช้งาน JavaScript ของ Honk ด้วย honkling เป็นไปได้ที่จะใช้เว็บแอพพลิเคชั่นต่างๆด้วยฟังก์ชั่นการระบุคำหลักในเบราว์เซอร์
เพื่อปรับปรุงความยืดหยุ่นของ Honk และ Honkling เรามีโปรแกรมที่สร้างชุดข้อมูลจากวิดีโอ YouTube รายละเอียดสามารถพบได้ในโฟลเดอร์ keyword_spotting_data_generator
คุณสามารถทำสิ่งต่อไปนี้เพื่อบันทึกเสียงตามลำดับและบันทึกเป็นรูปแบบเดียวกับชุดข้อมูลคำสั่งคำพูด:
python -m utils.record
อินพุตกลับไปที่บันทึกขึ้นลูกศรเพื่อเลิกทำและ "Q" เพื่อเสร็จสิ้น หลังจากความเงียบหนึ่งวินาทีการบันทึกจะหยุดโดยอัตโนมัติ
มีตัวเลือกมากมาย:
--output-begin-index: Starting sequence number
--output-prefix: Prefix of the output audio sequence
--post-process: How the audio samples should be post-processed. One or more of "trim" and "discard_true".
โพสต์การประมวลผลประกอบด้วยการตัดแต่งหรือทิ้งเสียง "ไร้ประโยชน์" การตัดแต่งเป็นการอธิบายตนเอง: การบันทึกเสียงถูกตัดแต่งไปที่หน้าต่างที่ดังที่สุดของมิลลิวินาที x ที่ระบุโดย --cutoff-ms
การทิ้งเสียง "ไร้ประโยชน์" ( discard_true
) ใช้โมเดลที่ผ่านการฝึกอบรมมาก่อนเพื่อกำหนดว่าตัวอย่างใดที่ทำให้เกิดความสับสน รูปแบบที่ผ่านการฝึกอบรมมาก่อนและฉลากที่ถูกต้องจะถูกกำหนดโดย --config
และ --correct-label
ตามลำดับ
ตัวอย่างเช่นพิจารณา python -m utils.record --post-process trim discard_true --correct-label no --config config.json
ในกรณีนี้ยูทิลิตี้จะบันทึกลำดับของตัวอย่างคำพูดจบลงในหนึ่งวินาทีและในที่สุดก็ทิ้งผู้ที่ไม่ติดป้ายว่า "ไม่" โดยโมเดลใน config.json
python manage_audio.py listen
สิ่งนี้ช่วยในการตั้งค่า Sane ค่าสำหรับ --min-sound-lvl
สำหรับการบันทึก
python manage_audio.py generate-contrastive --directory [directory]
สร้างตัวอย่างที่ตรงกันข้ามจากไฟล์. wav ทั้งหมดใน [directory]
โดยใช้การแบ่งส่วนออกเสียง
ชุดข้อมูลคำสั่งคำพูดมีตัวอย่างเสียงยาวหนึ่งวินาที
python manage_audio.py trim --directory [directory]
ปิดกั้นไปยังหนึ่งวินาทีที่ดังที่สุดสำหรับไฟล์. wav ทั้งหมดใน [directory]
ผู้ใช้อย่างระมัดระวังควรตรวจสอบตัวอย่างเสียงทั้งหมดด้วยตนเองโดยใช้ตัวแก้ไขเสียงเช่น Audacity