![]()
关于中文识别 网上很多都是学习自下面的博客,Sphinx武林秘籍(上) 但很多人照做之后纷纷表示识别不出来,我们猜测是某个参数设定错误或者版本变化导致的 http://www.cnblogs.com/huanghuang/archive/2011/07/14/2106579.html 然后最近我也看了几篇,查看思路发现了下面两篇文章 http://leiwuluan./blog/1287305 - pocketsphinxAdroid离线语音识别---入门 http://zuoshu./blog/1463867 - Android平台使用PocketSphinx做离线语音识别,小范围语音99%识别率
这两篇文章,一个说20%识别,一个说99% 然后再仔细看之后发现是 tdt_sc_8k 中文识别模型 然后小范围语音99%识别率这个博客的博主(好长的称呼,直接叫99博主算了。。。)说的直接用在线工具(http://www.speech.cs./tools/lmtool.html)生成的字典和语言模型,那时候我去测试了下,发现不支持分词,也不支持语料库里注音,我就直接扔掉了结果。。。现在想来,我应该也测试一把的 然后我突然想到,上次那个zh_broadcastnews_ptm256_8000 虽然测试的没识别出来任何东西,但不是有个很全的语料库吗?2.1mb的纯文本 我就去打开了看,并挨个单词搜了下,单词的确很全 但是LM模型呢?在线工具不支持中文分词。。。我自己有没搞懂lm的格式和参数各自是什么 然后想到不支持分词,那我自己分词,然后让在线工具生成不行吗?就跟上午英语识别一样 下面是我的command6.txt 打开 浏览器 打开 音乐 打开 记事本 关闭 窗口 关闭 音乐 然后直接用生成的6010.lm,因为6010.dic注音表完全是空白的(在线工具不支持中文注音映射到英文)直接扔掉。 然后直接调用了zh_broadcastnews_utf8.dic,发现识别不出来。。。明明和上午的格式一样 然后想起来zh_broadcastnews_utf8.dic这个这么大,lm那么小,是不是太大了,而且文件开头一大段看不懂的东东然后我自己就临时创建了一个6010.dic 内容是 这里的发音是怎么出来的?我其实就是在zh_broadcastnews_utf8.dic里面查找到那个单词后,复制过来的 然后测试 pocketsphinx_continuous -hmm tdt_sc_8k -lm 6010.lm -dict 6010.dic 我去,竟然能识别的出来。。。下面是结果 INFO: ngram_search.c(875): bestpath 0.00 CPU 0.000 xRT INFO: ngram_search.c(878): bestpath 0.00 wall 0.001 xRT 000000003: 打开 浏览器 READY.... Listening... Stopped listening, please wait... INFO: cmn_prior.c(121): cmn_prior_update: from < 50.66 1.37 0.15 0.75 -0.44 0.37 0.02 0.19 -0.09 0.08 0.04 -0.07 -0.00 > INFO: cmn_prior.c(139): cmn_prior_update: to < 52.13 1.51 0.64 0.68 -0.80 0.44 -0.26 0.10 -0.07 -0.03 0.08 -0.19 -0.02 > INFO: ngram_search_fwdtree.c(1549): 825 words recognized (5/fr) INFO: ngram_search_fwdtree.c(1551): 18335 senones evaluated (111/fr) INFO: ngram_search_fwdtree.c(1553): 7691 channels searched (46/fr), 965 1st, 4828 last INFO: ngram_search_fwdtree.c(1557): 1203 words for which last channels evalu ated (7/fr) INFO: ngram_search_fwdtree.c(1560): 343 candidate words for entering last p hone (2/fr) INFO: ngram_search_fwdtree.c(1562): fwdtree 0.05 CPU 0.028 xRT INFO: ngram_search_fwdtree.c(1565): fwdtree 2.52 wall 1.528 xRT INFO: ngram_search_fwdflat.c(305): Utterance vocabulary contains 5 words INFO: ngram_search_fwdflat.c(940): 630 words recognized (4/fr) INFO: ngram_search_fwdflat.c(942): 14119 senones evaluated (86/fr) INFO: ngram_search_fwdflat.c(944): 6618 channels searched (40/fr) INFO: ngram_search_fwdflat.c(946): 1293 words searched (7/fr) INFO: ngram_search_fwdflat.c(948): 206 word transitions (1/fr) INFO: ngram_search_fwdflat.c(951): fwdflat 0.03 CPU 0.019 xRT INFO: ngram_search_fwdflat.c(954): fwdflat 0.02 wall 0.015 xRT INFO: ngram_search.c(1201): </s> not found in last frame, using <sil>.163 instea d INFO: ngram_search.c(1253): lattice start node <s>.0 end node <sil>.105 INFO: ngram_search.c(1281): Eliminated 99 nodes before end node INFO: ngram_search.c(1386): Lattice has 215 nodes, 219 links INFO: ps_lattice.c(1352): Normalizer P(O) = alpha(<sil>:105:163) = -1028613 INFO: ps_lattice.c(1390): Joint P(O,S) = -1029390 P(S|O) = -777 INFO: ngram_search.c(875): bestpath 0.00 CPU 0.000 xRT INFO: ngram_search.c(878): bestpath 0.00 wall 0.001 xRT 000000004: 关闭 音乐 如果的确说了的话,也跟上午的准确率差不多,说了11句,全部识别正确了 不过这个识别库貌似比较敏感,我没说话,只有键盘声音他竟然能识别成打开 要实用的话、这个问题可能要解决。
然后hmm模型调用 zh_broadcastnews_ptm256_8000之后,发现他智能识别一开始语料库里出现过,所以在语料库有记录的组合 这样的话,损失一些自由度,比如我开始的语料库没有 ”打开窗口“这句话,但是使用tdt_sc_8k这个模型,他能准确的识别出来,而zh_broadcastnews_ptm256_8000识别不出来。应该是对lm的依赖度和策略选择问题。 上午的hub4wsj_sc_8k和tdt_sc_8k都是默认提供的简单模型,实际使用识别都很准确。但是tdt_sc_8k有时候过于自由敏感,某一次连键盘敲击声竟然都识别成了打开 不过有人说话的话还是很准确的。 至于这个自由度的度量,只能看你们需要什么程度的模型了。
然后就是那个zh_broadcastnews_utf8.dic这个字典、如果你不想自己搜索,并粘贴过去,可以。但是你需要把dic字典文档的编码转换成GB2312的、那样才能识别,否则系统识别不了你的字典。因为zh_broadcastnews_utf8.dic这个本身的编码是utf8的、而windows下貌似默认识别的是GB2312;UTF-8的会出现乱码或者不能识别 而linux下又只是识别UTF-8,而不识别GB2312。跟着武林秘籍训练lm和dic的可以查看下你们训练的文档编码格式对不对,有时候这个编码错误,直接出现空白的
能识别到中文真是纠结啊,各种查官网资料,语音识别资料,还有好几个博客。 虽然有些照做不能跑,但是毕竟博主们都各自运行成功过,都有不少借鉴价值 这套方案,虽然挺麻烦的,但至少可以用。大家先参考下
|
|