锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / 语音识别开源 / CMU建立语言模型
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

CMU建立语言模型


语言模型是配置的重要组成部分,它告诉解码器哪些单词序列可以识别。语言模型是用来计算一个句子出现概率的概率模型。它主要用于决定哪个词序列的可能性更大,或者在出现了几个词的情况下预测下一个即将出现的词语的内容。换一个说法说,语言模型是用来约束单词搜索的。它定义了哪些词能跟在上一个已经识别的词的后面(匹配是一个顺序的处理过程),这样就可以为匹配过程排除一些不可能的单词。
有几种类型的模型:关键字列表,语法和统计语言模型以及语音语言模型。它们具有不同的功能和性能属性。您可以根据需要选择任何解码模式,甚至可以在运行时切换模式。有关更多详细信息,请参阅Pocketsphinx教程
实际使用关注“使用CMUCLMTK训练ARPA模型”章节。
关键字列表
Pocketsphinx支持关键字定位模式,您可以在其中指定要查找的关键字列表。此模式的优点是您可以为每个关键字指定阈值,以便可以在连续语音中检测关键字。即使您使用的词不在语法范围,所有其他模式也会尝试检测语法中的单词。典型的关键字列表如下所示:
oh mighty computer /1e-40/
hello world /1e-30/
other phrase /1e-20/
必须为每个关键短语指定阈值。对于较短的关键短语,您可以使用较小的阈值,例如1e-1,对于较长的关键短语,阈值必须更大,最高可达1e-50。如果您的关键短语很长 - 大于10个音节 - 建议将其拆分并分别找到部分。必须调整阈值以平衡错误警报和错过检测。最好的方法是使用预先录制的音频文件。常见的调整过程如下:

  1. 只需少量关键字和其他声音即可进行长时间录制。你可以拍电影声音或其他东西。音频长度应约为1小时。
  2. 对每个关键字使用不同阈值的文件运行关键字定位,请使用以下命令:
  •  pocketsphinx_continuous -infile <your_file.wav> -keyphrase <your keyphrase> \
  •   -kws_threshold <your_threshold> -time yes

该命令将打印多行,其中一些是具有检测时间和置信度的关键字。您还可以使用-logfn your_file.log选项禁用额外的日志以避免混乱。

  1. 根据您的关键字定位结果,计算您遇到的错误警报和错过的检测数量。
  2. 选择具有最小误报警和错过检测的阈值。

为获得最佳准确度,最好使用带有3-4个音节的关键短语。太短的短语容易混淆。
关键字列表仅由pocketsphinx支持,sphinx4无法处理它们。
在PocketSphinx中使用关键字列表
要在命令行中使用关键字列表,请使用该-kws选项指定它。您还可以使用-keyphrase选项指定单个关键短语。
在Python中,您可以在配置对象中指定选项,也可以为关键短语添加命名搜索:
decoder.set_kws('keyphrase', kws_file)
decoder.set_search('keyphrase')
在Android中它看起来很相似:
recognizer.setKws('keyphrase', kwsFile);
recognizer.startListening('keyphrase')
请注意与选项-kws冲突。您不能同时指定两者。-lm-jsgf
语法
语法描述了一种非常简单的命令和控制语言。它们通常是手写或在代码中自动生成的。语法通常没有单词序列的概率,但可能会对某些元素进行权衡。它们可以使用Java Speech Grammar Format(JSGF)创建,并且通常具有.gram.jsgf等文件扩展名。
语法允许您非常精确地指定可能的输入,例如,某个单词可能只重复两次或三次。但是,如果您的用户不小心跳过语法所需的单词,这种严格性可能会有害。在这种情况下,整个认可将失败。因此,最好使语法更灵活。而不是短语,只需列出允许任意顺序的单词包。避免使用包含许多规则和案例的非常复杂的语法。它只会减慢识别器的速度,您可以使用简单的规则。在过去,语法需要花费很多精力来调整它们,正确地分配变体等等。大型VXML咨询行业就是这样。
建立一个语法
语法通常以Java Speech Grammar Format(JSGF)手动编写:
#JSGF V1.0;

grammar hello;
public <greet> = (good morning | hello) ( bhiksha | evandro | rita | will );
有关JSGF的更多信息,请参阅有关W3C的 完整文档
在PocketSphinx中使用您的语法
要在命令行中使用语法,请使用-jsgf选项指定它。
在Python中,您可以在配置对象中指定选项,也可以为语法添加命名搜索:
decoder.set_jsgf('grammar', jsgf_file)
decoder.set_search('grammar')
在Android中,这看起来很相似:
recognizer.setJsgf('grammar', jsgfFile);
recognizer.startListening('grammar')
请注意与选项-jsgf冲突。您不能同时指定两者。-kws-jsgf

统计语言模型

