Honk adalah penerimaan ulang Pytorch dari jaringan saraf konvolusional TensorFlow Google untuk bercak kata kunci, yang menyertai rilis terbaru dari dataset perintah pidato mereka. Untuk detail lebih lanjut, silakan berkonsultasi dengan tulisan kami:
Honk berguna untuk membangun kemampuan pengenalan ucapan di perangkat untuk agen cerdas interaktif. Kode kami dapat digunakan untuk mengidentifikasi perintah sederhana (misalnya, "berhenti" dan "go") dan diadaptasi untuk mendeteksi "pemicu perintah" khusus (misalnya, "hey siri!").
Lihat video ini untuk demo Honk yang sedang beraksi!
Gunakan instruksi di bawah ini untuk menjalankan aplikasi demo (ditampilkan dalam video di atas) sendiri!
Saat ini, Pytorch memiliki dukungan resmi hanya untuk Linux dan OS X. Dengan demikian, pengguna Windows tidak akan dapat menjalankan demo ini dengan mudah.
Untuk menggunakan demo, jalankan perintah berikut:
pip install -r requirements.txt
apt-get install freeglut3-dev
)./fetch_data.sh
python .
python utils/speech_demo.py
Jika Anda perlu menyesuaikan opsi, seperti mematikan CUDA, silakan edit config.json
.
Catatan tambahan untuk Mac OS X:
python .
Menyebarkan layanan web untuk mengidentifikasi jika audio berisi kata perintah. Secara default, config.json
digunakan untuk konfigurasi, tetapi itu dapat diubah dengan --config=<file_name>
. Jika server berada di belakang firewall, satu alur kerja adalah untuk membuat terowongan SSH dan menggunakan port forwarding dengan port yang ditentukan dalam config (default 16888).
Dalam repositori hutan-model kami, ada beberapa model pra-terlatih untuk Caffe2 (ONNX) dan Pytorch. Script fetch_data.sh
mengambil model ini dan mengekstraknya ke direktori model
. Anda dapat menentukan model dan backend mana yang akan digunakan di masing -masing file konfigurasi model_path
dan backend
. Secara khusus, backend
dapat berupa caffe2
atau pytorch
, tergantung pada format apa yang model_path
. Perhatikan bahwa, untuk menjalankan model ONNX kami, paket onnx
dan onnx_caffe2
harus ada di sistem Anda; Ini tidak ada dalam persyaratan.txt.
Sayangnya, membuat perpustakaan mengerjakan RPI, terutama librosa, tidak semudah menjalankan beberapa perintah. Kami menguraikan proses kami, yang mungkin atau mungkin tidak cocok untuk Anda.
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
ke variabel lingkungan PYTHONPATH
. Bagi kami, ini dilakukan dengan 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"
. Itu harus melempar kesalahan tentang Numba, karena kami belum menginstalnya.@numba.jit
dari /home/pi/.local/lib/python2.7/site-packages/resampy/interpn.py
./fetch_data.sh
config.json
, ubah backend
ke caffe2
dan model_path
menjadi model/google-speech-dataset-full.onnx
.python .
Jika tidak ada kesalahan, Anda telah berhasil menggunakan model, dapat diakses melalui port 16888 secara default.python utils/speech_demo.py
. Anda akan membutuhkan mikrofon dan speaker yang berfungsi. Jika Anda berinteraksi dengan RPI Anda dari jarak jauh, Anda dapat menjalankan demo pidato secara lokal dan menentukan titik akhir jarak jauh --server-endpoint=http://[RPi IP address]:16888
. Sayangnya, klien QA belum memiliki dukungan untuk masyarakat umum, karena membutuhkan layanan QA khusus. Namun, itu masih dapat digunakan untuk menargetkan ulang kata kunci perintah.
python client.py
menjalankan klien QA. Anda dapat menargetkan ulang kata kunci dengan melakukan python client.py --mode=retarget
. Harap dicatat bahwa teks-ke-speech mungkin tidak bekerja dengan baik pada distro Linux; Dalam hal ini, silakan berikan kredensial IBM Watson melalui --watson-username
dan --watson--password
. Anda dapat melihat semua opsi dengan melakukan python client.py -h
.
Model CNN . python -m utils.train --type [train|eval]
melatih atau mengevaluasi model. Ini mengharapkan semua contoh pelatihan untuk mengikuti format yang sama seperti dataset perintah ucapan. Alur kerja yang disarankan adalah mengunduh dataset dan menambahkan kata kunci khusus, karena dataset sudah berisi banyak sampel audio yang berguna dan kebisingan latar belakang.
Model residual . Kami merekomendasikan hyperparameter berikut untuk melatih model res{8,15,26}[-narrow]
pada dataset perintah ucapan:
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]
Untuk informasi lebih lanjut tentang model residu kami yang dalam, silakan lihat makalah kami:
Ada opsi perintah yang tersedia:
pilihan | format input | bawaan | keterangan |
---|---|---|---|
--audio_preprocess_type | {Mfccs, pcen} | MFCCS | jenis preprocess audio untuk digunakan |
--batch_size | [1, n) | 100 | Ukuran mini-batch untuk digunakan |
--cache_size | [0, INF) | 32768 | Jumlah item dalam cache audio, mengkonsumsi sekitar 32 kb * n |
--conv1_pool | [1, INF) [1, INF) | 2 2 | lebar dan tinggi filter kolam |
--conv1_size | [1, INF) [1, INF) | 10 4 | Lebar dan tinggi filter CONV |
--conv1_stride | [1, INF) [1, INF) | 1 1 | lebar dan panjang langkah |
--conv2_pool | [1, INF) [1, INF) | 1 1 | lebar dan tinggi filter kolam |
--conv2_size | [1, INF) [1, INF) | 10 4 | Lebar dan tinggi filter CONV |
--conv2_stride | [1, INF) [1, INF) | 1 1 | lebar dan panjang langkah |
--data_folder | rangkaian | /data/pidato_dataset | jalur ke data |
--dev_every | [1, INF) | 10 | interval dev dalam hal zaman |
--dev_pct | [0, 100] | 10 | Persentase dari total set untuk digunakan untuk dev |
--dropout_prob | [0,0, 1.0) | 0,5 | tingkat putus sekolah untuk digunakan |
--gpu_no | [-1, n] | 1 | GPU untuk digunakan |
--group_speakers_by_id | {true, false} | BENAR | Apakah untuk mengelompokkan pembicara di seluruh kereta/dev/tes |
--input_file | rangkaian | jalur ke model untuk memuat | |
--input_length | [1, INF) | 16000 | panjang audio |
--lr | (0,0, INF) | {0,1, 0,001} | Tingkat pembelajaran untuk digunakan |
--type | {kereta, eval} | kereta | mode untuk digunakan |
--model | rangkaian | CNN-TRAD-POOL2 | Salah satu dari cnn-trad-pool2 , cnn-tstride-{2,4,8} , cnn-tpool{2,3} , cnn-one-fpool3 , cnn-one-fstride{4,8} , res{8,15,26}[-narrow] , cnn-trad-fpool3 , cnn-one-stride1 |
--momentum | [0,0, 1.0) | 0.9 | Momentum untuk digunakan untuk SGD |
--n_dct_filters | [1, INF) | 40 | Jumlah basis DCT untuk digunakan |
--n_epochs | [0, INF) | 500 | jumlah zaman |
--n_feature_maps | [1, INF) | {19, 45} | Jumlah peta fitur untuk digunakan untuk arsitektur residual |
--n_feature_maps1 | [1, INF) | 64 | Jumlah peta fitur untuk conv net 1 |
--n_feature_maps2 | [1, INF) | 64 | Jumlah peta fitur untuk conv net 2 |
--n_labels | [1, n) | 4 | Jumlah label untuk digunakan |
--n_layers | [1, INF) | {6, 13, 24} | Jumlah lapisan konvolusi untuk arsitektur residual |
--n_mels | [1, INF) | 40 | Jumlah filter MEL untuk digunakan |
--no_cuda | mengalihkan | PALSU | apakah akan menggunakan cuda |
--noise_prob | [0,0, 1.0] | 0.8 | probabilitas pencampuran dengan kebisingan |
--output_file | rangkaian | Model/Google-speech-Dataset.pt | file untuk menyimpan model ke |
--seed | (INF, INF) | 0 | benih untuk digunakan |
--silence_prob | [0,0, 1.0] | 0.1 | kemungkinan memetik keheningan |
--test_pct | [0, 100] | 10 | Persentase dari total set untuk digunakan untuk pengujian |
--timeshift_ms | [0, INF) | 100 | waktu dalam milidetik untuk menggeser audio secara acak |
--train_pct | [0, 100] | 80 | Persentase dari Total Set untuk digunakan untuk pelatihan |
--unknown_prob | [0,0, 1.0] | 0.1 | probabilitas memilih kata yang tidak diketahui |
--wanted_words | String1 String2 ... Stringn | perintah acak | kata -kata target yang diinginkan |
Honkling adalah implementasi JavaScript dari Honk. Dengan mencuri, dimungkinkan untuk mengimplementasikan berbagai aplikasi web dengan fungsionalitas spotting kata kunci dalam browser.
Untuk meningkatkan fleksibilitas klakson dan menjengkelkan, kami menyediakan program yang membangun dataset dari video YouTube. Detail dapat ditemukan di folder keyword_spotting_data_generator
Anda dapat melakukan hal berikut untuk merekam audio berurutan dan menyimpan ke format yang sama dengan dataset perintah ucapan:
python -m utils.record
Input kembali ke rekaman, Up Arrow to Undo, dan "Q" untuk menyelesaikan. Setelah satu detik keheningan, perekaman secara otomatis berhenti.
Beberapa opsi tersedia:
--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".
Pasca pemrosesan terdiri dari pemangkasan atau buang audio "tidak berguna". Pemangkasan itu jelas: Rekaman audio dipangkas ke jendela paling keras dari x milidetik, ditentukan oleh --cutoff-ms
. Membuang audio "tidak berguna" ( discard_true
) menggunakan model pra-terlatih untuk menentukan sampel mana yang membingungkan, membuang yang berlabel dengan benar. Model pra-terlatih dan label yang benar ditentukan oleh --config
dan --correct-label
, masing-masing.
Misalnya, pertimbangkan python -m utils.record --post-process trim discard_true --correct-label no --config config.json
. Dalam hal ini, utilitas mencatat urutan cuplikan bicara, memotongnya menjadi satu detik, dan akhirnya membuang yang tidak diberi label "no" oleh model di config.json
.
python manage_audio.py listen
Ini membantu dalam menetapkan nilai waras untuk --min-sound-lvl
untuk perekaman.
python manage_audio.py generate-contrastive --directory [directory]
menghasilkan contoh kontras dari semua file .wav di [directory]
menggunakan segmentasi fonetik.
Dataset perintah ucapan berisi cuplikan audio satu detik.
python manage_audio.py trim --directory [directory]
trim ke satu detik paling keras untuk semua file .wav di [directory]
. Pengguna yang cermat harus secara manual memeriksa semua sampel audio menggunakan editor audio seperti Audacity.