最近有需求需要搭建自己的语音识别能力,经过一番挑选,最终选择了使用kaldi。
一.环境安装
从零开始的新机器,首先自然是安装Ubuntu,版本选择的是Ubuntu18.04。
因为Kaldi有部分模型是需要跑GPU的,因此需要安装显卡的驱动。
工作机的显卡为GeForce GTX 1050。
1.安装显卡驱动
可以参考 Ubuntu16.04安装NVIDIA显卡驱动,ubuntu16.04系统run方式安装nvidia显卡驱动 这两篇文章。
同时,这里有一个大坑,必须要注意,就是安装的时候必须禁用opengl,类似这样(不然重启后就会死在登录界面,输入密码后无线循环):
sudo ./NVIDIA-Linux-x86_64-390.25.run -no-opengl-files
2.安装cuda(参考Ubuntu 18.04 安装 CUDA-10.2)
2.1去官网上找到对应CUDA版本,并按照提示安装。
2.2配置环境变量:
在.bashrc末尾添加两行环境变量(版本根据自己的来):
export PATH=$PATH:$/usr/local/cuda-10.2/bin #根据CUDA版本更换路径
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} #根据CUDA版本更换路径
保存退出,并刷新环境变量:
source ~/.bashrc
重启并测试:
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
出现类似如下结果便是安装成功:
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.2, CUDA Runtime Version = 10.2, NumDevs = 1
Result = PASS
2.3安装CUDNN
首先是去官网找到对应的版本下载,需要先注册。
解压后进入目录,将文件复制进对应的CUDA目录下:
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
测试:
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
出现类似如下结果便是安装成功:
#define CUDNN_MAJOR 7
#define CUDNN_MINOR 6
#define CUDNN_PATCHLEVEL 5
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)
#include "driver_types.h"
二.安装kaldi
1.当前的kaldi是github托管的,因此需要先安装git。
2.通过github下载代码(如果速度慢可以通过第三方如码云来进行克隆下载)。
3.安装依赖。kaldi本身提供了依赖检测:
cd kaldi
tools/extras/check_dependencies.sh
根据提示安装,直到依赖检测输出:
tools/extras/check_dependencies.sh: all OK.
4.安装第三方工具(以自带的Openfst为例)
cd tools
make openfst
5.编译tools和src
cd tools
#make 单线程编译
make -j 4 #4线程编译,根据自己具体的cpu情况
cd src
make -j 4
*6.修改后的重编译
如果修改了kaldi代码,可使用以下代码来判断是否可以运行
make test #运行测试代码
make valgrind #运行测试代码,检查内存泄漏
make cudavalgrind #运行GPU矩阵和测试代码,检查内存泄漏
如果使用Git升级了Kaldi代码,再编译的时候出错,可能性一般有两种:
1)第三方出错或发生了变化,如OpenFst。这时候就需要重新安装OpenFst并重新运行配置工具
2)kaldi自身发生了变化,如库的增加或删除或接口改变。
这两种都会导致原有的编译实效,需要清理旧的文件重新编译。
make clean
make depend
make
7.运行一个自带的简单示例
cd egs/yesno/s5
./run.sh
输出的最后一行为:
%WER 0.00 [ 0 / 232, 0 ins, 0 del, 0 sub ] exp/mono0a/decode_test_yesno/wer_10_0.0
这个表示测试了232个词,全部正确。
8.激活CUDA(参考Kaldi中激活cuda)
1)在kaldi的src目录下./configure ,会显示cuda是不是安装好了。
2)然后make all;
3)最后到src的cudamatrix目录下运行:./cu-vector-test,就会显示gpu什么的。
三.清华大学语料库thchs30(参考kaldi使用thchs30数据进行训练并执行识别操作)
1.下载语料库,3个包,8个多G,并解压
2.进入egs/thchs30/s5目录,修改脚本
2.1cmd.sh,改为本地运行
export train_cmd=run.pl
export decode_cmd="run.pl --mem 4G"
export mkgraph_cmd="run.pl --mem 8G"
export cuda_cmd="run.pl --gpu 1"
2.2run.sh,修改cpu并行数(按需)和thchs30的目录
n=4 #parallel jobs
#corpus and trans directory
#thchs=/nfs/public/materials/data/thchs30-openslr
thchs=//home/jieyinzhineng/kaldi/kaldi/egs/thchs30/s5/thchs30-openslr #此处修改为解压后的目录,若移动了则为移动后的目录
2.3执行run.sh
2.4部分错误处理(参考kaldi上运行thchs30中文语音库的错误总结)
1)
ERROR: FstHeader::Read: Bad FST header: -
ERROR (fstdeterminizestar[5.1]:ReadFstKaldi():kaldi-fst-io.cc:35) Reading FST: error reading FST header from standard input
脚本并行运算错误。
可按照kaldi上运行thchs30中文语音库的错误总结中先处理掉对应的&再进行运行。如依然有错,可将所有的并行&都去掉再运行。
2)
cudn相关编译报错或显卡不支持:可先注释dnn和dae,跑其他的模型
#train dnn model
#local/nnet/run_dnn.sh --stage 0 --nj $n exp/tri4b exp/tri4b_ali exp/tri4b_ali_cv || exit 1;
#train dae model
#python2.6 or above is required for noisy data generation.
#To speed up the process, pyximport for python is recommeded.
#local/dae/run_dae.sh $thchs || exit 1;
待后续补充
2.5语音识别(参考基于kaldi的在线中文识别,online的操作介绍)
前面已经运行出了几个模型了,可以在kaldi/egs/thchs30/exp目录下查看。
此处使用tri1作为最简单的识别例子:
在egs下找到voxforge目录,在里面有一个online_demo,复制到thchs30下。
2.5.1在online_demo里面建2个文件夹online-data work,在online-data下建两个文件夹audio和models,audio下放你要回放的wav,models建个文件夹tri1,把tri1下的final.mdl和35.mdl(final.mdl是快捷方式)和tri1下的graph_word里面的words.txt,和HCLG.fst,复制到models的tri1下。最终如下
2.5.2修改online_demo的run.sh
1)将下面这段注释掉:(这段是voxforge例子中下载现网的测试语料和识别模型的。我们测试语料自己准备,模型就是tri1了)
if [ ! -s ${data_file}.tar.bz2 ]; then
echo "Downloading test models and data ..."
wget -T 10 -t 3 $data_url;
if [ ! -s ${data_file}.tar.bz2 ]; then
echo "Download of $data_file has failed!"
exit 1
fi
fi
2) 然后再找到如下这句,将其路径改成tri1
# Change this to "tri2a" if you like to test using a ML-trained model
ac_model_type=tri2b_mmi
# Alignments and decoding results
---------------------------------------------------------------
改成:
# Change this to "tri2a" if you like to test using a ML-trained model
ac_model_type=tri1
3)
online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85\
--max-active=4000 --beam=12.0 --acoustic-scale=0.0769 \
scp:$decode_dir/input.scp $ac_model/model
————————————————————————————
改成:online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85\
--max-active=4000 --beam=12.0 --acoustic-scale=0.0769 \
scp:$decode_dir/input.scp $ac_model/final.mdl
2.5.3将音频文件放到audio后执行run.sh
可以看到,现在的识别效果是比较差的。
PS:
作为刚开始语音这方面的新手,有很多问题还是不太清楚,只能是网上各自找参考作归纳。此文也是作为一个记录。
如果有哪里说的不对,请谅解。如能在评论区指正将万分感谢。