Sphinx语音识别学习记录 (四)-小范围语音中文识别
http://www.cnblogs.com/yin52133/archive/2012/06/21/2557219.html - (一)基本运行测试 http://www.cnblogs.com/yin52133/archive/2012/07/12/2587282.html - (二)自然语言处理原理研究 http://www.cnblogs.com/yin52133/archive/2012/07/12/2587419.html - (三)小范围语音英文识别 http://www.cnblogs.com/yin52133/archive/2012/07/12/2588201.html - (四)小范围语音中文识别 http://www.cnblogs.com/yin52133/archive/2012/06/22/2558806.html - (五)错误调试 http://www.cnblogs.com/yin52133/archive/2012/07/12/2588418.html - (六)我的目标和几个想像的方案(闲置中)
关于中文识别
网上很多都是学习自下面的博客,Sphinx武林秘籍(上)
但很多人照做之后纷纷表示识别不出来,我们猜测是某个参数设定错误或者版本变化导致的
http://www.cnblogs.com/huanghuang/archive/2011/07/14/2106579.html
然后最近我也看了几篇,查看思路发现了下面两篇文章
http://leiwuluan.iteye.com/blog/1287305 - pocketsphinxAdroid离线语音识别---入门
http://zuoshu.iteye.com/blog/1463867 - Android平台使用PocketSphinx做离线语音识别,小范围语音99%识别率
这两篇文章,一个说20%识别,一个说99%
然后再仔细看之后发现是 tdt_sc_8k 中文识别模型
然后小范围语音99%识别率这个博客的博主(好长的称呼,直接叫99博主算了。。。)说的直接用在线工具(http://www.speech.cs.cmu.edu/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
内容是
窗口 ch uang k ou 打开 d a k ai 关闭 g uan b i 记事本 j i sh ib b en 浏览器 l iu l an q i 音乐 y in uxs uxe
这里的发音是怎么出来的?我其实就是在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的可以查看下你们训练的文档编码格式对不对,有时候这个编码错误,直接出现空白的
能识别到中文真是纠结啊,各种查官网资料,语音识别资料,还有好几个博客。
虽然有些照做不能跑,但是毕竟博主们都各自运行成功过,都有不少借鉴价值
这套方案,虽然挺麻烦的,但至少可以用。大家先参考下