`
zuoshu
  • 浏览: 195953 次
  • 性别: 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
分享到:
评论
38 楼 bunnycarrot 2013-12-30  
cggycy820906 写道
你好,楼主,我下载您的demo,并把下载的data文件放到指定位置,在手机上运行后点击hold and speak按钮就卡住了,没有任何反应。请问这是什么原因?
另外,我在导入你的demo时,工程属性的builders多了两个错误的编译器
invalid external tool builder
invalid external tool builder


导入工程后要在eclipse里面重新配置一下NDK和SWIG,或者直接勾掉那两个builder
37 楼 cggycy820906 2013-12-18  
你好,楼主,安装您的demo,每次运行时log都提是以下错误,请问是什么原因?
12-18 08:15:49.247 F/libc    ( 4319): Fatal signal 11 (SIGSEGV) at 0x0000001c (code=1), thread 4334 (Thread-255)
36 楼 cggycy820906 2013-12-18  
你好,楼主,我下载您的demo,并把下载的data文件放到指定位置,在手机上运行后点击hold and speak按钮就卡住了,没有任何反应。请问这是什么原因?
另外,我在导入你的demo时,工程属性的builders多了两个错误的编译器
invalid external tool builder
invalid external tool builder
35 楼 zuoshu 2013-12-09  
tongxintong 写道
楼主,请问下你的中文样本是怎么来的,lm文件?

dic?网站上生成发音的文件
34 楼 tongxintong 2013-10-29  
楼主,请问下你的中文样本是怎么来的,lm文件?
33 楼 linianzhen 2013-10-29  
楼主,我想改成:比如喊"百度",然后打印出“百度”,然后我再喊“谷歌”,他把“百度”清空后再显示“谷歌”。请问楼主改哪几行代码可以实现上述效果啊?
32 楼 whybangbang1 2013-09-23  
为啥我把src下代码都删了还是能跑起来?
31 楼 xiangcao0670 2013-08-23  
中文能识别出来,但是英文识别不了,在log文件中发现如下error:(怎么回事呢?)

INFO: dict.c(321): Reading main dictionary: /mnt/sdcard/data/test/lm/test.dic
ERROR: "dict.c", line 194: Line 1: Phone 'K' is mising in the acoustic model; word 'CALL' ignored
ERROR: "dict.c", line 194: Line 2: Phone 'L' is mising in the acoustic model; word 'LEFT' ignored
ERROR: "dict.c", line 194: Line 3: Phone 'F' is mising in the acoustic model; word 'PHONE' ignored
ERROR: "dict.c", line 194: Line 4: Phone 'R' is mising in the acoustic model; word 'RIGHT' ignored
ERROR: "dict.c", line 194: Line 5: Phone 'S' is mising in the acoustic model; word 'SEARCH' ignored
30 楼 mickyhe520 2013-08-01  
楼主,有联系方式不?我的是QQ30011064,邮箱也是这个,请问下pocketsphinx_continuous 这个命令,要使用后面的声学,字典,语言文件放在哪个目录?我这里老是提示找不到文件来的。另外在线生成的现在只能生成字典与lm文件,没有声学文件了,而且没有语言选择,也就是不支持中文在线生成了,对不?
29 楼 zuoshu 2013-05-13  
lzybn007 写道
只有第一次可以识别,重新进入又可以了,这个怎么解决呢

hold and speak 那个按钮多点几次
28 楼 lzybn007 2013-05-08  
只有第一次可以识别,重新进入又可以了,这个怎么解决呢
27 楼 Tinux 2013-05-06  
补充说明:

Windows下txt默认的编码是ASNI,该编码方式下,汉字为两个字节。UTF-8编码方式,汉字为三个字节。这里汉字需要采用UTF-8编码格式。txt另存为时,编码选择有UTF-8,也可获取汉字的UTF-8编码,但是,另存为后,会发现文件的前三个字节为EF BB BF,这是UTF-8标记。
26 楼 Tinux 2013-05-04  
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文件。
25 楼 Tinux 2013-05-04  
问题解决。楼主文章中有几处错误和未说清楚的地方,如下:
(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语音模型,还是查找后生成命令集的字典,三个文件中的汉字必须都是三个字节编码方式,否则,都不会成功。
24 楼 Tinux 2013-05-03  
楼主,你好,首先谢谢你分享这篇文章。我测试了,运行附件的Demo程序,生成APK,安装到手机上后,再使用附件的data,测试OK,识别率也挺高的。在试着用Sphinx在线的生成自己的小范围词语时,按照文章中所说步骤操作,
首先,编写自己的命令集,如:
<s>向上</s>
<s>向下</s>
<s>向左</s>
。。。。。。
然后,在线生成,取lm文件。
最后,查找替换(自己编小工具从字典文件中查找的,测试过,替换正确无误)。

然后将生成好的自己的文件,按照附件data中test文件夹格式,替换原来的,识别不成功。试了好久,都不可以。

烦请楼主,是否可以告知原因,再或重新更新下文章,谢谢!
23 楼 marks_2010 2013-05-03  
楼主,在线生成语言模型和字段不能用于中文,这个需要怎么弄?
22 楼 zuoshu 2013-04-24  
wangym1989 写道
博主 你好!我下载了demo运行很正常,但是你提到的在线生成字典和声音模型文件 总是失败,提示 单词识别不了。但是测试了英文单词,是可以识别的。
日志如下:
WARN> cannot access hand-tuned dictionary file: ./3303.hdict // 3303.hdict
I think this is a non-word: 百度
pronounce: verbosity is 1
I think this is a non-word: 谷歌
I think this is a non-word: 开始
I think this is a non-word: 实验

请问,这个问题如何解决啊???

<s>百度</s>
添加<s>
21 楼 wangym1989 2013-03-07  
博主 你好!我下载了demo运行很正常,但是你提到的在线生成字典和声音模型文件 总是失败,提示 单词识别不了。但是测试了英文单词,是可以识别的。
日志如下:
WARN> cannot access hand-tuned dictionary file: ./3303.hdict // 3303.hdict
I think this is a non-word: 百度
pronounce: verbosity is 1
I think this is a non-word: 谷歌
I think this is a non-word: 开始
I think this is a non-word: 实验

请问,这个问题如何解决啊???
20 楼 zuoshu 2013-02-04  
songgeb 写道
cs3230524 写道
楼主,你所述的方法根本不能用于生成中文声学模型,得用CMUCLMTK自己做。。。不知道你是怎么成功的。。。

中文声学模型不需要自己做,在cumux中已经提供了中文的声学模型,只是字典和语言模型可能需要自己弄,我用官方提供的中文语言模型和字典测试没有识别出来。不过,楼主说的这中确实没有能实现。

不好意思,附件的文件有遗漏,已更新,文章中部分错误也更新,附件现已可用
19 楼 songgeb 2013-02-03  
cs3230524 写道
楼主,你所述的方法根本不能用于生成中文声学模型,得用CMUCLMTK自己做。。。不知道你是怎么成功的。。。

中文声学模型不需要自己做,在cumux中已经提供了中文的声学模型,只是字典和语言模型可能需要自己弄,我用官方提供的中文语言模型和字典测试没有识别出来。不过,楼主说的这中确实没有能实现。

相关推荐

Global site tag (gtag.js) - Google Analytics