五、建立语言模型几种方法及使用

来源:互联网 发布:淘宝代运营托管 编辑:程序博客网 时间:2024/05/16 17:19
建立语言模型几种方法及使用
Jiangdg_VIP
http://blog.csdn.net/u012637501
译自:http://cmusphinx.sourceforge.net/wiki/tutoriallm
    通常有两种类型模型来描述语言,即语法静态语言模型。语法描述的是非常简单的语言,比如命令和控制语言,并且语法通常使用比较简单的代码手动或者自动来编写。对于静态语音模型,则就有很多方法来实现它。比如,当你的语言数据库比较大的时候,我们可以通过CMU语言建模工具来对其进行语言建模;当你的语言数据库比较小的时候,可以使用CMU在线建模工具进行建模;当你需要特定的选项或者建立ARPA模型,你也可以使用自己偏爱的工具包。
一、创建一条语法
    语法通常使用JSGF格式来编写,示例如下:
#JSGF V1.0;/** * JSGF Grammar for Hello World example */grammar hello;public <greet> = (Good morning | Hello) ( Bhiksha | Evandro | Paul | Philip | Rita | Will );
注意:关于更多的JSGF知识详见:http://www.w3.org/TR/jsgf/
二、使用CMUCLMTK工具建立一个静态语言模型
1.cmuclmtk工具
    下载并安装cmuclmtk工具,详见 CMU Sphinx Downloads 
2.ARPA模型训练
(1)创建一个语料库(.txt)
    创建一个语料库,用它来生成我们所需要的语言模型。这个语料库中的句子或词组,需要使用<s>和</s>标记以便表明句子的开始和结束。举例
weather.txt:<s> generally cloudy today </s><s> some dry intervals also with hazy sunshine especially in eastern parts in the morning </s><s> highest temperatures nine to thirteen Celsius in a light </s><s> cloudy damp and misty today </s>
注意:语料库的句子或词组数量越多,建立的语言模型就越好。比如,sphinx4开发包中的weather.txt语料库,差不多包含了1000,000条句子。
(2)生成词汇表文件
    词汇表文件,主要作用是包含(列出)语料库中出现的所有词汇。执行命令:
#text2wfreq < weather.txt | wfreq2vocab > weather.tmp.vocab
注意两点:
    a.如果你想从生成的词汇表文件中删除数字、错写单词、名字,你可以先查看语料库然后再对词汇表文件中的内容进行查找删除;
    b.如果你想要一个封闭的词汇语言模型(即语言模型中一般不允许出现语料库没有定义的单词),你可以从语料库中删除没有包含到词汇表文件的句子。
(3)使用以下命令生成arpa格式的语言模型
#% text2idngram -vocab weather.vocab -idngram weather.idngram < weather.closed.txt#% idngram2lm -vocab_type 0 -idngram weather.idngram -vocab \     weather.vocab -arpa weather.arpa
(4)生成CMU二进制格式文件(DMP)
#sphinx_lm_convert -i weather.arpa -o weather.lm.DMP
注意:CMUCLTK工具包和相应的命令,详见:The CMU-Cambridge Language Modeling Toolkit page
三、使用其他语言模型工具建模
   我们也可以使用其他工具包来生成ARPA文本文件,但是生成的文件必须能够被Sphinx解码器解码。比如我们可以使用SphinxBase中的sphinx_lm_sort工具来获取ARPA格式的语言模型文件,命令为:
#sphinx_lm_sort < unsorted.arpa > sorted.arpa,然后我们再调用sphinx_lm_covert工具最终生成DMP语言模型文件即可。另外一些工具如下:
  • IRSLM
  • MITLM
  • SRILM
四、使用在线建模工具建立语言模型
    由于Sphinx是老李和外国友人开发的,所以使用在线建模工具主要适用于英文且语料库比较小的语言建模,比如一些控制命令等。在线语言建模,步骤非常简单:
(1)建立我们所需要的语料库(corpus.txt)
open browsernew e-mailforwardbackwardnext windowlast windowopen music player

博主笔记:
    这里需要注意下,在线建模的语料库文本内容格式和使用CMUCLMTK工具建模是不一样的。

(2)在线语言建模 http://www.speech.cs.cmu.edu/tools/lmtool-new.html
    点击"Browse"-->选择语料库"corpus.txt"->点击"COMPILE KNOWLEDGE BASE"即可生成所需的语言模型(.lm)和词典(.dic).然后,我们就可以使用.lm和.dic这两个文件在PocketSphinx测试。
(3)将语言模型(.lm)转换为DMP格式
    为了应用程序能够快速的加载规模很大的语言模型,最好是将.lm格式的语言模型转换.DMP格式。因为DMP格式的语言模型为二进制形式,这样可以节省解码器初始化的时间。当然,对于小型的语言模型来说就没有必要了,可以直接使用.lm格式的语言模型。Pocketsphinx和sphinx3都支持使用-lm选项来使用(.lm)和(.DMP)格式的语言模型,但Sphinx4则需要将DMP格式的语言模型加载到 TrigramModel以及将ARPA模型加载到 SimpleNGramModel。
   由于ARPA格式和DMP格式的转换比较成熟,所以我们可以使用sphinxbase提供的 sphinx_lm_convert命令,将.lm格式的语言模型转换为.DMP格式的语言模型:
#sphinx_lm_convert -i model.lm -o model.dmp#sphinx_lm_convert -i model.dmp -ifmt dmp -o model.lm -ofmt arpa#sphinx_lm_convert -i model.arpa -o model.lm.DMP

博主笔记:
    .lm格式语言模型:适用于小语料库
    .DMP格式语言模型:使用与大语料库。两种都可以通过使用-lm选项来指定语言模型。

五、如何使用建立好的语言模型
1.在PocketSphinx中使用语言模型
    如果你已经安装好了PocketSphinx,PocketSphinx源文件中就会有一个名为pocketsphinx_continuous
应用程序例子。我们可以使用这个例子进行语言识别,但是需要指定其语言模型和字典文件:
命令:
  #pocketsphinx_continuous -lm 8521.lm -dict 8521.dic 
    当终端出现"READY…",就可以开始进行语音识别且准确率很好。如果比较差的话,则说明你的麦克风或者声卡有问题。
2.在Sphinx4中使用语言模型
    详见http://cmusphinx.sourceforge.net/sphinx4/doc/UsingSphinxTrainModels.html

















0 0