PocketSphinx语音识别系统语言模型的训练和声学模型的改进

来源:互联网 发布:淘宝卖家怎么升级快 编辑:程序博客网 时间:2024/05/21 17:17

PocketSphinx语音识别系统语言模型的训练和声学模型的改进

本文是参照zouxy09的博客内容


 

       关于语音识别的基础知识和sphinx的知识,具体可以参考他的的另外两篇博文:

语音识别的基础知识与CMUsphinx介绍:

http://blog.csdn.net/zouxy09/article/details/7941585

PocketSphinx语音识别系统的编译、安装和使用:

http://blog.csdn.net/zouxy09/article/details/7942784

下面的工作都是基于上面两篇博文往下做的,所以最好先了解下前面的情况。

 

下面的过程参考CMU sphinxwiki

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>在训练文本中出现的次数依次为133413343680

命令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

 

0 0
原创粉丝点击