Honk est une réimplémentation pytorch des réseaux de neurones convolutionnels TensorFlow de Google pour le repérage des mots clés, qui accompagne la récente version de leur ensemble de données de commandes de discours. Pour plus de détails, veuillez consulter notre rédaction:
Le klaxon est utile pour renforcer les capacités de reconnaissance vocale à disposition pour les agents intelligents interactifs. Notre code peut être utilisé pour identifier les commandes simples (par exemple, "stop" et "go") et être adaptée pour détecter les "déclencheurs de commande" (par exemple, "Hey Siri!").
Découvrez cette vidéo pour une démo de klaxon en action!
Utilisez les instructions ci-dessous pour exécuter vous-même l'application de démonstration (illustrée dans la vidéo ci-dessus)!
Actuellement, Pytorch a une prise en charge officielle uniquement pour Linux et OS X. Ainsi, les utilisateurs de Windows ne pourront pas exécuter cette démo facilement.
Pour déployer la démo, exécutez les commandes suivantes:
pip install -r requirements.txt
apt-get install freeglut3-dev
)./fetch_data.sh
python .
python utils/speech_demo.py
Si vous devez ajuster les options, comme désactiver CUDA, veuillez modifier config.json
.
Notes supplémentaires pour Mac OS X:
python .
déploie le service Web pour identifier si l'audio contiennent le mot de commande. Par défaut, config.json
est utilisé pour la configuration, mais cela peut être modifié avec --config=<file_name>
. Si le serveur est derrière un pare-feu, un workflow consiste à créer un tunnel SSH et à utiliser le transfert de port avec le port spécifié dans Config (par défaut 16888).
Dans notre référentiel de modèles Honk, il existe plusieurs modèles pré-formés pour CAF2 (ONNX) et Pytorch. Le script fetch_data.sh
récupère ces modèles et les extrait dans le répertoire model
. Vous pouvez spécifier le modèle et le backend à utiliser dans le model_path
et backend
du fichier de configuration, respectivement. Plus précisément, backend
peut être caffe2
ou pytorch
, selon le format model_path
. Notez que, afin d'exécuter nos modèles ONNX, les packages onnx
et onnx_caffe2
doivent être présents sur votre système; Ceux-ci sont absents dans les exigences.txt.
Malheureusement, faire fonctionner les bibliothèques sur le RPI, en particulier Librosa, n'est pas aussi simple que d'exécuter quelques commandes. Nous décrivons notre processus, qui peut ou non fonctionner pour vous.
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
vers la variable d'environnement PYTHONPATH
. Pour nous, cela a été accompli par 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"
. Il devrait lancer une erreur concernant Numba, car nous ne l'avons pas installée.@numba.jit
de /home/pi/.local/lib/python2.7/site-packages/resampy/interpn.py
./fetch_data.sh
config.json
, modifiez backend
en caffe2
et model_path
en model/google-speech-dataset-full.onnx
.python .
S'il n'y a pas d'erreurs, vous avez déployé avec succès le modèle, accessible via le port 16888 par défaut.python utils/speech_demo.py
. Vous aurez besoin d'un microphone et des haut-parleurs de travail. Si vous interagissez avec votre RPI à distance, vous pouvez exécuter la démonstration de la parole localement et spécifier le point de terminaison distant --server-endpoint=http://[RPi IP address]:16888
. Malheureusement, le client QA n'a pas encore de support pour le grand public, car il nécessite un service QA personnalisé. Cependant, il peut toujours être utilisé pour recibler le mot-clé de commande.
python client.py
exécute le client QA. Vous pouvez recibler un mot-clé en faisant python client.py --mode=retarget
. Veuillez noter que le texte vocable peut ne pas fonctionner bien sur les distros Linux; Dans ce cas, veuillez fournir des informations d'identification IBM Watson via --watson-username
et --watson--password
. Vous pouvez afficher toutes les options en faisant python client.py -h
.
Modèles CNN . python -m utils.train --type [train|eval]
forme ou évalue le modèle. Il s'attend à ce que tous les exemples de formation suivent le même format que celui de l'ensemble de données des commandes de discours. Le workflow recommandé est de télécharger l'ensemble de données et d'ajouter des mots clés personnalisés, car l'ensemble de données contient déjà de nombreux échantillons audio et bruit d'arrière-plan utiles.
Modèles résiduels . Nous recommandons les hyperparamètres suivants pour la formation de l'un de nos modèles res{8,15,26}[-narrow]
sur l'ensemble de données des commandes de la parole:
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]
Pour plus d'informations sur nos modèles résiduels profonds, veuillez consulter notre article:
Il existe des options de commande disponibles:
option | format d'entrée | défaut | description |
---|---|---|---|
--audio_preprocess_type | {MFCCS, PCEN} | MFCCS | Type de prétraitement audio à utiliser |
--batch_size | [1, n) | 100 | la taille du mini-lots à utiliser |
--cache_size | [0, inf) | 32768 | Nombre d'articles en cache audio, consomme environ 32 kb * n |
--conv1_pool | [1, inf) [1, inf) | 2 2 | la largeur et la hauteur du filtre à piscine |
--conv1_size | [1, inf) [1, inf) | 10 4 | la largeur et la hauteur du filtre Conv |
--conv1_stride | [1, inf) [1, inf) | 1 1 | la largeur et la longueur de la foulée |
--conv2_pool | [1, inf) [1, inf) | 1 1 | la largeur et la hauteur du filtre à piscine |
--conv2_size | [1, inf) [1, inf) | 10 4 | la largeur et la hauteur du filtre Conv |
--conv2_stride | [1, inf) [1, inf) | 1 1 | la largeur et la longueur de la foulée |
--data_folder | chaîne | / data / speech_dataset | Chemin vers les données |
--dev_every | [1, inf) | 10 | Intervalle de développement en termes d'époches |
--dev_pct | [0, 100] | 10 | pourcentage du total défini pour le développement |
--dropout_prob | [0,0, 1,0) | 0,5 | le taux d'abandon à utiliser |
--gpu_no | [-1, n] | 1 | le GPU à utiliser |
--group_speakers_by_id | {vrai, faux} | vrai | Que ce soit pour regrouper les conférenciers à travers le train / dev / test |
--input_file | chaîne | Le chemin vers le modèle à charger | |
--input_length | [1, inf) | 16000 | la longueur de l'audio |
--lr | (0,0, inf) | {0,1, 0,001} | le taux d'apprentissage à utiliser |
--type | {Train, Eval} | former | le mode à utiliser |
--model | chaîne | cnn-trad-pool2 | L'un des 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 | l'élan à utiliser pour SGD |
--n_dct_filters | [1, inf) | 40 | le nombre de bases DCT à utiliser |
--n_epochs | [0, inf) | 500 | Nombre d'époches |
--n_feature_maps | [1, inf) | {19, 45} | le nombre de cartes de fonctionnalités à utiliser pour l'architecture résiduelle |
--n_feature_maps1 | [1, inf) | 64 | le nombre de cartes de fonctionnalités pour conv net 1 |
--n_feature_maps2 | [1, inf) | 64 | le nombre de cartes de fonctionnalités pour conv net 2 |
--n_labels | [1, n) | 4 | le nombre d'étiquettes à utiliser |
--n_layers | [1, inf) | {6, 13, 24} | le nombre de couches de convolution pour l'architecture résiduelle |
--n_mels | [1, inf) | 40 | le nombre de filtres MEL à utiliser |
--no_cuda | changer | FAUX | Que ce soit à utiliser CUDA |
--noise_prob | [0,0, 1,0] | 0.8 | La probabilité de mélange avec le bruit |
--output_file | chaîne | modèle / google-disech-dataset.pt | le fichier pour enregistrer le modèle |
--seed | (inf, inf) | 0 | la graine à utiliser |
--silence_prob | [0,0, 1,0] | 0.1 | La probabilité de choisir le silence |
--test_pct | [0, 100] | 10 | Pourcentage du total défini à utiliser pour les tests |
--timeshift_ms | [0, inf) | 100 | temps en millisecondes pour déplacer l'audio au hasard |
--train_pct | [0, 100] | 80 | pourcentage du total réglé pour la formation |
--unknown_prob | [0,0, 1,0] | 0.1 | la probabilité de choisir un mot inconnu |
--wanted_words | String1 String2 ... Stringn | Commande au hasard | les mots cibles souhaités |
Honkling est une implémentation JavaScript de Honk. Avec Honkling, il est possible d'implémenter diverses applications Web avec des fonctionnalités de repérage de mots clés dans le navigateur.
Afin d'améliorer la flexibilité du klaxon et de la klating, nous fournissons un programme qui construit un ensemble de données à partir de vidéos YouTube. Les détails peuvent être trouvés dans le dossier keyword_spotting_data_generator
Vous pouvez effectuer ce qui suit pour enregistrer l'audio séquentiel et enregistrer au même format que celui de l'ensemble de données de commande de discours:
python -m utils.record
Entrée Retour à l'enregistrement, Up Ferrod to Annule et "Q" pour terminer. Après une seconde de silence, l'enregistrement s'arrête automatiquement.
Plusieurs options sont disponibles:
--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".
Le post-traitement consiste à couper ou à rejeter l'audio "inutile". La coupe est explicite: les enregistrements audio sont coupés à la fenêtre la plus bruyante de x millisecondes, spécifiée par --cutoff-ms
. L'audio "inutile" ( discard_true
) utilise un modèle pré-formé pour déterminer quels échantillons confondent, jetant correctement étiqueté. Le modèle pré-formé et l'étiquette correcte sont définis par --config
et --correct-label
, respectivement.
Par exemple, considérez python -m utils.record --post-process trim discard_true --correct-label no --config config.json
. Dans ce cas, l'utilitaire enregistre une séquence d'extraits de discours, les coupe à une seconde et élimine enfin ceux qui ne sont pas étiquetés "non" par le modèle dans config.json
.
python manage_audio.py listen
Cela aide à définir des valeurs saines pour --min-sound-lvl
pour l'enregistrement.
python manage_audio.py generate-contrastive --directory [directory]
génère des exemples contrastifs de tous les fichiers .wav dans [directory]
en utilisant la segmentation phonétique.
L'ensemble de données de commande de discours contient des extraits d'audio d'une seconde d'une seconde.
python manage_audio.py trim --directory [directory]
coupe le plus fort d'une seconde pour tous les fichiers .wav dans [directory]
. L'utilisateur minutieux doit vérifier manuellement tous les échantillons audio à l'aide d'un éditeur audio comme Audacity.