Kaldi(A5)语言模型及HCLG.fst生成

这节介绍一下如何修改生成适合自己场景的语言模型。

Ref

Online decoding in Kaldi(Nnet2) http://kaldi-asr.org/doc/online_decoding.html

修改语言模型

首先,我们为什么要修改语言模型?虽然已有现成的Fisher_English或者Librispeech的HCLG.fst,但是他们用到的是3-gram,也就是说上下文一共是3个单词,而且文本涵盖的范围很广。假如我只想在特定范围内进行识别呢?比如仅仅在对某个智能音箱的指令范围内?这就需要我们用自己提供的语料库来限定其识别的范围以提升准确度,并且如果范围较小的话还可以提升实时性。
参考“Example for using your own language model with existing online-nnet2 models”,我们只需要准备一个文本文件作为语料库即可。在这里文档提到了需要使用SRILM这个工具来生成模型,所以先来安装它。

安装SRILM

首先请参考
SRILM的安装与使用
官方Doc
提到了还需要安装TCL,来到tcl download
下载之后输入以下命令进行安装

 

wget https://prdownloads.sourceforge.net/tcl/tcl8.6.7-src.tar.gz
tar vxzf tcl8.6.7-src.tar.gz
cd tcl8.6.7/unix
./configure
make
sudo make install

然后继续SRILM的安装

 

vim Makefile
#修改为SRILM=/home/dale/SRILM
make World
PATH=$PATH:/home/dale/SRILM/bin/i686-m64:/home2/zhangzhan/SRILM/bin
MANPATH=$MANPATH:/home/dale/SRILM/man
make test

OpenSLR

首先看看提供给我们下载的语言模型(如果想要更好的识别率可以从这些语言模型中下载,然后根据文档中提供的命令重新训练出一个HCLG.fst
http://www.openslr.org/11/

Kaldi(A5)语言模型及HCLG.fst生成


可以看到3-gram和4-gram差的还是很大的…在这里我的项目对实时性要求很高,所以我准备用2-gram。

 

生成ARPA语言模型

准备好自己的文本为train_text.txt

 

PATH=$PATH:/home2/zhangzhan/SRILM/bin/i686-m64:/home2/zhangzhan/SRILM/bin
MANPATH=$MANPATH:/home2/zhangzhan/SRILM/man
#生成计数文件
ngram-count -text train_text.txt -order 2 -write xgn_count
#生成ARPA LM
ngram-count -read xgn_count -order 2 -lm xgn_lm -interpolate -kndiscount
gzip xgn_lm

好了,我们的语言模型已经生成好了,名为xgn_lm.gz,下面根据这个文件生成Kaldi所需的HCLG.fst

生成HCLG.fst

此处参考官方Doc给出的过程即可,需要注意的是下面命令中将会用到训练时的一些文件,所以需要先跑过训练脚本才能修改。

 

PATH=$PATH:/home2/zhangzhan/kaldi-trunk/src/lmbin/:/home2/zhangzhan/kaldi-trunk/src/fstbin:/home2/zhangzhan/kaldi-trunk/tools/openfst-1.6.5/bin/:/home2/zhangzhan/kaldi-trunk/src/bin/
dict_dir=data/local/dict                # The dict directory provided by the online-nnet2 models
lm=xgn_lm.gz                      # ARPA format LM you just built.记得在这里修改为刚才构建的
lang=data/lang_chain                          # Old lang directory provided by the online-nnet2 models
lang_own=data/lang_own                  # New lang directory we are going to create, which contains the new language model
~/kaldi-trunk/egs/wsj/s5/utils/format_lm.sh $lang $lm $dict_dir/lexicon.txt $lang_own
graph_own_dir=graph_own
#model_dir=nnet_a_gpu_online
model_dir=tdnn_1b_sp
~/kaldi-trunk/egs/wsj/s5/utils/mkgraph.sh $lang_own $model_dir $graph_own_dir 

最后就在graph_own_dir下面生成好了经过我们定制的HCLG.fst
至此,我们可以搭建一个属于自己的简单语音识别系统了。后续将会记录一些补充内容。

 

上一篇:Penetration Test - Survey the Target(13)


下一篇:Java程序中使用Spire Jar包报java.lang.NoSuchMethodError类型错误的解决方法