赞
踩
本篇博客用于记录一次用开源语音识别(ASR)工具Kaldi来实现中文语音识别功能的经历,记录一路遇到的一些问题。希望本篇文章可以给广大有需要的人提供一些帮助,也以防之后若再做此方向的东西会重蹈覆辙。
注意:本文是在Ubuntu64位的虚拟机环境下运行的,通过阅读Kaldi官方的INSTALL文件中指出的,似乎不能在Windows下正常编译使用。
Kaldi简介:Kaldi是当前最流行的开源语音识别工具(Toolkit),它使用WFST来实现解码算法。它自带了很多特征提取模块,能提取MFCC/ivector/xvector等语音特征;也自带了很多语音模型代码,可以直接使用或重新训练GMM-HMM等模型;它还支持GPU进行训练。可以说是功能很强大了。更厉害的是,你只需要简单的SHELL编程,就能使用kaldi。kaldi作为一个工具,不需要像库一样进行大量编程,所以使用门槛其实不高。
对应大部分Kaldi的用户来说,我们只需要使用脚本和配置文件就可以完成语音识别系统的训练和预测了。所以我也选择了用Kaldi来完成导师安排的语音识别任务。
安装VMWare虚拟机并安装了Ubuntu,我的版本是Ubuntu20.04.3,安装过程参考:Ubuntu18.04安装教程
Kaldi官方教程:https://kaldi-asr.org/doc/install.html
安装下载,我是从github上直接下载zip然后解压的,官方github链接:https://github.com/kaldi-asr/kaldi
最新补充!
我Kaldi下载来的项目文件Kaldi-master似乎是旧版本,导致了一些必要文件的丢失
,所以我建议大家,最好还是用git工具来下载Kaldi的项目文件夹。
也可以使用git命令将其下载到本地,在终端键入:
git clone https://github.com/kaldi-asr/kaldi.git kaldi --origin upstream
或者(如果出现timed out可以用下面的指令)
git clone https://gitclone.com/github.com/kaldi-asr/kaldi.git kaldi --origin upstream
======== 下面这部分是我准备thchs30数据集的部分,和本文编译kaldi内容无关 ========
在Ubuntu中安装清华大学开源的thchs30数据集:http://www.openslr.org/18/
这里面的三个文件都要下,一共约8G,下载好后解压放到Kaldi的目录中对应的thchs30目录下新建的thchs30-openslr目录(该目录由自己创建)下:
例如,我的目录如下:
/home/keep/Keep/kaldi-master/egs/thchs30
这个thchs30-openslr是自己创建的,进去将下载来的3个数据集文件压缩到这个文件夹内即可。
在传输数据集的过程中我遇到了Ubuntu磁盘空间满的问题,但是我刚分配了40G,理应不会满,后来我猜测是因为从Win上复制文件到VMWare中可能会有缓存,然后去查了相关文档,发现问题确实如此,解决办法参考了:linux硬盘满了如何处理–ck3208
我的目录里是一个VMWare的dictionary中的./.cache占用了20G的内存,随后我按照上面的博客步骤去释放,问题也就得到了解决。
======== 上面这部分是我准备thchs30数据集的部分,和本文编译kaldi内容无关 ========
进入kaldi-master项目文件夹,查看./INSTALL,提示需要分别编译tools和src下的文件
在终端键入 cd kaldi-master/tools/extras
键入./check_dependencies.sh
执行该脚本检查包依赖情况
根据提示安装所需要的包
这里遇到了一个问题,是我按提示安装了所有包之后,一直提示我sudo apt-get install zlib1g-dev,我按提示键入命令安装这个zlib提示已安装且是最新版,一直重复得不到解决。
后来尝试先安装它提示的别的包试试,于是尝试安装g++。
先是键入了:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
键入命令:
sudo apt-get update
接着才可以键入安装g++的命令:
sudo apt install g++
中间会提示问是否继续,键入y后回车即可
终于,再次使用./check_dependencise.sh命令查看依赖包提示时已经all OK了。
依赖包安装完了,先来编译tools
先cd到tools目录下,键入:
make -j 4 //这个数字4因人而异
#注意:这里的数字4是根据你的虚拟机cpu核心数来的,我这里虚拟机分配了4个核心就输入了4,当然也可以输入<=4的正整数,但是数字越大编译的效率也就越高了,所以看自己来确定这个数字。
编译完提示All done OK.:
编译完tools就可以来编译src了,先cd到src目录下。
键入命令:
./configure
这里出现了如下错误,当我按提示键入了如下图的命令后无果,查阅相关问题,发现了解决办法。
这里需要键入:
sudo apt-get install libatlas-base-dev
此时,再执行:
./configure --shared
看到了SUCCESS表示成功了。
继续依次键入命令:
make depend -j 4
make -j 4
注意:此处的4仍然按照自己分配的CPU核数来修改
键入make
进行编译,make
耗时较长请耐心等待
出现:Done表示成功
现在需要验证一下是否安装成功
进入egs目录,用命令 cat README.txt 查看用例,egs下面包含如voxforge,vystadial_{cz,en},yesno和LDC用例
这里用yesno为例
进入egs/yesno目录,用命令cat README.txt 查看yesno数据集介绍,是一个关于Yes/no识别的简单的数据集
进入egs/yesno/s5目录,执行
./run.sh
这里我出现了这个
考虑到刚刚make编译的过程中重启了一下虚拟机,遂回到scr目录下 重新键入3个命令./configure --shared
, make depend -j 4
, make -j 4
后重新编译再进行此步骤,发现还是解决不了,看到一个同样遇到这个问题的说:
究其原因是在于调用steps/ 和 utils/ 文件夹下的sh文件是报错,找不到文件。发现steps/ 和 utils/ 此时为两个文件。
实际上这两个文件为两个外链文件,类似于windows下的快捷方式。此处本应为外链的形式,但是却变成了两个文件。
错误在于,本人在windows下下载了kaldi的zip包, 解压完之后移动到了ubuntu下安装编译。此时会生成文件而非外链。
解决方法如下:
直接在ubuntu下 git clone 项目并解压安装
下载zip包在windows, 不解压缩直接传至ubuntu下解压缩并安装。
崩溃了,要重新来一遍了。。艹。。也没办法不是,我去重新来一遍。
最后我用方法2,把zip放到Ubuntu后再解压,然后重新走了一遍步骤二、编译,然后就成功了!
出现%WER 0.00 [ 0 / 232, 0 ins, 0 del, 0 sub ] exp/mono0a/decode_test_yesno/wer_10_0.0时,恭喜你,Kaldi安装成功!
在经过CVTE模型没有跑通、aidatatang代码没有跑通的双重挫折下,我开始在aidatatang模型报错中查看问题。然后我发现是因为我Kaldi下载来的项目文件Kaldi-master似乎是旧版本,导致了一些必要文件的丢失,所以我建议大家,最好还是用git工具来下载Kaldi的项目文件夹。
重新编译的时候,我从./check_dependencies.sh检测依赖包这一步开始,发现多出了新的需要安装的依赖包,这次新安装了sox,mkl等的包,然后我按提示以此安装,看了新项目中extras/中提供的.sh文件,多出来了好多,我想这次的kaldi应该不会再出什么问题了。
更新:即使这里出现了all OK.但是当我在tools中用make -j 4
对tools进行编译的时候,由于我觉得卡了就中途强制退出虚拟机了(提醒:不要关!),然后就导致我后面来到src
目录./configure
出现了报错:
Checking compiler g++ ...
Checking OpenFst library in ...
***configure failed: Could not find file /include/fst/fst.h:
you may not have installed OpenFst. See ../tools/INSTALL ***
经过查看其他人的做法,我到kaldi.tools
目录下用make
安装了openfst
即:
cd tools
make openfst
这一步等了真的很久,大概有半小时吧,耐心点。
接着,我重新回到src
键入./configure
遇到了和答案博主的相同问题
Checking cub library in ...
***configure failed: Could not find file /cub/cub.cuh:
you may not have installed cub. Go to ../tools/ and type
e.g. 'make cub'; cub is a new requirement. ***
然后,我回到kaldi/tools
目录下,用ls
指令查看当前目录:
根据答案博主的做法,我先删除cub,(删除文件的指令 rm -rf cub-1.8.0.tar.gz)
重新执行extras/check_dependencies.sh,显示OK,
然后执行输入make。
过了一会儿…… All done OK.(这里我Connection timed out了,我猜可能执行命令wget -nv -T 10 -t 3 -O cub-1.8.0.tar.gz
https://github.com/NVlabs/cub/archive/1.8.0.tar.gz;
被墙?)
如果哦总是遇到Connection Timed out可以尝试架t子,我是在win上架了之后用wget工具键入命令获得tar.gz包,然后移动到ubuntu里对应的位置(每次出现timed out记得用rm -rf xxx指令将当前目录下超时创建的空文件删除掉),然后extract到tools目录,再用命令ln -s xxx(名字,去掉版本号)一下。
例如,在我一直出现如下connection timed out时
我在win上用wget工具,并架好t子,然后键入命令
wget -O sph2pipe-2.5.tar.gz https://github.com/burrmill/sph2pipe/archive/2.5.tar.gz
下载下来后再拷贝到ubuntu中的tools
目录下,解压,ln -s
,然后再进行make,就All done OK.了
上面的解决方案感谢:https://blog.csdn.net/weixin_42103947/article/details/119842650
感谢:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。