Honk是Google的TensorFlow卷积神经网络的Pytorch重新实现,用于关键字点,这伴随着他们最近发行的语音命令数据集。有关更多详细信息,请咨询我们的文章:
Honk对于为交互式智能代理人建立了设备上的语音识别能力很有用。我们的代码可用于识别简单的命令(例如,“停止”和“ go”),并适用于检测自定义“命令触发器”(例如,“嘿Siri!”)。
观看此视频,以获取Action Honk的演示!
使用下面的说明来运行演示应用程序(如上所述)!
当前,Pytorch仅对Linux和OS X有官方的支持。因此,Windows用户将无法轻松运行此演示。
要部署演示,请运行以下命令:
pip install -r requirements.txt
apt-get install freeglut3-dev
)./fetch_data.sh
python .
python utils/speech_demo.py
如果您需要调整选项,例如关闭CUDA,请编辑config.json
。
Mac OS X的其他注释:
python .
部署Web服务以识别音频是否包含命令字。默认情况下, config.json
用于配置,但可以使用--config=<file_name>
更改。如果服务器在防火墙后面,则一个工作流程是创建一个SSH隧道并使用配置中指定的端口(默认16888)中的端口转发。
在我们的Honk-Models存储库中,有几种用于CAFFE2(ONNX)和Pytorch的预培训模型。 fetch_data.sh
脚本获取这些模型并将它们提取到model
目录。您可以分别指定在配置文件的model_path
和backend
中使用的模型和后端。具体而言, backend
可以是caffe2
或pytorch
,具体取决于model_path
所处的格式。请注意,要运行我们的ONNX型号,必须在系统上存在onnx
和onnx_caffe2
的软件包;这些在需求中不存在。
不幸的是,让图书馆在RPI上工作,尤其是天秤座,并不像运行几个命令那样简单。我们概述了我们的流程,这可能对您有效,也可能不起作用。
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
模块路径添加到PYTHONPATH
环境变量。对我们来说,这是通过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"
。由于我们尚未安装它,因此应该对Numba丢下错误。/home/pi/.local/lib/python2.7/site-packages/resampy/interpn.py
删除numba和@numba.jit
./fetch_data.sh
config.json
中,将backend
更改为caffe2
和model_path
更改为model/google-speech-dataset-full.onnx
。python .
如果没有错误,您已经成功部署了该模型,默认情况下可以通过端口16888访问。python utils/speech_demo.py
。您需要一个工作的麦克风和扬声器。如果您远程与RPI进行交互,则可以在本地运行语音演示,并指定远程端点--server-endpoint=http://[RPi IP address]:16888
。 不幸的是,质量保证客户端尚不支持公众,因为它需要自定义质量保证服务。但是,它仍然可以用来重新定位命令关键字。
python client.py
运行QA客户端。您可以通过执行python client.py --mode=retarget
来重新制定关键字。请注意,文本到语音在Linux发行版上可能无法正常工作;在这种情况下,请通过--watson-username
和--watson--password
提供IBM Watson凭据。您可以通过执行python client.py -h
查看所有选项。
CNN模型。 python -m utils.train --type [train|eval]
训练或评估模型。它希望所有培训示例都遵循与语音命令数据集相同的格式。建议的工作流程是下载数据集并添加自定义关键字,因为数据集已经包含许多有用的音频示例和背景噪声。
剩余模型。我们建议使用以下用于培训我们的任何res{8,15,26}[-narrow]
模型的超参数:
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]
有关我们深层剩余模型的更多信息,请参阅我们的论文:
有命令选项可用:
选项 | 输入格式 | 默认 | 描述 |
---|---|---|---|
--audio_preprocess_type | {MFCC,PCEN} | MFCC | 使用的音频预处理 |
--batch_size | [1,N) | 100 | 用于使用的迷你批量尺寸 |
--cache_size | [0,INF) | 32768 | 音频缓存中的项目数量,消耗约32 kb * n |
--conv1_pool | [1,INF)[1,INF) | 2 2 | 泳池过滤器的宽度和高度 |
--conv1_size | [1,INF)[1,INF) | 10 4 | 转换过滤器的宽度和高度 |
--conv1_stride | [1,INF)[1,INF) | 1 1 | 大步的宽度和长度 |
--conv2_pool | [1,INF)[1,INF) | 1 1 | 泳池过滤器的宽度和高度 |
--conv2_size | [1,INF)[1,INF) | 10 4 | 转换过滤器的宽度和高度 |
--conv2_stride | [1,INF)[1,INF) | 1 1 | 大步的宽度和长度 |
--data_folder | 细绳 | /data/secement_dataset | 数据路径 |
--dev_every | [1,INF) | 10 | 开发时间间隔 |
--dev_pct | [0,100] | 10 | 设置用于开发的总数的百分比 |
--dropout_prob | [0.0,1.0) | 0.5 | 使用的辍学率 |
--gpu_no | [-1,n] | 1 | GPU使用 |
--group_speakers_by_id | {true,false} | 真的 | 是否将演讲者分组到火车/开发/测试中 |
--input_file | 细绳 | 加载模型的路径 | |
--input_length | [1,INF) | 16000 | 音频的长度 |
--lr | (0.0,INF) | {0.1,0.001} | 使用的学习率 |
--type | {火车,评估} | 火车 | 使用的模式 |
--model | 细绳 | CNN-Trad-Pool2 | 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 | SGD使用的动力 |
--n_dct_filters | [1,INF) | 40 | 使用的DCT基础数量 |
--n_epochs | [0,INF) | 500 | 时代数量 |
--n_feature_maps | [1,INF) | {19,45} | 用于残差体系结构的特征地图数量 |
--n_feature_maps1 | [1,INF) | 64 | Conv Net 1的功能地图数量1 |
--n_feature_maps2 | [1,INF) | 64 | Conv Net 2的功能地图数量 |
--n_labels | [1,N) | 4 | 使用的标签数量 |
--n_layers | [1,INF) | {6,13,24} | 残留体系结构的卷积层数 |
--n_mels | [1,INF) | 40 | 使用的MEL过滤器数量 |
--no_cuda | 转变 | 错误的 | 是否使用cuda |
--noise_prob | [0.0,1.0] | 0.8 | 与噪声混合的可能性 |
--output_file | 细绳 | 型号/Google-Speech-dataset.pt | 将模型保存到的文件 |
--seed | (INF,INF) | 0 | 使用的种子 |
--silence_prob | [0.0,1.0] | 0.1 | 挑选沉默的概率 |
--test_pct | [0,100] | 10 | 用于测试的总数的百分比 |
--timeshift_ms | [0,INF) | 100 | 以毫秒的时间随机移动音频 |
--train_pct | [0,100] | 80 | 用于培训的总数的百分比 |
--unknown_prob | [0.0,1.0] | 0.1 | 选择一个未知词的概率 |
--wanted_words | String1 String2 ... Stringn | 命令随机 | 所需的目标词 |
Honkling是Honk的JavaScript实施。借助Honkling,可以通过浏览器关键字发现功能实现各种Web应用程序。
为了提高鸣笛和鸣叫的灵活性,我们提供了一个从YouTube视频中构建数据集的程序。详细信息可以在keyword_spotting_data_generator
文件夹中找到
您可以执行以下操作以记录顺序音频,并保存到与语音命令数据集相同的格式:
python -m utils.record
输入返回记录,向上箭头撤回,然后“ Q”完成。一秒钟的沉默后,记录自动停止。
有几个选项可用:
--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".
后处理包括修剪或丢弃“无用”音频。修剪是不言自明的:录音将录音缩小到x毫秒的最大窗口,由--cutoff-ms
指定。丢弃“无用”音频( discard_true
)使用预先训练的模型来确定哪些样本令人困惑,并丢弃了正确标记的样本。预先训练的模型和正确的标签分别由--config
和--correct-label
定义。
例如,请考虑python -m utils.record --post-process trim discard_true --correct-label no --config config.json
。在这种情况下,实用程序记录了一系列语音片段,将它们修剪为一秒钟,最后丢弃了config.json
中未标记为“否”的人。
python manage_audio.py listen
这有助于为记录设置--min-sound-lvl
设置理智值。
python manage_audio.py generate-contrastive --directory [directory]
使用语音分割从[directory]
中的所有.WAV文件中生成对比示例。
语音命令数据集包含一秒长的音频片段。
python manage_audio.py trim --directory [directory]
将[directory]
中所有.WAV文件的最响亮的一秒钟的缩小。小心用户应使用Audacity等音频编辑器手动检查所有音频样本。