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


Jiangdg_VIP



译自: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工具


 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语言模型文件即可。另外一些工具如下:



四、使用在线建模工具建立语言模型

适用于英文且语料库比较小的语言建模,比如一些控制命令等。在线语言建模,步骤非常简单:


(1)建立我们所需要的语料库(corpus.txt)

open browser
new e-mail
forward
backward
next window
last window
open 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_continuous


应用程序例子。我们可以使用这个例子进行语言识别,但是需要指定其语言模型和字典文件:


命令:


#pocketsphinx_continuous -lm 8521.lm -dict 8521.dic


    当终端出现"READY…",就可以开始进行语音识别且准确率很好。如果比较差的话,则说明你的麦克风或者声卡有问题。


2.在Sphinx4中使用语言模型

    详见 http://cmusphinx.sourceforge.net/sphinx4/doc/UsingSphinxTrainModels.html