Honk es una reimplementación de Pytorch de las redes neuronales convolucionales de TensorFlow TensorFlow para detectar palabras clave, que acompaña la reciente lanzamiento de su conjunto de datos de comandos de habla. Para más detalles, consulte nuestro artículo:
Honk es útil para construir capacidades de reconocimiento de voz en el dispositivo para agentes inteligentes interactivos. Nuestro código se puede usar para identificar comandos simples (por ejemplo, "parar" y "ir") y adaptarse para detectar "disparadores de comandos" personalizados (por ejemplo, "¡Hola Siri!").
¡Mira este video para una demostración de Honk in Action!
¡Use las instrucciones a continuación para ejecutar la aplicación de demostración (que se muestra en el video anterior) usted mismo!
Actualmente, Pytorch tiene soporte oficial solo para Linux y OS X. Por lo tanto, los usuarios de Windows no podrán ejecutar esta demostración fácilmente.
Para implementar la demostración, ejecute los siguientes comandos:
pip install -r requirements.txt
apt-get install freeglut3-dev
)./fetch_data.sh
python .
python utils/speech_demo.py
Si necesita ajustar las opciones, como apagar CUDA, edite config.json
.
Notas adicionales para Mac OS X:
python .
implementa el servicio web para identificar si el audio contiene la palabra de comando. Por defecto, config.json
se usa para la configuración, pero eso se puede cambiar con --config=<file_name>
. Si el servidor está detrás de un firewall, un flujo de trabajo es crear un túnel SSH y usar el reenvío de puerto con el puerto especificado en config (predeterminado 16888).
En nuestro repositorio de modelos Honk, hay varios modelos previamente capacitados para Caffe2 (ONNX) y Pytorch. El script fetch_data.sh
obtiene estos modelos y los extrae al directorio model
. Puede especificar qué modelo y backend usar en el model_path
y backend
del archivo de configuración, respectivamente. Específicamente, backend
puede ser caffe2
o pytorch
, dependiendo de qué formato se encuentre model_path
. Tenga en cuenta que, para ejecutar nuestros modelos ONNX, los paquetes onnx
y onnx_caffe2
deben estar presentes en su sistema; Estos están ausentes en requisitos.txt.
Desafortunadamente, hacer que las bibliotecas funcionen en el RPI, especialmente Librosa, no es tan sencillo como ejecutar algunos comandos. Describimos nuestro proceso, que puede o no funcionar para usted.
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
a la variable de entorno PYTHONPATH
. Para nosotros, esto fue logrado por 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"
. Debería lanzar un error con respecto a Numba, ya que no lo hemos instalado.@numba.jit
de /home/pi/.local/lib/python2.7/site-packages/resampy/interpn.py
./fetch_data.sh
config.json
, cambie backend
a caffe2
y model_path
a model/google-speech-dataset-full.onnx
.python .
Si no hay errores, ha implementado con éxito el modelo, accesible a través del puerto 16888 de forma predeterminada.python utils/speech_demo.py
. Necesitará un micrófono y altavoces que funcionen. Si está interactuando con su RPI de forma remota, puede ejecutar la demostración de discurso localmente y especificar el punto final remoto --server-endpoint=http://[RPi IP address]:16888
. Desafortunadamente, el cliente de control de calidad aún no tiene soporte para el público en general, ya que requiere un servicio de control de calidad personalizado. Sin embargo, todavía se puede usar para reorientar la palabra clave de comando.
python client.py
ejecuta el cliente de control de calidad. Puede reorientar una palabra clave haciendo python client.py --mode=retarget
. Tenga en cuenta que el texto a la voz puede no funcionar bien en las distribuciones de Linux; En este caso, suministre credenciales de IBM Watson a través de --watson-username
y --watson--password
. Puede ver todas las opciones haciendo python client.py -h
.
Modelos CNN . python -m utils.train --type [train|eval]
Trains o evalúa el modelo. Espera que todos los ejemplos de capacitación sigan el mismo formato que el del conjunto de datos de comandos del habla. El flujo de trabajo recomendado es descargar el conjunto de datos y agregar palabras clave personalizadas, ya que el conjunto de datos ya contiene muchas muestras de audio útiles y ruido de fondo.
Modelos residuales . Recomendamos los siguientes hiperparámetros para capacitar a cualquiera de nuestros modelos res{8,15,26}[-narrow]
en el conjunto de datos de comandos del habla:
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]
Para obtener más información sobre nuestros modelos residuales profundos, consulte nuestro artículo:
Hay opciones de comando disponibles:
opción | formato de entrada | por defecto | descripción |
---|---|---|---|
--audio_preprocess_type | {MFCCS, PCEN} | MFCCS | Tipo de preproceso de audio para usar |
--batch_size | [1, n) | 100 | el tamaño de mini lotes para usar |
--cache_size | [0, inf) | 32768 | Número de artículos en caché de audio, consume alrededor de 32 kb * n |
--conv1_pool | [1, inf) [1, inf) | 2 2 | el ancho y la altura del filtro de la piscina |
--conv1_size | [1, inf) [1, inf) | 10 4 | el ancho y la altura del filtro de convivir |
--conv1_stride | [1, inf) [1, inf) | 1 1 | el ancho y la longitud del paso |
--conv2_pool | [1, inf) [1, inf) | 1 1 | el ancho y la altura del filtro de la piscina |
--conv2_size | [1, inf) [1, inf) | 10 4 | el ancho y la altura del filtro de convivir |
--conv2_stride | [1, inf) [1, inf) | 1 1 | el ancho y la longitud del paso |
--data_folder | cadena | /Data/Speech_dataset | camino a los datos |
--dev_every | [1, inf) | 10 | intervalo de desarrollo en términos de épocas |
--dev_pct | [0, 100] | 10 | Porcentaje del total establecido para usar para Dev |
--dropout_prob | [0.0, 1.0) | 0.5 | la tasa de abandono para usar |
--gpu_no | [-1, n] | 1 | la GPU para usar |
--group_speakers_by_id | {Verdadero, Falso} | verdadero | si agrupan los altavoces a través del tren/dev/test |
--input_file | cadena | la ruta al modelo para cargar | |
--input_length | [1, inf) | 16000 | la longitud del audio |
--lr | (0.0, inf) | {0.1, 0.001} | la tasa de aprendizaje para usar |
--type | {tren, eval} | tren | el modo para usar |
--model | cadena | CNN-Trad-Pool2 | Uno de 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 | el impulso de usar para SGD |
--n_dct_filters | [1, inf) | 40 | el número de bases DCT para usar |
--n_epochs | [0, inf) | 500 | número de épocas |
--n_feature_maps | [1, inf) | {19, 45} | El número de mapas de características para usar para la arquitectura residual |
--n_feature_maps1 | [1, inf) | 64 | El número de mapas de características para Conv Net 1 |
--n_feature_maps2 | [1, inf) | 64 | El número de mapas de características para Conv Net 2 |
--n_labels | [1, n) | 4 | el número de etiquetas para usar |
--n_layers | [1, inf) | {6, 13, 24} | el número de capas de convolución para la arquitectura residual |
--n_mels | [1, inf) | 40 | el número de filtros MEL para usar |
--no_cuda | cambiar | FALSO | si usar CUDA |
--noise_prob | [0.0, 1.0] | 0.8 | La probabilidad de mezclar con ruido |
--output_file | cadena | modelo/google-speech-dataset.pt | el archivo para guardar el modelo en |
--seed | (Inf, Inf) | 0 | la semilla para usar |
--silence_prob | [0.0, 1.0] | 0.1 | La probabilidad de elegir el silencio |
--test_pct | [0, 100] | 10 | Porcentaje del total establecido para usar para las pruebas |
--timeshift_ms | [0, inf) | 100 | tiempo en milisegundos para cambiar el audio al azar |
--train_pct | [0, 100] | 80 | Porcentaje del total establecido para el entrenamiento |
--unknown_prob | [0.0, 1.0] | 0.1 | la probabilidad de elegir una palabra desconocida |
--wanted_words | String1 String2 ... Stringn | comando aleatorio | las palabras objetivo deseadas |
Honkling es una implementación de JavaScript de Honk. Con el bocina, es posible implementar varias aplicaciones web con la funcionalidad de detección de palabras clave en el navegador.
Para mejorar la flexibilidad de la bocina y el boiling, proporcionamos un programa que construye un conjunto de datos a partir de videos de YouTube. Los detalles se pueden encontrar en la carpeta keyword_spotting_data_generator
Puede hacer lo siguiente para grabar audio secuencial y guardar en el mismo formato que el del conjunto de datos de comando de voz:
python -m utils.record
Ingrese el regreso para grabar, Arrow Up para deshacer y "Q" para finalizar. Después de un segundo de silencio, la grabación se detiene automáticamente.
Hay varias opciones 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".
El procesamiento posterior consiste en recortar o descartar audio "inútil". El recorte se explica por sí mismo: las grabaciones de audio se recortan a la ventana más fuerte de X milisegundos, especificados por --cutoff-ms
. Descartar el audio "inútil" ( discard_true
) utiliza un modelo previamente capacitado para determinar qué muestras son confusas, descartando las etiquetadas correctamente. El modelo previamente capacitado y la etiqueta correcta se definen por --config
y --correct-label
, respectivamente.
Por ejemplo, considere python -m utils.record --post-process trim discard_true --correct-label no --config config.json
. En este caso, la utilidad registra una secuencia de fragmentos de voz, los recorta a un segundo y finalmente descarta aquellos no etiquetados "No" por el modelo en config.json
.
python manage_audio.py listen
Esto ayuda a establecer valores SANE para --min-sound-lvl
para la grabación.
python manage_audio.py generate-contrastive --directory [directory]
genera ejemplos de contraste de todos los archivos .WAV en [directory]
utilizando segmentación fonética.
El conjunto de datos de comando de voz contiene fragmentos de audio de un segundo largo.
python manage_audio.py trim --directory [directory]
se transmite al más fuerte de un segundo para todos los archivos .WAV en [directory]
. El usuario cuidadoso debe verificar manualmente todas las muestras de audio utilizando un editor de audio como Audacity.