最近研究了下kaldi,也看了好多文章,感觉这方面的有用文章太少! 大多停留在编译和深层理论方面。对于我们这种没有基础的人,除了看完编译,就只能很茫然的看哪些高高在上的理论了。
本文章,适合那些。刚刚编辑完kaldi。想试试手,找找感觉的人来看的。如果你还没有编辑过,可以查查相关文章。有好多。
声明一下,本文章,只适合在windows下装虚拟机UBuntu的机器上玩。你的虚拟机内存要大些(4g--8g最好)。不然很痛苦。
找感觉一定要从中文开始,我们直接拿那个清华大学的中文例子(thchs30)开练,
1 首先进入githab下载的源码中egs目录下找到这个例子,然后要看一遍它的介绍。在readme里面有语料库的下载方式。把它下完(3个压缩包全下)。4个多G比较大。
2 考到对应的文件夹下(与s5同级别即可),取名叫thchs30-openslr,将所有压缩包解压到这下面
3 打开s5目录,编辑cmd.sh. 如下:()
export train_cmd=run.pl
export decode_cmd=run.pl
export mkgraph_cmd=run.pl
export cuda_cmd=run.pl
4 打开run.sh,看到#data preparation这句,在它之后就全是shell的命令。建议一条一条的跑。不然中间会有莫名奇妙的断档和错误。如何一条条跑呢? 使用注释:
<
5按照上面的一句一句的来。它大概有几个过程:数据准备,monophone单音素训练, tri1三因素训练, trib2进行lda_mllt特征变换,trib3进行sat自然语言适应,trib4做quick(这个我也不懂),后面就是dnn了
6当运行到dnn时候会报错,因为默认dnn都是用GPU来跑的。它会检查一下,发现只在CPU下,就终止了。这里建议不要跑dnn了。因为我试过,改成CPU之后跑了7,8天,才迭代17,18次。太慢了。而一次训练怎么的也得20多次。还要训练好几回。所以,想跑dnn的话还是找GPU吧。
7.下面说说前面的几个步骤干啥用。其实每一次都会有个模型,这些模型都可以用了,你可以看它的exp目录,所有的步骤都在这里面输出。我们先简单看一个,tri1,打开后,有个decode_test_word,里面有个scoring_kaldi,best_wer就是它的错误率,36.15%.好回到tri1下,看到final.mdl了吗,这个就是有用的东西,学出来的模型。另外还得到graph_word下面,找到words.txt,和HCLG.fst,一个是字典,一个是有限状态机。有这3个文件,就可以来使用你的识别功能了。
8.这步是比较好玩的了。我们用这个模型来识别自己的语言。(是非常的不准,只是感受一下而已),回到源码的src下。make ext 编译扩展程序。(在这之前确定你的tools文件夹下的portaudio已经装好)之后,会看到onlinebin文件夹。里面有两个程序,online-wav-gmm-decode-faster 用来回放wav文件来识别的,online-gmm-decode-faster用来从麦克风输入声音来识别的。
8.1 这里开个小差:portaudio 装好后,有可能收不到声音,可以装个audio recoder(用apt-get),之后用它录音试试,测测是否有声音,只要能录音,portaudio就没问题,一般装完就好了,不行就再重启一下。不知道为啥。
8.2 介绍下online。很鄙视kaldi在这块的设计,居然搞出来两个版本。online是不再维护了。但是非常好用,online2是新的。参数n多。也不支持从麦克风采集。特别不人性化,如果有那个朋友把online2研究好了,请把经验也分享一下。
9.我们找一个例子吧:去egs下,打开voxforge,里面有个online_demo,直接考到thchs30下。在online_demo里面建2个文件夹online-data work,在online-data下建两个文件夹audio和models,audio下放你要回放的wav,models建个文件夹tri1,把s5下的exp下的tri1下的final.mdl和35.mdl(final.mdl是快捷方式)考过去。把s5下的exp下的tri1下的graph_word里面的words.txt,和HCLG.fst,考到models的tri1下。
10。打开online_demo的run.sh
a)将下面这段注释掉:(这段是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
b) 然后再找到如下这句,将其路径改成tri1
---------------------------------------------------------------
改成:
c)
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
11。直接./run.sh吧,就是开始回放识别了。里面有提示,./run.sh --test-mode live命令就是从麦克风识别。
12.升华部分在这里。我们试完tri1的模型后,一定很想试试tri2或3.但当你操作时,会遇到如下的问题:
ERROR (online-wav-gmm-decode-faster:LogLikelihoods():diag-gmm.cc:533) DiagGmm::ComponentLogLikelihood, dimension mismatch 39vs. 40
怎么解决? 仔细看看这个源文件,它是dieta的。如果要是ldp还得加matrix参数(拿tri2b举例)。
于是修改run.sh成如下这个样子 :(就是把final.mat考过来,引入命令中)
if [ -s $ac_model/matrix ]; then
trans_matrix=$ac_model/12.mat
fi
同时把把s5下的exp下的tri2b下的12.mat考到models的tri2b下。
13 再次修改run.sh成如下这个样子(添加2个参数--left-context=3 --right-context=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 --left-context=3 --right-context=3\
scp:$decode_dir/input.scp $ac_model/final.mdl $ac_model/HCLG.fst \
$ac_model/words.txt '1:2:3:4:5' ark,t:$decode_dir/trans.txt \
ark,t:$decode_dir/ali.txt $trans_matrix;;
14 运行./run.sh,结果如下。怎么样,有点酷不? 如果想使用tri2等模型做麦克风在线的,也同理修改就可以了。
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 --left-context=3 --right-context=3 scp:./work/input.scp online-data/models/tri2b/final.mdl online-data/models/tri2b/HCLG.fst online-data/models/tri2b/words.txt 1:2:3:4:5 ark,t:./work/trans.txt ark,t:./work/ali.txt online-data/models/tri2b/12.mat
File: D4_750
苏北 军礼 下跪 将 是 马 湛 杀人 里 杜 唐 据 五 苏 并 案 但 甜美 但 也 分析 抗战