Honk ist eine Pytorch -Neuimplementierung von Googles TensorFlow -Faltungsnetzwerken für Keywords -Spoting, das die kürzlich veröffentlichte Veröffentlichung ihres Sprachkommandos -Datensatzes begleitet. Weitere Informationen finden Sie in unserer Beschreibung:
Honk ist nützlich, um Spracherkennungsfunktionen für interaktive intelligente Agenten aufzubauen. Unser Code kann verwendet werden, um einfache Befehle (z. B. "Stop" und "Go") zu identifizieren und angepasst zu werden, um benutzerdefinierte "Befehl" Auslöser "(z. B." Hey Siri! ") Zu erkennen.
Schauen Sie sich dieses Video für eine Demo von Honk in Aktion an!
Verwenden Sie die folgenden Anweisungen, um die Demo -Anwendung (im obigen Video angezeigt) selbst auszuführen!
Derzeit bietet Pytorch nur offizielle Unterstützung für Linux und OS X. Daher können Windows -Benutzer diese Demo nicht einfach ausführen.
Führen Sie die folgenden Befehle aus, um die Demo bereitzustellen:
pip install -r requirements.txt
apt-get install freeglut3-dev
)./fetch_data.sh
python .
python utils/speech_demo.py
Wenn Sie Optionen wie das Ausschalten von CUDA anpassen müssen, bearbeiten Sie bitte config.json
.
Zusätzliche Hinweise für Mac OS X:
python .
Bereitet den Webdienst zum Identifizieren bereit, wenn Audio das Befehlswort enthält. Standardmäßig wird config.json
für die Konfiguration verwendet, kann jedoch mit --config=<file_name>
geändert werden. Wenn sich der Server hinter einer Firewall befindet, besteht ein Workflow darin, einen SSH -Tunnel zu erstellen und die Port -Weiterleitung mit dem in config angegebenen Port zu verwenden (Standard 16888).
In unserem Hupen-Models-Repository gibt es mehrere vorgebrachte Modelle für Caffe2 (ONNX) und Pytorch. Das Skript fetch_data.sh
holt diese Modelle ab und extrahiert sie in das model
. Sie können angeben, welches Modell und welches Backend im model_path
und backend
der Konfigurationsdatei verwendet werden sollen. Insbesondere kann backend
entweder caffe2
oder pytorch
sein, je nachdem, in welchem Format model_path
sich befindet. Beachten Sie, dass die onnx
auf Ihrem System auf Ihrem System vorhanden onnx_caffe2
müssen, um unsere ONNX -Modelle auszuführen. Diese fehlen in Anforderungen.txt.
Leider ist es nicht so einfach, dass die Bibliotheken auf dem RPI, insbesondere Librosa, arbeiten, wie ein paar Befehle auszuführen. Wir skizzieren unseren Prozess, der für Sie funktioniert oder nicht.
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
PYTHONPATH
-Umgebungsvariablen den caffe2
-Modulpfad hinzufügen. Für uns wurde dies durch export PYTHONPATH=$PYTHONPATH:/home/pi/caffe2/build
erreichtpip install onnx-caffe2
pip install -r requirements_rpi.txt
pip install --no-deps resampy librosa
python -c "import librosa"
. Es sollte einen Fehler in Bezug auf Numba machen, da wir ihn nicht installiert haben.@numba.jit
von /home/pi/.local/lib/python2.7/site-packages/resampy/interpn.py
entfernen./fetch_data.sh
config.json
backend
in caffe2
und model_path
in model/google-speech-dataset-full.onnx
.python .
Wenn es keine Fehler gibt, haben Sie das Modell, das standardmäßig über Port 16888 zugänglich ist, erfolgreich bereitgestellt.python utils/speech_demo.py
. Sie benötigen ein funktionierendes Mikrofon und Lautsprecher. Wenn Sie mit Ihrem RPI aus der Ferne interagieren, können Sie die Sprachdemo lokal ausführen und den Remote-Endpunkt angeben --server-endpoint=http://[RPi IP address]:16888
. Leider hat der QA -Kunde noch keine Unterstützung für die breite Öffentlichkeit, da er einen benutzerdefinierten QA -Service erfordert. Es kann jedoch weiterhin verwendet werden, um das Befehlsschlüsselwort zu retargetieren.
python client.py
leitet den QA -Client aus. Sie können ein Schlüsselwort retargetieren, indem Sie python client.py --mode=retarget
machen. Bitte beachten Sie, dass Text-to-Speech bei Linux-Distributionen möglicherweise nicht gut funktioniert. In diesem Fall liefern Sie bitte IBM Watson-Anmeldeinformationen über --watson-username
und --watson--password
. Sie können alle Optionen ansehen, indem Sie python client.py -h
durchführen.
CNN -Modelle . python -m utils.train --type [train|eval]
Trains oder bewertet das Modell. Es wird erwartet, dass alle Schulungsbeispiele dem gleichen Format wie das von Sprachbefehlsdatensatz folgen. Der empfohlene Workflow besteht darin, den Datensatz herunterzuladen und benutzerdefinierte Schlüsselwörter hinzuzufügen, da der Datensatz bereits viele nützliche Audio -Samples und Hintergrundgeräusche enthält.
Restmodelle . Wir empfehlen die folgenden Hyperparameter für die Schulung eines unserer res{8,15,26}[-narrow]
-Modelle im Sprachbefehlsdatensatz:
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]
Weitere Informationen zu unseren tiefen Restmodellen finden Sie in unserem Artikel:
Es sind Befehlsoptionen verfügbar:
Option | Eingabeformat | Standard | Beschreibung |
---|---|---|---|
--audio_preprocess_type | {Mfccs, pcen} | MFCCS | Art der zu verwendenden Audiovorverarbeitungen |
--batch_size | [1, n) | 100 | die zu verwendende Mini-Batch-Größe |
--cache_size | [0, inf) | 32768 | Anzahl der Elemente im Audio -Cache, konsumiert rund 32 kb * n |
--conv1_pool | [1, inf) [1, Inf) | 2 2 | Die Breite und Höhe des Poolfilters |
--conv1_size | [1, inf) [1, Inf) | 10 4 | Die Breite und Höhe des Konvolterfilters |
--conv1_stride | [1, inf) [1, Inf) | 1 1 | Die Breite und Länge des Schrittes |
--conv2_pool | [1, inf) [1, Inf) | 1 1 | Die Breite und Höhe des Poolfilters |
--conv2_size | [1, inf) [1, Inf) | 10 4 | Die Breite und Höhe des Konvolterfilters |
--conv2_stride | [1, inf) [1, Inf) | 1 1 | Die Breite und Länge des Schrittes |
--data_folder | Saite | /data/real_dataset | Weg zu Daten |
--dev_every | [1, inf) | 10 | Dev -Intervall in Bezug auf Epochen |
--dev_pct | [0, 100] | 10 | Prozentsatz der Gesamtmenge für Dev |
--dropout_prob | [0,0, 1,0) | 0,5 | die zu verwendende Abbrecherrate |
--gpu_no | [-1, n] | 1 | die GPU zu verwenden |
--group_speakers_by_id | {wahr, false} | WAHR | ob die Sprecher über Zug/Dev/Test gruppieren sollen |
--input_file | Saite | Der Weg zum Modell zum Laden | |
--input_length | [1, inf) | 16000 | Die Länge des Audios |
--lr | (0.0, Inf) | {0,1, 0,001} | die zu verwendende Lernrate |
--type | {Zug, eval} | Zug | der Modus zu verwenden |
--model | Saite | cnn-trad-pool2 | Eine von 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 | die Dynamik für SGD |
--n_dct_filters | [1, inf) | 40 | die Anzahl der zu verwendenden DCT -Basen |
--n_epochs | [0, inf) | 500 | Anzahl der Epochen |
--n_feature_maps | [1, inf) | {19, 45} | Die Anzahl der Feature -Karten, die für die Restarchitektur verwendet werden sollen |
--n_feature_maps1 | [1, inf) | 64 | Die Anzahl der Feature -Karten für das Überzeugungsnetz 1 |
--n_feature_maps2 | [1, inf) | 64 | Die Anzahl der Feature -Karten für überreviertes Net 2 |
--n_labels | [1, n) | 4 | die Anzahl der zu verwendenden Etiketten |
--n_layers | [1, inf) | {6, 13, 24} | Die Anzahl der Faltungsschichten für die Restarchitektur |
--n_mels | [1, inf) | 40 | die Anzahl der zu verwendenden MEL -Filter |
--no_cuda | schalten | FALSCH | Ob Sie CUDA verwenden möchten |
--noise_prob | [0,0, 1,0] | 0,8 | Die Wahrscheinlichkeit eines Mischens mit Rauschen |
--output_file | Saite | Modell/Google-Speech-Dataset.pt | Die Datei zum Speichern des Modells auf |
--seed | (Inf, Inf) | 0 | der Samen zu verwenden |
--silence_prob | [0,0, 1,0] | 0,1 | die Wahrscheinlichkeit, Stille zu wählen |
--test_pct | [0, 100] | 10 | Prozentsatz der zum Testen verwendeten Gesamtmenge |
--timeshift_ms | [0, inf) | 100 | Zeit in Millisekunden, um das Audio zufällig zu verschieben |
--train_pct | [0, 100] | 80 | Prozentsatz der Gesamtmenge für das Training |
--unknown_prob | [0,0, 1,0] | 0,1 | Die Wahrscheinlichkeit, ein unbekanntes Wort auszuwählen |
--wanted_words | String1 String2 ... Stringn | Befehl zufällig | Die gewünschten Zielwörter |
Hupen ist eine JavaScript -Implementierung von Honk. Mit Hupen ist es möglich, verschiedene Webanwendungen mit der Keyword-Spoting-Funktionalität des In-Browser-Keywords zu implementieren.
Um die Flexibilität von Hupen und Hupen zu verbessern, bieten wir ein Programm an, das einen Datensatz aus YouTube -Videos erstellt. Details finden Sie im Ordner keyword_spotting_data_generator
Sie können Folgendes ausführen, um sequentielle Audio zu erfassen und im selben Format wie das des Rede -Befehlsdatensatzes zu speichern:
python -m utils.record
Eingabe kehren zu Aufzeichnungen, auf Pfeil zurück und "q", um fertig zu werden. Nach einer Sekunde Stille hält die Aufzeichnung automatisch an.
Es sind mehrere Optionen verfügbar:
--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".
Nachbearbeitung besteht aus dem Trimmen oder Abwerfen von "nutzlosen" Audio. Das Trimmen ist selbsterklärend: Die Audioaufnahmen sind bis zum lautesten Fenster von X Millisekunden, angegeben von --cutoff-ms
, angegeben. Das Verwerfen von "nutzloser" Audio ( discard_true
) verwendet ein vorgebildetes Modell, um zu bestimmen, welche Stichproben verwirrend sind und korrekt beschriftete. Das vorgebreitete Modell und die korrekte Etikett werden durch --config
und --correct-label
definiert.
Betrachten Sie beispielsweise python -m utils.record --post-process trim discard_true --correct-label no --config config.json
. In diesem Fall zeichnet das Dienstprogramm eine Abfolge von Sprachausschnitten auf, schneidet sie auf eine Sekunde und verwirft schließlich diejenigen, die vom Modell in config.json
nicht als "Nein" bezeichnet werden.
python manage_audio.py listen
Dies hilft bei der Festlegung von gesunden Werten für --min-sound-lvl
für die Aufzeichnung.
python manage_audio.py generate-contrastive --directory [directory]
erzeugt kontrastive Beispiele aus allen .wav-Dateien in [directory]
mithilfe der phonetischen Segmentierung.
Sprachbefehlsdatensatz enthält ein Sekunden lang lange Audioausschnitte.
python manage_audio.py trim --directory [directory]
ist für alle .WAV-Dateien in [directory]
bis zum lautesten Ein Sekunde. Der sorgfältige Benutzer sollte alle Audio -Samples mit einem Audio -Editor wie Audacity manuell überprüfen.