从零开始搭建Ubuntu下的Kaldi环境并使用thchs30进行语音识别

最近有需求需要搭建自己的语音识别能力,经过一番挑选,最终选择了使用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:

作为刚开始语音这方面的新手,有很多问题还是不太清楚,只能是网上各自找参考作归纳。此文也是作为一个记录。

如果有哪里说的不对,请谅解。如能在评论区指正将万分感谢。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值