Heimassistenten benötigen zur Aktivierung spezielle Phrasen, sogenannte Hotwords (z. B. „OK Google“). EfficientWord-Net ist eine Hotword-Erkennungs-Engine, die auf Fow-Shot-Learning basiert und es Entwicklern ermöglicht, ohne zusätzliche Kosten benutzerdefinierte Hotwords zu ihren Programmen hinzuzufügen. Die Bibliothek ist ausschließlich in Python geschrieben und nutzt die TFLite-Implementierung von Google für schnellere Echtzeit-Inferenz. Es ist von der siamesischen Netzwerkarchitektur von FaceNet inspiriert und erzielt die beste Leistung, wenn 3-4 Hotword-Beispiele direkt vom Benutzer gesammelt werden.
Trainingsdatei, um auf die Trainingsdatei zuzugreifen.
Hier sind die Links:
Forschungspapier, um auf das Forschungspapier zuzugreifen.
Diese Bibliothek funktioniert mit den Python-Versionen 3.6 bis 3.9.
Bevor Sie den pip-Installationsbefehl für die Bibliothek ausführen, müssen einige Abhängigkeiten manuell installiert werden:
Benutzer von Mac OS M* und Raspberry Pi müssen diese Abhängigkeiten möglicherweise kompilieren.
Das tflite -Paket kann nicht in der Datei „requirements.txt“ aufgeführt werden, daher wird es automatisch installiert, wenn das Paket im System initialisiert wird.
Das librosa- Paket ist für Nur-Inferenz-Fälle nicht erforderlich. Wenn jedoch generate_reference
aufgerufen wird, wird es automatisch installiert.
Führen Sie den folgenden Pip-Befehl aus:
pip install EfficientWord-Net
So importieren Sie das Paket:
import eff_word_net
Nach der Installation der Pakete können Sie das in die Bibliothek integrierte Demo-Skript ausführen (stellen Sie sicher, dass Sie über ein funktionierendes Mikrofon verfügen).
Zugriff auf die Dokumentation unter: https://ant-brain.github.io/EfficientWord-Net/
Befehl zum Ausführen der Demo:
python -m eff_word_net.engine
Für jedes neue Hotword benötigt die Bibliothek Informationen über das Hotword. Diese Informationen werden aus einer Datei namens {wakeword}_ref.json
abgerufen. Für das Wakeword „alexa“ benötigt die Bibliothek beispielsweise die Datei alexa_ref.json
.
Diese Dateien können mit dem folgenden Verfahren generiert werden:
Sammeln Sie 4 bis 10 einzigartig klingende Aussprachen eines bestimmten Wakewords. Legen Sie sie in einen separaten Ordner ab, der nichts anderes enthält.
Alternativ können Sie den folgenden Befehl verwenden, um Audiodateien für ein bestimmtes Wort zu generieren (verwendet die IBM Neural TTS-Demo-API). Bitte übertreiben Sie es nicht für uns:
python -m eff_word_net.ibm_generate
python -m eff_word_net.generate_reference
Der Pfadname des generierten Wakewords muss an die HotwordDetector-Instanz übergeben werden:
HotwordDetector (
hotword = "hello" ,
model = Resnet_50_Arc_loss (),
reference_file = "/full/path/name/of/hello_ref.json" ,
threshold = 0.9 , # min confidence required to consider a trigger
relaxation_time = 0.8 # default value, in seconds
)
Die Modellvariable kann eine Instanz von Resnet_50_Arc_loss oder First_Iteration_Siamese empfangen.
Der Parameter „relaxation_time“ wird verwendet, um die Mindestzeit zwischen zwei beliebigen Auslösern zu bestimmen. Alle möglichen Auslöser vor der relax_time werden abgebrochen. Der Detektor arbeitet mit einem Schiebefenster-Ansatz, was zu mehreren Auslösern für eine einzelne Äußerung eines Hotwords führt. Der Parameter „relaxation_time“ kann zur Steuerung mehrerer Trigger verwendet werden; In den meisten Fällen reichen 0,8 Sekunden (Standard) aus.
Die Bibliothek verfügt über vordefinierte Einbettungen, die für einige Wakewords wie Mycroft , Google , Firefox , Alexa , Mobile und Siri verfügbar sind. Ihre Pfade sind im Installationsverzeichnis der Bibliothek leicht verfügbar.
from eff_word_net import samples_loc
import os
from eff_word_net . streams import SimpleMicStream
from eff_word_net . engine import HotwordDetector
from eff_word_net . audio_processing import Resnet50_Arc_loss
from eff_word_net import samples_loc
base_model = Resnet50_Arc_loss ()
mycroft_hw = HotwordDetector (
hotword = "mycroft" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "mycroft_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2
)
mic_stream = SimpleMicStream (
window_length_secs = 1.5 ,
sliding_window_secs = 0.75 ,
)
mic_stream . start_stream ()
print ( "Say Mycroft " )
while True :
frame = mic_stream . getFrame ()
result = mycroft_hw . scoreFrame ( frame )
if result == None :
#no voice activity
continue
if ( result [ "match" ]):
print ( "Wakeword uttered" , result [ "confidence" ])
Die Bibliothek bietet eine rechenfreundliche Möglichkeit, mehrere Hotwords aus einem bestimmten Stream zu erkennen, anstatt scoreFrame()
für jedes Wakeword einzeln auszuführen
import os
from eff_word_net . streams import SimpleMicStream
from eff_word_net import samples_loc
print ( samples_loc )
base_model = Resnet50_Arc_loss ()
mycroft_hw = HotwordDetector (
hotword = "mycroft" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "mycroft_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2
)
alexa_hw = HotwordDetector (
hotword = "alexa" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "alexa_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2 ,
#verbose=True
)
computer_hw = HotwordDetector (
hotword = "computer" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "computer_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2 ,
#verbose=True
)
multi_hotword_detector = MultiHotwordDetector (
[ mycroft_hw , alexa_hw , computer_hw ],
model = base_model ,
continuous = True ,
)
mic_stream = SimpleMicStream ( window_length_secs = 1.5 , sliding_window_secs = 0.75 )
mic_stream . start_stream ()
print ( "Say " , " / " . join ([ x . hotword for x in multi_hotword_detector . detector_collection ]))
while True :
frame = mic_stream . getFrame ()
result = multi_hotword_detector . findBestMatch ( frame )
if ( None not in result ):
print ( result [ 0 ], f",Confidence { result [ 1 ]:0.4f } " )
Zugriff auf die Dokumentation der Bibliothek finden Sie hier: https://ant-brain.github.io/EfficientWord-Net/
Hier ist die korrigierte Version der README.md-Datei mit verbesserter Grammatik und Formatierung:
Die Leistung unseres Hotword-Detektors ist im Vergleich zu Porcupine deutlich geringer. Wir haben über bessere NN-Architekturen für die Engine nachgedacht und hoffen, Porcupine zu übertreffen. Dies war unser Bachelor-Projekt, daher werden Ihre Unterstützung und Ihre Ermutigung uns motivieren, den Motor weiterzuentwickeln. Wenn Ihnen dieses Projekt gefällt, empfehlen Sie es Ihren Kollegen und geben Sie uns ein ? auf GitHub und ein Klatschen? auf Mittel.
Update: Ihre Sterne haben uns ermutigt, ein neues Modell zu entwickeln, das weitaus besser ist. Lasst uns diese Community wachsen lassen!
Apache-Lizenz 2.0