Los asistentes domésticos requieren frases especiales llamadas palabras activas para activarse (por ejemplo, "OK Google"). EfficientWord-Net es un motor de detección de palabras clave basado en el aprendizaje en pocas ocasiones que permite a los desarrolladores agregar palabras clave personalizadas a sus programas sin cargos adicionales. La biblioteca está escrita exclusivamente en Python y utiliza la implementación TFLite de Google para una inferencia más rápida en tiempo real. Está inspirado en la arquitectura de red siamesa de FaceNet y funciona mejor cuando se recopilan de 3 a 4 muestras de palabras clave directamente del usuario.
Archivo de entrenamiento para acceder al archivo de entrenamiento.
Aquí están los enlaces:
Trabajo de Investigación para acceder al trabajo de investigación.
Esta biblioteca funciona con las versiones de Python 3.6 a 3.9.
Antes de ejecutar el comando de instalación de pip para la biblioteca, es necesario instalar algunas dependencias manualmente:
Es posible que los usuarios de Mac OS M* y Raspberry Pi tengan que compilar estas dependencias.
El paquete tflite no puede incluirse en requisitos.txt, por lo que se instalará automáticamente cuando el paquete se inicialice en el sistema.
El paquete librosa no es necesario para casos de sólo inferencia. Sin embargo, cuando se llama generate_reference
, se instalará automáticamente.
Ejecute el siguiente comando pip:
pip install EfficientWord-Net
Para importar el paquete:
import eff_word_net
Después de instalar los paquetes, puede ejecutar el script de demostración integrado en la biblioteca (asegúrese de tener un micrófono que funcione).
Acceda a la documentación desde: https://ant-brain.github.io/EfficientWord-Net/
Comando para ejecutar la demostración:
python -m eff_word_net.engine
Para cualquier palabra activa nueva, la biblioteca necesita información sobre la palabra activa. Esta información se obtiene de un archivo llamado {wakeword}_ref.json
. Por ejemplo, para la palabra de activación 'alexa', la biblioteca necesitaría el archivo llamado alexa_ref.json
.
Estos archivos se pueden generar con el siguiente procedimiento:
Recopile de 4 a 10 pronunciaciones que suenen únicas de una palabra clave determinada. Colóquelos en una carpeta separada que no contenga nada más.
Como alternativa, utilice el siguiente comando para generar archivos de audio para una palabra determinada (utiliza la API de demostración de TTS neuronal de IBM). Por favor, no lo abuses por nuestro bien:
python -m eff_word_net.ibm_generate
python -m eff_word_net.generate_reference
El nombre de ruta de la palabra de activación generada debe pasarse a la instancia de 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 del modelo puede recibir una instancia de Resnet_50_Arc_loss o First_Iteration_Siamese.
El parámetro relax_time se utiliza para determinar el tiempo mínimo entre dos activadores. Se cancelará cualquier posible desencadenante antes del tiempo de relajación. El detector funciona con un enfoque de ventana deslizante, lo que genera múltiples activadores para una sola pronunciación de una palabra activa. El parámetro relax_time se puede utilizar para controlar múltiples activadores; en la mayoría de los casos, 0,8 segundos (predeterminado) serán suficientes.
La biblioteca tiene incrustaciones predefinidas disponibles para algunas palabras de activación como Mycroft , Google , Firefox , Alexa , Mobile y Siri . Sus rutas están disponibles en el directorio de instalación de la biblioteca.
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 biblioteca proporciona una forma fácil de calcular para detectar múltiples palabras activas de una secuencia determinada, en lugar de ejecutar scoreFrame()
de cada palabra activa individualmente.
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 } " )
Acceda a la documentación de la biblioteca desde aquí: https://ant-brain.github.io/EfficientWord-Net/
Aquí está la versión corregida del archivo README.md con gramática y formato mejorados:
El rendimiento de nuestro detector de palabras activas es notablemente inferior en comparación con Porcupine. Hemos pensado en mejores arquitecturas NN para el motor y esperamos superar a Porcupine. Este ha sido nuestro proyecto de pregrado, por lo que su apoyo y aliento nos motivarán a seguir desarrollando el motor. Si te encanta este proyecto, recomiéndalo a tus compañeros, danos un ? en GitHub y un aplauso? en Medio.
Actualización: Tus estrellas nos animaron a crear un nuevo modelo que es mucho mejor. ¡Hagamos crecer esta comunidad!
Licencia Apache 2.0