PocketSphinx语音识别系统语言模型的训练和声学模型的改进
本文是参照zouxy09的博客内容
关于语音识别的基础知识和sphinx的知识,具体可以参考他的的另外两篇博文:
语音识别的基础知识与CMUsphinx介绍:
http://blog.csdn.net/zouxy09/article/details/7941585
PocketSphinx语音识别系统的编译、安装和使用:
http://blog.csdn.net/zouxy09/article/details/7942784
下面的工作都是基于上面两篇博文往下做的,所以最好先了解下前面的情况。
下面的过程参考CMU sphinx的wiki:
http://cmusphinx.sourceforge.net/wiki/
一、训练语言模型
词与词之间存在着合乎句法与否的约束,语言模型就是用来表示这些约束的,它可以提供字与字之间的上下文信息和语义信息。在pocketsphinx语音识别系统时,采用了N-gram模型,即对训练音频文件所对应的文本文件进行统计,提取不同字词之间先后发生的统计关系。
如果你的语言模型较小(例如小的语音指令集或者任务),而且是英文的,那就可以直接上CMU提供的网络服务器上面训练,如果较大的话,一般使用CMUclmtk语言模型工具来训练。下面分两种情况来介绍:
1.1、利用在线工具建立语言模型
(1)创建一个语料库:
语料库实际上就是一些文本的集合,包含了你需要识别的语音的文字的一些集合,例如句子啊,词啊等等。
#vi corpus.txt
输入如下内容:
stop
forward
backward
turn right
turn left
保存退出
(2)利用在线工具LMTool建立语言模型:
进入网址:http://www.speech.cs.cmu.edu/tools/lmtool.html
点击Browse按钮,选择之前创建的corpus.txt,最后点击COMPILE KNOWLEDGE BASE。这样就会生成字典文件* .dic 和语言模型文件 *.lm,例如:
生成TAR2916.tar.gz
tar xzf TAR2916.tar.gz
2916.corpus 2916.lm 2916.sent.arpabo 2916.vocab
2916.dic 2916.sent 2916.token
真正有用的是.dic、.lm的文件
(3)测试结果:
pocketsphinx_continuous解码器用-lm选项来指定要加载的语言模型,-dict来指定要加载的字典。
#pocketsphinx_continuous -lm 2916.lm -dict 2916.dic
INFO: ngram_search_fwdflat.c(295): Utterance vocabulary contains 1 words
INFO: ngram_search_fwdflat.c(912): 97 words recognized (2/fr)
INFO: ngram_search_fwdflat.c(914): 2342 senones evaluated (38/fr)
INFO: ngram_search_fwdflat.c(916): 1011 channels searched (16/fr)
INFO: ngram_search_fwdflat.c(918): 167 words searched (2/fr)
INFO: ngram_search_fwdflat.c(920): 47 word transitions (0/fr)
WARNING: "ngram_search.c", line 1087: </s> not found in last frame, using <sil> instead
INFO: ngram_search.c(1137): lattice start node <s>.0 end node <sil>.56
INFO: ps_lattice.c(1228): Normalizer P(O) = alpha(<sil>:56:60) = -341653
INFO: ps_lattice.c(1266): Joint P(O,S) = -341653 P(S|O) = 0
000000000: STOP (-6531224)
READY....
Listening...
1.2、训练大文本数据的语言模型
我们通过语言模型训练工具CMUCLMTK统计大量文本数据得到以单个词建立的N-Gram模型。
语言模型训练工具的说明见:
http://www.speech.cs.cmu.edu/SLM/toolkit_documentation.html
具体的步骤如下:(得先安装语言模型训练工具CMUCLMTK,安装过程在上一博文中)
(1)准备训练的文本,也就是语料库:
这里只是举一个例子,所以语料库也不大,而一般的语料库都是由大文本来组成的,里面就是有一些我们的日常用语或者报纸啊,书啊等等所出现过的句子。文本数据越大,训练得到的语言模型就越好。
#sudo vi weather.txt
在 .txt中输入如下内容,记住结尾不可留“\n”(实验证明了这一点)。每个utterances由 <s> 和</s>来分隔
<s> 天气 </s>
<s> 有雨 </s>
<s> 晴朗 </s>
<s> 多云 </s>
<s> 雷电 </s>
:wq! 保存退出
# text2wfreq < weather.txt | wfreq2vocab > weather.tmp.vocab
# text2idngram -vocab weather.tmp.vocab -idngram weather.idngram < weather.txt
#idngram2lm -vocab_type 0 -idngram weather.idngram -vocab weather.tmp.vocab -arpa weather.arpa
#sphinx_lm_convert -i weather.arpa -o weather.lm.DMP(2)产生词汇表vocabulary文件:
# text2wfreq < weather.txt | wfreq2vocab > weather.tmp.vocab
命令text2wfreq:统计文本文件中每个词出现的次数,得到一个后缀为wfreq的文件,内容示例为:
二1334
九1334
</s> 3680
即表示词二、九和</s>在训练文本中出现的次数依次为1334、1334、3680。
命令wfreq2vocab:统计文本文件中含有多少个词,即有哪些词。如数字识别中包含10个数字和两个静音,故共有12个词,按照拼音顺序依次是:</s>、<s>、八、二、九、零、六、七、三、四、五、一。
(3)生成 arpa格式的语言模型:
# text2idngram -vocab weather.vocab -idngram weather.idngram < weather.txt
#idngram2lm -vocab_type 0 -idngram weather.idngram -vocab weather.tmp.vocab -arpa weather.arpa
命令text2idngram:列举文本中出现的每一个n元语法。产生一个二进制文件,含有一个n元数组的数值排序列表,对应于与词有关的的N-Gram。超出文本范围的词汇映射值为0。
命令idngram2lm:输入文件包括一个idngram文件,一个vocab文件和一个ccs文件,输出是一个后缀为binlm的语言模型文件。其中ccs文件指句首和句尾的静音<s>和</s>。
命令binlm2arpa:是将binlm文件转换为实验中需要的arpa格式语言模型文件。
(4)转换为 CMU的二进制格式 (DMP):
如果你的语言模型比较大的话,最好就转换为CMU的二进制格式 (DMP),这样可以加快加载语言模型的速度,减少解码器初始化的时间。但对于小模型来说,就没有这个必要,因为sphinx3能处理这两种后缀名的语言模型文件。
#sphinx_lm_convert -i weather.arpa -o weather.lm.DMP
最终生成了语言模型weather.lm.DMP,此文件为解码器端所需要的文件格式。
(5)测试结果:
pocketsphinx_continuous解码器用-lm选项来指定要加载的语言模型
#pocketsphinx_continuous -lm weather.lm.DMP
也可参考http://blog.csdn.net/u012637501/article/details/40894947