统计语言模型描述了更复杂的语言。它们包含单词和单词组合的概率。这些概率是根据样本数据估算的,并自动具有一定的灵活性。虽然每种组合的概率会有所不同,但词汇表中的每种组合都是可能的。例如,如果您从单词列表创建统计语言模型,它仍然允许解码单词组合,即使这可能不是您的意图。
总的来说,建议使用统计语言模型进行自由格式输入,用户可以用自然语言说出任何内容。它们需要比语法更少的工程工作量。你只需列出可能的句子。例如,您可以列出“二十一”和“三十三”之类的数字,统计语言模型也允许具有一定概率的“三十一”。
通常,现代语音识别界面往往更自然并且避免了上一代的命令和控制风格。因此,大多数界面设计人员更喜欢使用统计语言模型进行自然语言识别,而不是使用老式的VXML语法。
关于设计VUI接口的主题,您可能会对以下书籍感兴趣:成为一个好人而不是坏人的话: Bruce Balentine 在Jetsonian时代的黄昏时语音识别和其他异域用户界面
有许多方法可以构建统计语言模型。当您的数据集很大时,使用CMU语言建模工具包是有意义的。当模型很小时,您可以使用快速在线Web服务。当您需要特定选项或者您只想使用自己喜欢的构建ARPA模型的工具包时,您也可以使用它。
语言模型可以以三种不同的格式存储和加载:文本 ARPA格式,二进制BIN格式和二进制DMP格式。ARPA格式占用更多空间,但可以编辑它。ARPA文件有一个.lm扩展名。二进制格式占用的空间更少,加载速度更快。二进制文件有.lm.bin扩展名。也可以在这些格式之间进行转换。DMP格式已过时,不推荐使用。
建立统计语言模型
文字准备
首先,您需要准备大量干净的文本。展开缩写,将数字转换为单词,清除非单词项目。例如,要清理Wikipedia XML转储,您可以使用特殊的Python脚本,如Wikiextractor。要清理HTML页面,您可以尝试BoilerPipe。这是一个专门用于从HTML中提取文本的包。
有关如何从Wikipedia文本创建语言模型的示例,请参阅此博客文章。电影字幕也是口语的良好来源。
完成语言建模过程后,请将您的语言模型提交给CMUSphinx项目。我们很乐意与大家分享!
普通话和其他类似语言的语言建模与英语大致相同,还有一个额外的考虑因素。不同之处在于输入文本必须是分词。提供分割工具和相关联的单词列表以实现此目的。
使用SRILM训练ARPA模型
使用SRI语言建模工具包(SRILM)训练模型很容易。这就是我们推荐它的原因。此外,SRILM是迄今为止最先进的工具包。要训​​练模型,您可以使用以下命令:
ngram-count -kndiscount -interpolate -text train-text.txt -lm your.lm
您可以在之后修剪模型以减小模型的大小:
ngram -lm your.lm -prune 1e-8 -write-lm your-pruned.lm
在训练之后,测试模型在测试数据上的困惑是值得的:
ngram -lm your.lm -ppl test-text.txt

使用CMUCLMTK训练ARPA模型

您需要下载并安装CMUSphinx(CMUCLMTK)的语言模型工具包。有关详细信息,请参阅下载页面
创建语言模型的过程如下:

上图的文字不用,图形供参数,从文本一直到模型输出的流程要关注掌握。

1准备将用于生成语言模型的参考文本。

语言模型工具包期望其输入采用标准化文本文件的形式,其中话语由<s>标记和</s>标记分隔。许多输入过滤器可用于特定语料库,例如Switchboard,ISL和NIST会议以及HUB5转换脚本。结果应该是由句子的开始和结束标记限定的句子集合:<s>和</s>。这是一个例子:
<s> generally cloudy today with scattered outbreaks of rain and drizzle
persistent and heavy at times </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 or moderate mainly
east south east breeze </s>
<s> cloudy damp and misty today with spells of rain and drizzle in most places
much of this rain will be light and patchy but heavier rain may develop in the
west later </s>
更多数据将生成更好的语言模型。weather.txt来自sphinx4 的文件(用于生成天气语言模型)包含近100,000个句子。
这里仅仅是举一个样例,所以语料库也不大,而一般的语料库都是由大文本来组成的,里面就是有一些我们的日经常使用语或者报纸啊,书啊等等所出现过的句子。文本数据越大,训练得到的语言模型就越好。
在 .txt中输入例如以下内容,记住结尾不可留“\n”(实验证明了这一点),意思是有自然换行就行,不需要标记换行,如果是文件格式问题,用ultraedit的格式转换”DOS转Unix”来处理下。每一个utterances由 <s> 和 </s>来分隔

2生成词汇表文件

这是文件中所有单词的列表:
text2wfreq < weather.txt | wfreq2vocab > weather.tmp.vocab
命令text2wfreq:统计文本文件里每一个词出现的次数,得到一个后缀为wfreq的文件,内容演示样例为:
二1334
九1334
</s> 3680
即表示词二、九和</s>在训练文本中出现的次数依次为1334、1334、3680。
命令wfreq2vocab:统计文本文件里含有多少个词,即有哪些词

3校正

您可能想要编辑词汇表文件以删除单词(数字,拼写错误,名称)。如果您发现拼写错误,最好删除。

4剔除

如果你想要一个封闭的词汇表语言模型(一个没有未知单词规定的语言模型),那么你应该从输入的抄本中删除包含词汇文件中没有的单词的句子。

5使用以下命令生成ARPA格式语言模型:

  text2idngram -vocab weather.vocab -idngram weather.idngram < weather.closed.txt
idngram2lm -vocab_type 0 -idngram weather.idngram -vocab weather.vocab -arpa weather.lm
命令text2idngram:列举文本中出现的每一个n元语法。产生一个二进制文件,含有一个n元数组的数值排序列表,相应于与词有关的的N-Gram。超出文本范围的词汇映射值为0。
命令idngram2lm:输入文件包括一个idngram文件,一个vocab文件和一个ccs文件,输出是一个后缀为binlm的语言模型文件。当中ccs文件指句首和句尾的静音<s>和</s>。
命令binlm2arpa:是将binlm文件转换为实验中须要的arpa格式语言模型文件。

6转换为 CMU的二进制格式 (DMP):

        假设你的语言模型比較大的话,最好就转换为CMU的二进制格式 (DMP),这样能够加快载入语言模型的速度,降低解码器初始化的时间。但对于小模型来说,就没有这个必要,由于sphinx3能处理这两种后缀名的语言模型文件。
#sphinx_lm_convert -i weather.arpa -o weather.lm.DMP
注:有上文说dmp被淘汰了,本次不用它,用下面命令行结果:
生成CMU二进制格式(BIN):
sphinx_lm_convert -i weather.lm -o weather.lm.bin

使用Web服务构建简单的语言模型

如果您的语言是英语并且文本很小,那么使用Web服务构建它有时会更方便。以这种方式构建的语言模型对于简单的命令和控制任务非常有用。首先,您需要创建一个语料库。
“语料库”只是用于训练语言模型的句子列表。例如,我们将为移动互联网设备使用假设的语音控制任务。我们想告诉它诸如“打开浏览器”,“新电子邮件”,“前进”,“后退”,“下一个窗口”,“最后一个窗口”,“打开音乐播放器”等等。因此,我们将首先创建一个名为corpus.txt的文件:
open browser
new e-mail
forward
backward
next window
last window
open music player
然后转到LMTool页面。只需单击“浏览...”按钮,选择corpus.txt您创建的文件,然后单击“COMPILE KNOWLEDGE BASE”
您应该看到一个包含一些状态消息的页面,然后是一个名为“Sphinx知识库”的页面。该页面将包含名为“Dictionary”“Language Model”的链接。下载这些文件,并记下他们的名字(他们应该由一个4位数字后面的扩展 .dic和.lm)。您现在可以使用PocketSphinx测试新创建的语言模型。

使用其他语言模型工具包

有许多工具包可以从文本文件创建ARPA n-gram语言模型。
您可以尝试一些工具包:

如果您正在培训大型词汇量语音识别系统,则语言模型培训将在关于大规模语言模型单独页面中概述。
创建ARPA文件后,您可以将模型转换为二进制格式以加快加载速度。
将模型转换为二进制格式
要快速加载大型模型,您可能希望将它们转换为二进制格式,以节省解码器初始化时间。对于小型号来说,这不是必需的。Pocketsphinx和sphinx3可以选择处理它们-lm。Sphinx4通过lm文件的扩展名自动检测格式。
ARPA格式和BINARY格式是可相互转换的。您可以使用sphinxbase中的命令sphinx_lm_convert生成另一个文件:
sphinx_lm_convert -i model.lm -o model.lm.bin
sphinx_lm_convert -i model.lm.bin -ifmt bin -o model.lm -ofmt arpa
您也可以通过这种方式将旧的DMP模型转换为二进制格式。
在下一节中,我们将讨论如何使用,测试和改进您创建的语言模型。
在PocketSphinx中使用您的语言模型
如果您已经安装了PocketSphinx,那么您将拥有一个 pocketsphinx_continuous可以从命令行运行以识别语音的程序。假设它是安装在 /usr/local,你的语言模型和字典被称为8521.dic和8521.lm并放置在当前文件夹,请尝试运行下面的命令:
pocketsphinx_continuous -inmic yes -lm 8521.lm -dict 8521.dic
这将使用您的新语言模型,字典和默认声学模型。在Windows上,您还必须使用以下-hmm选项指定声学模型文件夹:
bin/Release/pocketsphinx_continuous.exe -inmic yes -lm 8521.lm -dict 8521.dic -hmm model/en-us/en-us
您将看到许多诊断消息,然后是暂停,然后输出 “READY ...”。现在您可以尝试说出一些命令。它应该能够完全准确地识别它们。如果没有,您可能会遇到麦克风或声卡问题。
在Sphinx4中使用您的语言模型
在Sphinx4高级API中,您需要在配置中指定语言模型的位置:
configuration.setLanguageModelPath("file:8754.lm");
如果模型在资源中,您可以使用以下内容引用它"resource:URL":
configuration.setLanguageModelPath("resource:/com/example/8754.lm");
另请参阅Sphinx4教程以获取更多详细信息。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内