这节介绍一下如何修改生成适合自己场景的语言模型。
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/
可以看到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
。
至此,我们可以搭建一个属于自己的简单语音识别系统了。后续将会记录一些补充内容。
网友评论