kaldi mobvoihotwords 唤醒词识别教程
作者:关林生
邮箱:
wuxie6424@gmail.com
2755244572@qq.com
如果有问题,可以email我。
本教程分为四个部分:
一是如何在ubuntu安装配置kaldi。
二是如何用kaldi的例子mobvoihotwords(唤醒词识别)训练出模型,然后用训练出来的模型测试一条指定的语音是不是唤醒词“嗨小问”。
三是用其他的已经训练好的模型来测试指定的语音是不是唤醒词。需要修改代码。
四是在kaldi运行mobvoihotwords(唤醒词识别)可能遇到的问题的解决办法
一.如何在ubuntu安装配置kaldi?
1.安装git。如果使用gitub网速慢,建议把ubuntu的源换成国内的源,网上教程很多,可自己百度。
sudo apt-get install git
2.从GitHub上下载我修改好了的kaldi_mobvoihotwords的源码。
我把源码放在了我的github仓库里:
https://github.com/wuxie6424/kaldi_mobvoihotwords
3.安装kaldi 依赖工具以及所使用的第三方工具库
sudo apt-get install git
sudo apt-get install bc
sudo apt-get install g++
sudo apt-get install zlib1g-dev make automake autoconf bzip2 libtool subversion
sudo apt-get install libatlas3-base
4.按照上面的安装完kaldi 的依赖包之后,我们解压kaldi_mobvoihotwords,运行自带的脚本文件,来检测是否安装完成所需要的依赖。
cd kaldi_mobvoihotwords-master/kaldi/tools
运行依赖检测脚本:
./extras/check_dependencies.sh
可能会提示缺失MKL依赖包,也会提示你,到tools目录下,运行install_mkl.sh脚本文件进行MKL安装。
运行安装脚本
./install_mkl.sh
安装完成以后,再次运行检查脚本:
./extras/check_dependencies.sh
可能会提示缺少另外一个依赖包,sox,也同样会告诉你安装方式,运行安装命令即可。
安装完成后,再次检测,运行脚本文件。直到没有提示错误,且提示all OK,依赖既安装完成。
5.在tools目录下面输入命令(要耐心等待一段时间,时间可能会有点长):
make -j4
解释:make -j4 与make -j8的意思就是多线程运行,(线程的意思请参考操作系统)即4个进程去竞争多核cpu,或者8个线程去竞争cpu。
tools目录下make 完成后,说明我们的外部依赖和第三方库已经全部安装完成。
6.下面进入到src目录下,进行编译安装。
cd ..
cd src
进入src 后按照指令进行安装(每输完一行命令要耐心等待一段时间,时间可能会有点长):
./configure --shared
make depend
make -j4
make -j4完成后,如果提示
echo Done
Done
则表示安装好了。
7.下面我们可以跑一个简单的例子yesno,来验证kaldi是否安装成功。
我们进入到路径kaldi_mobvoihotwords-master/kaldi/egs/yesno/s5目录下,运行下面的命令:
./run.sh
运行完 yesno 例子以后,如果终端最下面的一行显示如下,说明已经安装成功,它意思是识别的错误率为0。
%WER 0.00 [ 0 / 232, 0 ins, 0 del, 0 sub ] exp/mono0a/decode_test_yesno/wer_10_0.0
到此kaldi 安装完成!
二.如何用kaldi_mobvoihotwords训练出模型,然后用训练出来的模型测试一条指定的语音是不是唤醒词“嗨小问”?
说明:
我把kaldi的mobvoihotwords里面的代码做了一定的修改调整,我的这个版本识别的唤醒词是“嗨小问”。
官方的唤醒词是“嗨小问”、“你好雯雯”。
因为需要,我对数据集mobvoi_hotword_dataset、mobvoi_hotword_dataset_resources、mobvoihotwords里的一些代码做了修改。
我实现了只用一个唤醒词“嗨小问”。
我也在github上开源了mobvoi_hotword_dataset、mobvoi_hotword_dataset_resources里需要用到的含420条、8000条训练语音的压缩包。(官网上开源的数据集实在是太大了,因为我用的是单机来训练的,所以就抽取了一部分来用。我跑全部的数据跑不起来,电脑容易卡死)
1.前提条件:
(1)电脑要有GPU。也就是要安装CUDA。
教程:在ubuntu安装cuda10.1和cudnn(亲测有效)
(2)建议提前下载好需要应用到的数据集
(mobvoi_hotword_dataset.tgz,mobvoi_hotword_dataset_resources.tgz,musan.tar.gz,rirs_noises.zip等,因为这些数据包内存很大,有的十几个G。因为用kaldi里面的下载命令去下载会很慢,它里面是单进程下载的,要下载很久,我这里提供一个多线程下载的方法,大家可以提前下载好,然后放到对应的位置上。)
kaldi语料下载网址(该网站用的国内服务器,下载更快,亲测有效)
在ubuntu用wget下载多个文件,axel多线程下载(多线程超级快)
对应位置如下图:
2.在kaldi_mobvoihotwords-master/kaldi/kaldi/egs/mobvoihotwords/v1目录下执行命令即可开始训练测试:
./run.sh
运行结果:
注意!!!
因为mobvoi_hotword_dataset.tgz里面放了十几个G的数据。但是单机运行,跑不了这么数据,所以可以提取一部分数据,比如100条,420条,8000条等,但是由于数据量小,准确度不是很高。如果用集群跑大量数据训练的话,识别率会有所提高
三.用其他的已经训练好的模型来测试指定的语音是不是唤醒词(就是说,不用你自己跑数据训练模型,这里用现成的模型需要大家自己修改代码。)
说明:
我在github上放了420条、8000条语音(包括嗨小问以及其他杂音)训练出来的模型,分别放在了命名是exp420.tar.gz、exp8000.tar.gz的压缩包里。
需要修改三处:
1.run.sh
在run.sh里找到if [ $stage -le 0 ]; then和if [ $stage -le 13 ]; then。
把从stage 0到 stage13都注释了。
然后找到简化版本四,把简化版本四的注释解开。
如下图。
2.run_tdnn.sh
在run_tdnn.sh里找到if [ $stage -le 1 ]; then和if [ $stage -le 7 ]; then。
把从stage 1到stage 7都注释了。
然后找到简化版三,把简化版三的注释解开。
如下图。
3.run_tdnn.sh
在run_tdnn.sh里找到test_sets=,把他的值换成"eval_hires"。
如下图
4.配置文件:
因为想要用其他的已经训练好的模型。
模型训练好之后会被存在一个叫exp的文件夹,但是里面的配置文件的路径需要修改了,才能直接用。
我们需要对exp/chain/tdnn_1a_online/conf/online.conf进行修改。
比如,如下是我的一个online.conf的内容,你需要把对应的路径换成你电脑本机里kaldi的路径。
可以用到命令pwd
来获取文件所在的路径。
–feature-type=mfcc
–mfcc-config=/home/wuxie/kaldi/egs/mobvoihotwords/v1/exp/chain/tdnn_1a_online/conf/mfcc.conf
–endpoint.silence-phones=1
–cmvn-config=/home/wuxie/kaldi/egs/mobvoihotwords/v1/exp/chain/tdnn_1a_online/conf/online_cmvn.conf
–global-cmvn-stats=/home/wuxie/kaldi/egs/mobvoihotwords/v1/exp/chain/tdnn_1a_online/global_cmvn.stats
5.运行run.sh。
后面需要加上一个参数,是你要识别的语音的文件名(不含后缀).
比如你要识别这条语音0a0aa8e8c59492bc925df9905cba8c29.wav是不是唤醒词
(注意!我这里设置的是需要事先把想要识别的语音放到kaldi/egs/mobvoihotwords/v1/data/download/mobvoi_hotword_dataset目录下),在kaldi/egs/mobvoihotwords/v1目录下就输入如下命令即可:
./run.sh 0a0aa8e8c59492bc925df9905cba8c29
运行结果:
四.在kaldi运行mobvoihotwords(唤醒词识别)可能遇到的问题的解决办法:
1.解决kaldi训练报错 CUDA error: ‘out of memory‘,gpu不够用(亲测有效)
2.解决kaldi报错:fix_data_dir.sh: no utterances remained: not proceeding further.(亲测有效)
3.在ubuntu安装cuda10.1和cudnn(亲测有效)
5.在ubuntu用wget下载多个文件,axel多线程下载(多线程超级快)
6.kaldi语料下载网址(该网站用的国内服务器,下载更快,亲测有效)
8.解决mobvoihotwords(kaldi唤醒词识别)遇到的Exception: input dir /export/corpora/JHU/musan does not exist,亲测有效!
9.解决NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver的报错(亲测有效)
我把源码放在了我的github仓库里:
https://github.com/wuxie6424/kaldi_mobvoihotwords
kaldi官方github仓库: