Sphinx语音识别学习记录 (四)-小范围语音中文识别

CMUSphinx系列目录
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的可以查看下你们训练的文档编码格式对不对,有时候这个编码错误,直接出现空白的

 

 

能识别到中文真是纠结啊,各种查官网资料,语音识别资料,还有好几个博客。

虽然有些照做不能跑,但是毕竟博主们都各自运行成功过,都有不少借鉴价值

这套方案,虽然挺麻烦的,但至少可以用。大家先参考下

 

你可能感兴趣的:(sphinx)