Les assistants à domicile nécessitent des expressions spéciales appelées mots clés pour être activés (par exemple, « OK Google »). EfficientWord-Net est un moteur de détection de mots clés basé sur un apprentissage en quelques étapes qui permet aux développeurs d'ajouter des mots clés personnalisés à leurs programmes sans frais supplémentaires. La bibliothèque est purement écrite en Python et utilise l'implémentation TFLite de Google pour une inférence en temps réel plus rapide. Il s'inspire de l'architecture de réseau siamois de FaceNet et fonctionne mieux lorsque 3 à 4 échantillons de mots clés sont collectés directement auprès de l'utilisateur.
Dossier de formation pour accéder au dossier de formation.
Voici les liens :
Document de recherche pour accéder au document de recherche.
Cette bibliothèque fonctionne avec les versions 3.6 à 3.9 de Python.
Avant d'exécuter la commande d'installation pip pour la bibliothèque, quelques dépendances doivent être installées manuellement :
Les utilisateurs de Mac OS M* et Raspberry Pi devront peut-être compiler ces dépendances.
Le package tflite ne peut pas être répertorié dans Requirements.txt, il sera donc automatiquement installé lorsque le package sera initialisé dans le système.
Le package librosa n'est pas requis pour les cas d'inférence uniquement. Cependant, lorsque generate_reference
est appelé, il sera automatiquement installé.
Exécutez la commande pip suivante :
pip install EfficientWord-Net
Pour importer le package :
import eff_word_net
Après avoir installé les packages, vous pouvez exécuter le script de démonstration intégré à la bibliothèque (assurez-vous d'avoir un microphone fonctionnel).
Accédez à la documentation depuis : https://ant-brain.github.io/EfficientWord-Net/
Commande pour exécuter la démo :
python -m eff_word_net.engine
Pour tout nouveau mot clé, la bibliothèque a besoin d'informations sur le mot clé. Ces informations sont obtenues à partir d'un fichier appelé {wakeword}_ref.json
. Par exemple, pour le mot d'éveil « alexa », la bibliothèque aurait besoin du fichier appelé alexa_ref.json
.
Ces fichiers peuvent être générés avec la procédure suivante :
Recueillez 4 à 10 prononciations uniques d’un mot d’éveil donné. Mettez-les dans un dossier séparé qui ne contient rien d'autre.
Vous pouvez également utiliser la commande suivante pour générer des fichiers audio pour un mot donné (utilise l'API de démonstration IBM neural TTS). S'il vous plaît, n'en abusez pas pour notre bien :
python -m eff_word_net.ibm_generate
python -m eff_word_net.generate_reference
Le chemin d'accès du wakeword généré doit être transmis à l'instance HotwordDetector :
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
)
La variable modèle peut recevoir une instance de Resnet_50_Arc_loss ou First_Iteration_Siamese.
Le paramètre relaxation_time est utilisé pour déterminer le temps minimum entre deux déclencheurs. Tout déclenchement potentiel avant le relaxation_time sera annulé. Le détecteur fonctionne selon une approche à fenêtre glissante, ce qui entraîne plusieurs déclenchements pour une seule prononciation d'un mot clé. Le paramètre relaxation_time peut être utilisé pour contrôler plusieurs déclencheurs ; dans la plupart des cas, 0,8 seconde (par défaut) suffira.
La bibliothèque propose des intégrations prédéfinies facilement disponibles pour quelques mots d'éveil tels que Mycroft , Google , Firefox , Alexa , Mobile et Siri . Leurs chemins sont facilement disponibles dans le répertoire d'installation de la bibliothèque.
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" ])
La bibliothèque fournit un moyen convivial de détecter plusieurs mots clés dans un flux donné, au lieu d'exécuter scoreFrame()
pour chaque mot clé individuellement.
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 } " )
Accédez à la documentation de la bibliothèque à partir d'ici : https://ant-brain.github.io/EfficientWord-Net/
Voici la version corrigée du fichier README.md avec une grammaire et un formatage améliorés :
Les performances de notre détecteur de mots clés sont nettement inférieures à celles de Porcupine. Nous avons réfléchi à de meilleures architectures NN pour le moteur et espérons surpasser Porcupine. Il s’agit de notre projet de premier cycle, votre soutien et vos encouragements nous motiveront donc à développer davantage le moteur. Si vous aimez ce projet, recommandez-le à vos pairs, donnez-nous un ? sur GitHub, et un applaudissement ? sur Moyen.
Mise à jour : Vos étoiles nous ont encouragés à créer un nouveau modèle bien meilleur. Faisons grandir cette communauté !
Licence Apache 2.0