`
zuoshu
  • 浏览: 194691 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Android平台使用PocketSphinx做离线语音识别,小范围语音99%识别率

 
阅读更多

 最近语音识别很火,但是都是用的在线语音识别,研究了一下离线语音识别,小范围内的语音识别率还不错,在此记录一下

首先本文要说的两个前提1.android平台离线语音识别 2.小范围语音

小范围语音指的是相对固定的命令。本文的例子大概实现了20条语音命令,超出范围的无法识别。因此本文中离线语音的使用范围也有限,对于一些固定的输入可能有用,比如用语音命令代替打开,播放,重启这些简单的固定的命令。

先上个例子

1.按照 http://leiwuluan.iteye.com/blog/1287305 的方法,先跑一个PocketSphinxDemo的例子起来。跑起来之后会发现语音识别率很低,大概20%不到。下面来优化一下

2.编写自己的命令集

<s>百度</s>
<s>谷歌</s>
<s>音乐</s>
<s>抬头</s>
<s>低头</s>

保存为command.txt

http://www.speech.cs.cmu.edu/tools/lmtool.html上点Browse,提交command.txt,在线生成语言模型文件。这里只要生成的lm文件,命名为test.lm。从这里下载pocketsphinx-win32,解压后在/model/lm/zh_cn有个mandarin_notone.dic的文件,打开后,搜索command.txt里面的词,然后替换相应的内容,替换后的内容如下

 存为test.dic

3.替换语言模型文件。下载附件中的data.zip,解压后文件如下(之前附件中的data不可用,已更新)

分别放到一下目录

/sdcard/Android/data/test/hmm/tdt_sc_8k
/sdcard/Android/data/test/lm/test.dic
/sdcard/Android/data/test/lm/test.lm

如果要换目录的话,对应修改RecognizerTask.RecognizerTask()里的如下代码

  c.setString("-hmm", "/sdcard/Android/data/test/hmm/tdt_sc_8k");
  c.setString("-dict", "/sdcard/Android/data/test/lm/test.dic");
  c.setString("-lm", "/sdcard/Android/data/test/lm/test.lm");

lm和dic文件即3中生成的文件,tdt_sc_8k也可以从这里下载。

4.文件准备完毕,重新跑1中的demo。语音输入2中的命令,识别率99%以上,但是输入命令集以外的无法识别。



 

6.附件为工程文件,将data解压,按照3里面写的位置放到sd卡里面即可。以下字典内的词可以识别

 

 

  • 大小: 4.6 KB
  • 大小: 13.4 KB
  • 大小: 29.1 KB
  • 大小: 5.5 KB
分享到:
评论
58 楼 haha220688 2018-01-20  
我已经解决了lm和dic文件不能识别的问题,使用notepad++ 这个软件去编辑就好了,同时编码格式修改为utf8无BOM格式的。在这个问题上我搞了1天时间
57 楼 740051022 2017-04-06  
lyt1993 写道
pi_jom 写道
楼主,你好,请问APK闪退怎么回事
请问你解决了吗?我也有这个问题


请问一下 解决了吗这个问题
56 楼 lyt1993 2016-11-15  
pi_jom 写道
楼主,你好,请问APK闪退怎么回事
请问你解决了吗?我也有这个问题

55 楼 Camain 2016-07-26  
楼主你好,我想请教一下PocketSphinx的demo在我不说话的时候也会有识别结果,这个怎么解决呢?
54 楼 pi_jom 2016-04-14  
楼主,你好,请问APK闪退怎么回事
53 楼 潇寒听竹 2016-01-18  
楼主,怎么实现连续识别呀?可以加Q讨论一下么?1175296816
52 楼 yyhjifeng 2016-01-06  
楼主。怎么跑步起来的呢代码。运行不行。方便加qq 396758286  请教请教
51 楼 lwl844059061 2015-08-05  
资源文件太好用了,牛逼啊
50 楼 wwp123 2015-06-05  
Fatal signal 11 (SIGSEGV) at 0x0000001c (code=1), thread 19060 (Thread-3033)哪个大哥帮我看看什么问题啊
49 楼 wwp123 2015-06-05  
Fatal signal 11 (SIGSEGV) at 0x0000001c (code=1), thread 19060 (Thread-3033)
48 楼 smile3670 2015-03-13  
问题解决,test.lm和test.dic文件,他们的字符编码和换行符有要求,字符编码需要是UTF-8,换行符需要是\n(即0x0A)。Unix 系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<换行><回车 >”,即“\n\r”;Mac系统里,每行结尾是“<回车>”。我的解决办法是在linux里编辑,里边换行是0x0A。中文通过在mandarin_notone.dic文件中搜索并拷贝。


Tinux 写道
Tinux 写道
问题解决。楼主文章中有几处错误和未说清楚的地方,如下:
(1)编写自己的命令集
-------------------------------
2.编写自己的命令集
<s>百度</s>
<s>谷歌</s>
<s>音乐</s>
<s>抬头</s>
<s>低头</s>
保存为command.txt
-------------------------------
编写自己的命令集时,不能使用txt直接编写,而且不需要<s></s>也行。我的命令集如下,
你好
效率
....
其中,词组的编码采用UTF-8格式,即每个汉字要占用3个字节,每个词组换行采用0x0A。比如,汉字“你”为E4 BD A0,第一行“你好”为“E4 BD A0 E5 A5 BD 0A”,下面的依次类推。至于怎样生成“你”的三个字节编码。我是从mandarin_notone.dic中编写程序查找的。

(2)从mandarin_notone.dic中查找自己的命令集

这里打开mandarin_notone.dic后(我使用的是UltraEdit打开的),查找到“你好”,直接选择拷贝,产生自己的命令集字典。这样操作的结果是,汉字都变成两个字节了,而不是mandarin_notone.dic字典中的三个字节。说明不能这样直接拷贝。自己编了个程序,查找
比较、写入新文件了,才解决了问题。

(3)测试Demo程序
我测试时,测试程序貌似只能使用一次,第二次就识别不了了,需退出重新打开才行。


最后,重复下,不管是提交的命令集,还是生成后的.lm语音模型,还是查找后生成命令集的字典,三个文件中的汉字必须都是三个字节编码方式,否则,都不会成功。


忘记说了,在线生成语音模型lm文件时,使用的是Simple Version,操作为:选择文件-->Compile Knowledge base--> gzip'd tar file,将会下载诸如TAR6184.tar.gz的压缩包,解压后,会发现.lm文件。

47 楼 sunny187148791 2015-01-16  
楼主,我想改成:比如喊"百度",然后打印出“百度”,然后我再喊“谷歌”,他把“百度”清空后再显示“谷歌”。请问楼主改哪几行代码可以实现上述效果啊?谢谢万分着急
46 楼 ljwshi2008 2014-11-13  
楼主:
    你的语言模型怎么生成的。可以详细告诉我一下吗?我也是UTF-8编码。但是就是识别不了,用你的语音模型就可以识别。
45 楼 a274239702 2014-09-18  
veveer 写道
请问为什么我把你的demo导入到adt中,能跑起来,但是只要一点“hold and speak”就闪退呢?logcat里显示
08-01 17:28:33.478: A/libc(20965): Fatal signal 11 (SIGSEGV) at 0x0000001c (code=1), thread 20979 (Thread-2681)
08-01 17:28:33.478: A/libc(20965): Send stop signal to pid:20965 in debugger_signal_handler

麻烦帮忙看一下吧,谢谢。



看看读取的文件夹路径对不对
44 楼 veveer 2014-08-01  
请问为什么我把你的demo导入到adt中,能跑起来,但是只要一点“hold and speak”就闪退呢?logcat里显示
08-01 17:28:33.478: A/libc(20965): Fatal signal 11 (SIGSEGV) at 0x0000001c (code=1), thread 20979 (Thread-2681)
08-01 17:28:33.478: A/libc(20965): Send stop signal to pid:20965 in debugger_signal_handler

麻烦帮忙看一下吧,谢谢。
43 楼 a398613391 2014-06-30  
楼主qiuzhu下阿 为什么我进入jni文件夹 build 老提示
make: *** No rule to make target `/home/lvtie/some_SDk/pocketSphinX/mySDK_jar/sphinxbase/src/libsphinxbase/util/info.c', needed by `/home/lvtie/xm/PocketSphinxAndroidDemo/obj/local/armeabi/objs-debug/sphinxutil/info.o'.  Stop.
求帮助不胜感谢
42 楼 xing仔 2014-03-22  
为什么我下载的demon导入elipse总是有错呢?
41 楼 zuoshu 2014-03-03  
stanlay19 写道

我问下 语言模型(lm文件),为什么我生成出来的,都无法识别呀?是不是字符编码的问题?
我是用原先的语言模型,自己加的字典却没问题

要UTF-8
40 楼 stanlay19 2014-02-26  

我问下 语言模型(lm文件),为什么我生成出来的,都无法识别呀?是不是字符编码的问题?
我是用原先的语言模型,自己加的字典却没问题
39 楼 野人参 2014-02-11  
识别空白或乱码的要注意tinux说的,文字编码一定要是3字节UTF8,可以用ultraedit看"你好"是不是如tinux的3字节。我就是卡在这个问题很久,后来用myeclipse(java开发工具)编写utf8的词库文件就都可以了

相关推荐

Global site tag (gtag.js) - Google Analytics