本次项目是基于Kaldi做的中文语音识别,Kaldi是当前最流行的开源语音识别工具。它自带了很多特征提取模块,能提取MFCC/ivector/xvector等语音特征;也自带了很多语音模型代码,可以直接使用或重新训练GMM-HMM等模型;它还支持GPU进行训练。可以说是功能很强大了。更厉害的是,你只需要简单的SHELL编程,就能使用kaldi。kaldi作为一个工具,不需要像库一样进行大量编程,所以使用门槛其实不高。更多的Kaldi相关介绍和安装编译及使用请参考我的这篇博客:语音识别-Kaldi的安装编译实录。
一、前言
datatang_asr模型是一个训练好的开源模型,识别准确率还是挺高的(我记得官方是说92%+),它的好处在于帮你省去了训练模型和获取数据集的难题,并且它似乎不需要太高的性能要求就能使用模型。因为之前尝试使用CVTE Model v2来做,但是做到最后一步发现模型因为内存不足64G来装载总是被kill掉,导致没有办法完成。在将CVTE模型部署到服务器上使用和选择其他开源模型重新做两种弥补方案之间,我选择了后者。于是便有了这一次的尝试。
这一次datatang_asr模型的配置有了之前CVTE的经验,无非就是将其下载解压到egs/
,然后按照项目目录下的tutorial.md
中的提示一步一步来做就好。
安装datatang_asr可以由我之前写的安装CVTE的步骤作为参考:在Kaldi上使用CVTE模型详细过程。
datatang_asr模型的下载链接:http://kaldi-asr.org/models/m10。
二、遇到的一些问题
2021年11月10日更新:今天,我把aidatatang给的这个模型跑通了,测试数据是CVTE模型提供的wav文件,结果我会放在下面。这里要说的是,如果前面的kaldi环境配置好了,其实一步一步跟着aidatatang模型的tutorial操作就可以跑出结果。
我按照aidatatang官方给出的步骤一步一步配置环境好之后,./run.sh会出现下面的报错
steps/make_mfcc.sh: invalid option --write-utt2dur
cat: 'exp/chain/tdnn_1a_sp/decode_offline_test_20211109/log/decode.*.log': No such file or directory
并且起初还有这种错误,让我以为是源码的python语句写错:
steps/make_mfcc.sh: invalid option --write-utt2dur
./run.sh: line 23: exp/chain/tdnn_1a_sp/decode_offline_test_20211109/decode_20211109.log: No such file or directory
Traceback (most recent call last):
File "local/extract_decode_log.py", line 9, in <module>
f = open(logfile,'r')
IOError: [Errno 2] No such file or directory: 'exp/chain/tdnn_1a_sp/decode_offline_test_20211109/decode_20211109.log'
看到上面这个结果,我一开始以为是目标python文件的open()方法打开文件方式是’r’只读造成的,我还专门去将’r’改成了’w’和’a’,分别尝试后,仍然报其他错误。
我自行在提示的目录中增加了提示的丢失目录及文件后,仍然报错:
prepare_data.sh: Preparing data in WAVpath
sort: cannot read: data/local/offline_test/wav.scp: No such file or directory
sort: cannot read: data/local/offline_test/utt2spk: No such file or directory
Can't open data/local/offline_test/utt2spk: No such file or directory at utils/utt2spk_to_spk2utt.pl line 25.
cp: cannot stat 'data/local/offline_test/wav.scp': No such file or directory
在我冷静分析之后,我认为有一个关键的提示,就是:
steps/make_mfcc.sh: invalid option --write-utt2dur
我开始认为是这个make_mfcc.sh
文件的代码问题,于是我去找到这个文件,查看其代码。我分析了一下,认为这是由run.sh或其他sh文件中使用了make_mfcc.sh --write-utt2dur
命令,而make_mfcc.sh
没有这一命令选项导致的。于是我去查看了kaldi在github上的项目,找到了这一个文件,惊讶的发现,官方的make_mfcc.sh
和我使用的代码不完全一样,在官方的文件中,多了一个变量和option,我想这应该就是导致问题发生的主要原因。于是我重新用git工具clone了官方的项目下来,重新进行编译。
重新编译的时候,我从./check_dependencies.sh
检测依赖包这一步开始,发现多出了新的需要安装的依赖包,这次新安装了sox,mkl等的包,然后我按提示以此安装,看了新项目中extras/
中提供的.sh
文件,多出来了好多,我想这次的kaldi应该不会再出什么问题了。
所以该问题最终的解决方案是:使用git工具从github官方下载Kaldi
我最终在2021年11月10日把aidatatang跑通了,识别率还是不错的,识别结果的路径在:
exp/chain/tdnn_1a_sp/decode_offline_test_20211109/rec_20211109.txt
我用CVTE模型提供的测试数据.wav文件作为测试用aidatatang模型跑了一遍,结果如下图
友情提示:
其实等我折腾了这两天后我才发现,原来最关键的是配置好kaldi环境,如果kaldi都配置好没有问题,然后下载的aidatatang_asr没有问题,按tutorial的步骤一步一步来,可以立即出结果,很方便很简便。所以,kaldi最好是用git工具从github去下载。
这次项目里,最耗我时间的莫过于配置、安装、编译kaldi,我在编译kaldi的过程中踩了很多坑,如connection timed out,g++报错之类的,都写在下面的文章中的中间和最后面的补充部分,可以参考下面的连接。
下载Kaldi安装等参考:语音识别-Kaldi的安装编译实录。