基于kaldi的在线中文识别,online的操作介绍

最近研究了下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

 # 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

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
苏北 军礼 下跪 将 是 马 湛 杀人 里 杜 唐 据 五 苏 并 案 但 甜美 但 也 分析 抗战 







你可能感兴趣的:(语音识别)