三、Pocketsphinx_Android中英文小范围高准确率
2014-10-27 12:42
218 查看
三、Pocketsphinx_Android中英文小范围高准确率
在跑通Android离线语音识别demo PocketSpinxAndroiDemo后,发现其使用pocketsphinx进行语音识别的准确率并不是很低。这和pocketsphinx语音识别所用的语言模型和声学模型相关。pocketsphinx-0.8源码自带几个语言模型和声学模型,pocketsphinx-0.7/model/hmm下的是声学模型(hmm应该指的是隐马尔科夫模型),pocketsphinx-0.7/model/lm下的是语言模型(lm表示language
model)。运行demo时使用的是美国英语的语言模型(/lm/en_US/hub4.5000.DMP)和声学模型(/hmm/en_US/hub4wsj_sc_8k)以及字典文件(/lm/en_US/hub4.5000.dic),/pocketsphinx/model目录
内容如下,
├── hmm
│ ├── en
│ │ └── tidigits
│ │ ├── feat.params
│ │ ├── mdef
│ │ ├── means
│ │ ├── sendump
│ │ ├── transition_matrices
│ │ └── variances
│ ├── en_US
│ │ └── hub4wsj_sc_8k
│ │ ├── feat.params
│ │ ├── mdef
│ │ ├── means
│ │ ├── noisedict
│ │ ├── sendump
│ │ ├── transition_matrices
│ │ └── variances
│ └── zh
│ └── tdt_sc_8k
│ ├── feat.params
│ ├── mdef
│ ├── means
│ ├── noisedict
│ ├── sendump
│ ├── transition_matrices
│ └── variances
└── lm
├── en
│ ├── tidigits.dic
│ ├── tidigits.DMP
│ ├── tidigits.fsg
│ ├── turtle.dic
│ └── turtle.DMP
├── en_US
│ ├── cmu07a.dic
│ ├── hub4.5000.DMP
│ └── wsj0vp.5000.DMP
├── zh_CN
│ ├── gigatdt.5000.DMP
│ └── mandarin_notone.dic
└── zh_TW
├── gigatdt.5000.DMP
└── mandarin_notone.dic
这个目录下的内容在后面还要使用到。
此外,CMU sphinx的官网提供了各种语言的声学模型和语言模型的下载,具体见,
http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/
本来应该有中文的,
声学模型:zh_broadcastnews_16k_ptm256_8000.tar.bz2
语言模型:zh_broadcastnews_64000_utf8.DMP
字典文件:zh_broadcastnews_utf8.dic
但现在去其官网上找已经没中文的了。。。另外,还可以使用语言模型训练工具CMUCLMTK和声学模型训练工具sphinxtrain,自己训练得到语言模型和声学模型,这样的效果应该是最好的(识别范围应该也能扩大不少),这里不详细讲述,可以参考最后的参考链接1。
小范围英文准确识别
Demo用的字典太大,相应的语言模型也很大,而这个语言模型和字典并非针对你而训练的,这是造成识别率低下的主要原因。因此,下面创建自己的语料库drone_ctr.txt,文件的内容是,
take off
land
turn left
turn right
forward
backward
spin left
spin right
up
down
hover
利用在线工具——在http://www.speech.cs.cmu.edu/tools/lmtool.html上点Browse提交drone_ctr.txt,在线生成语言模型文件(一个压缩文件),下载生成的压缩文件,解压,我们要使用其中的1172.lm和1172.dic代替原来使用的hub4.5000.DMP和hub4.5000.dic。打开1172.dic文件,其内容主要也就是drone_ctr.txt每一条语料加上其注音。替换语言模型和字典后,修改PocketSpinxAndroiDemo中RecognizerTask.java的代码如下,
c.setString("-hmm",
"/sdcard/Android/data/edu.cmu.pocketsphinx/hmm/en_US/hub4wsj_sc_8k");
c.setString("-dict",
"/sdcard/Android/data/edu.cmu.pocketsphinx/lm/1172.dic");
c.setString("-lm",
"/sdcard/Android/data/edu.cmu.pocketsphinx/lm/1172.lm");
由代码可知,我们仍然使用原来的声学模型,改变的只是语言模型和字典(1172.dic和1172.lm)。然后真机上调试,准确率就上来了~
经过试验,发现准确率在不改变字典的情况下仍然不高,这说明声学模型不变的情况下,字典范围得足够小才能准确识别。
小范围中文准确识别
和英文情况类似,先创建语料库drone_ctr.txt,文件的内容是,
起飞
降落
向左
向右
向前
向后
左转
右转
上升
下降
盘旋
利用在线工具——在http://www.speech.cs.cmu.edu/tools/lmtool.html上点Browse提交drone_ctr.txt,在线生成语言模型文件,下载生成的压缩文件,解压,我们要使用其中的9930.lm和9930.dic代替原来使用的hub4.5000.DMP和hub4.5000.dic。这时打开字典9930.dic,发现其内容和语料库drone_ctr.txt是一摸一样的,并没有在每一行后面加上音注,这是因为该在线工具不支持中文注音(由参考链接3可知,原来可能是支持的),所以需要自己加音注,加音注后的9930.dic文件如下,
上升 sh ang sh eng
下降 x ia j iang
右转 y ou zh uan
向前 x iang q ian
向右 x iang y ou
向后 x iang h ou
向左 x iang z uo
左转 z uo zh uan
盘旋 p an x uxan
起飞 q i f ei
降落 j iang l uo
后面音注我是从/pocketsphinx/model/lm/zh_CN/mandarin_notone.dic中找到相应的语料,然后将其音注拷过来的(本来想用zh_broadcastnews_utf8.dic字典库,但现在CMU
sphinx的官网上已经下不到中文声学模型和语言模型以及字典了),这再次证明了字典文件其实就是“语料+音注”。接下来,使用生成的语言模型9930.lm和自己编辑的字典9930.dic以及pocketsphinx-0.8源码自带中文声学模型/pocketsphinx/model/hmm/zh/tdt_sc_8k,并修改RecognizerTask.java代码,
c.setString("-hmm",
"/sdcard/Android/data/edu.cmu.pocketsphinx/hmm/zh/tdt_sc_8k");
c.setString("-dict",
"/sdcard/Android/data/edu.cmu.pocketsphinx/lm/9930.dic");
c.setString("-lm",
"/sdcard/Android/data/edu.cmu.pocketsphinx/lm/9930.lm");
这样就可以进行语料库范围的中文语音识别了,准确率很高!
博主笔记:
由于上面博文对PocketSphinx中文识别进行了比较详细的介绍,但是有一点需要强调的是,当创建语料库时(即将要训练的文本文件)需要l另存为uft-8编码格式,创建的字典(.dic)也同样要保存为uft-8编码格式。否则,应用程序在识别的时候会识别不出来或者识别结果为乱码。---windows下Eclipse的编译。
参考:
/article/1919410.html(语言/声学模型介绍)
http://blog.csdn.net/zouxy09/article/category/1218766(Sphinx很好很全面的资料,工具使用、API编程等)
http://zuoshu.iteye.com/blog/1463867 (修改Demo的语言/声学模型,英文识别)
http://www.cnblogs.com/yin52133/archive/2012/07/12/2588201.html#2525875 (中文识别解决方案)
在跑通Android离线语音识别demo PocketSpinxAndroiDemo后,发现其使用pocketsphinx进行语音识别的准确率并不是很低。这和pocketsphinx语音识别所用的语言模型和声学模型相关。pocketsphinx-0.8源码自带几个语言模型和声学模型,pocketsphinx-0.7/model/hmm下的是声学模型(hmm应该指的是隐马尔科夫模型),pocketsphinx-0.7/model/lm下的是语言模型(lm表示language
model)。运行demo时使用的是美国英语的语言模型(/lm/en_US/hub4.5000.DMP)和声学模型(/hmm/en_US/hub4wsj_sc_8k)以及字典文件(/lm/en_US/hub4.5000.dic),/pocketsphinx/model目录
内容如下,
├── hmm
│ ├── en
│ │ └── tidigits
│ │ ├── feat.params
│ │ ├── mdef
│ │ ├── means
│ │ ├── sendump
│ │ ├── transition_matrices
│ │ └── variances
│ ├── en_US
│ │ └── hub4wsj_sc_8k
│ │ ├── feat.params
│ │ ├── mdef
│ │ ├── means
│ │ ├── noisedict
│ │ ├── sendump
│ │ ├── transition_matrices
│ │ └── variances
│ └── zh
│ └── tdt_sc_8k
│ ├── feat.params
│ ├── mdef
│ ├── means
│ ├── noisedict
│ ├── sendump
│ ├── transition_matrices
│ └── variances
└── lm
├── en
│ ├── tidigits.dic
│ ├── tidigits.DMP
│ ├── tidigits.fsg
│ ├── turtle.dic
│ └── turtle.DMP
├── en_US
│ ├── cmu07a.dic
│ ├── hub4.5000.DMP
│ └── wsj0vp.5000.DMP
├── zh_CN
│ ├── gigatdt.5000.DMP
│ └── mandarin_notone.dic
└── zh_TW
├── gigatdt.5000.DMP
└── mandarin_notone.dic
这个目录下的内容在后面还要使用到。
此外,CMU sphinx的官网提供了各种语言的声学模型和语言模型的下载,具体见,
http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/
本来应该有中文的,
声学模型:zh_broadcastnews_16k_ptm256_8000.tar.bz2
语言模型:zh_broadcastnews_64000_utf8.DMP
字典文件:zh_broadcastnews_utf8.dic
但现在去其官网上找已经没中文的了。。。另外,还可以使用语言模型训练工具CMUCLMTK和声学模型训练工具sphinxtrain,自己训练得到语言模型和声学模型,这样的效果应该是最好的(识别范围应该也能扩大不少),这里不详细讲述,可以参考最后的参考链接1。
小范围英文准确识别
Demo用的字典太大,相应的语言模型也很大,而这个语言模型和字典并非针对你而训练的,这是造成识别率低下的主要原因。因此,下面创建自己的语料库drone_ctr.txt,文件的内容是,
take off
land
turn left
turn right
forward
backward
spin left
spin right
up
down
hover
利用在线工具——在http://www.speech.cs.cmu.edu/tools/lmtool.html上点Browse提交drone_ctr.txt,在线生成语言模型文件(一个压缩文件),下载生成的压缩文件,解压,我们要使用其中的1172.lm和1172.dic代替原来使用的hub4.5000.DMP和hub4.5000.dic。打开1172.dic文件,其内容主要也就是drone_ctr.txt每一条语料加上其注音。替换语言模型和字典后,修改PocketSpinxAndroiDemo中RecognizerTask.java的代码如下,
c.setString("-hmm",
"/sdcard/Android/data/edu.cmu.pocketsphinx/hmm/en_US/hub4wsj_sc_8k");
c.setString("-dict",
"/sdcard/Android/data/edu.cmu.pocketsphinx/lm/1172.dic");
c.setString("-lm",
"/sdcard/Android/data/edu.cmu.pocketsphinx/lm/1172.lm");
由代码可知,我们仍然使用原来的声学模型,改变的只是语言模型和字典(1172.dic和1172.lm)。然后真机上调试,准确率就上来了~
经过试验,发现准确率在不改变字典的情况下仍然不高,这说明声学模型不变的情况下,字典范围得足够小才能准确识别。
小范围中文准确识别
和英文情况类似,先创建语料库drone_ctr.txt,文件的内容是,
起飞
降落
向左
向右
向前
向后
左转
右转
上升
下降
盘旋
利用在线工具——在http://www.speech.cs.cmu.edu/tools/lmtool.html上点Browse提交drone_ctr.txt,在线生成语言模型文件,下载生成的压缩文件,解压,我们要使用其中的9930.lm和9930.dic代替原来使用的hub4.5000.DMP和hub4.5000.dic。这时打开字典9930.dic,发现其内容和语料库drone_ctr.txt是一摸一样的,并没有在每一行后面加上音注,这是因为该在线工具不支持中文注音(由参考链接3可知,原来可能是支持的),所以需要自己加音注,加音注后的9930.dic文件如下,
上升 sh ang sh eng
下降 x ia j iang
右转 y ou zh uan
向前 x iang q ian
向右 x iang y ou
向后 x iang h ou
向左 x iang z uo
左转 z uo zh uan
盘旋 p an x uxan
起飞 q i f ei
降落 j iang l uo
后面音注我是从/pocketsphinx/model/lm/zh_CN/mandarin_notone.dic中找到相应的语料,然后将其音注拷过来的(本来想用zh_broadcastnews_utf8.dic字典库,但现在CMU
sphinx的官网上已经下不到中文声学模型和语言模型以及字典了),这再次证明了字典文件其实就是“语料+音注”。接下来,使用生成的语言模型9930.lm和自己编辑的字典9930.dic以及pocketsphinx-0.8源码自带中文声学模型/pocketsphinx/model/hmm/zh/tdt_sc_8k,并修改RecognizerTask.java代码,
c.setString("-hmm",
"/sdcard/Android/data/edu.cmu.pocketsphinx/hmm/zh/tdt_sc_8k");
c.setString("-dict",
"/sdcard/Android/data/edu.cmu.pocketsphinx/lm/9930.dic");
c.setString("-lm",
"/sdcard/Android/data/edu.cmu.pocketsphinx/lm/9930.lm");
这样就可以进行语料库范围的中文语音识别了,准确率很高!
博主笔记:
由于上面博文对PocketSphinx中文识别进行了比较详细的介绍,但是有一点需要强调的是,当创建语料库时(即将要训练的文本文件)需要l另存为uft-8编码格式,创建的字典(.dic)也同样要保存为uft-8编码格式。否则,应用程序在识别的时候会识别不出来或者识别结果为乱码。---windows下Eclipse的编译。
参考:
/article/1919410.html(语言/声学模型介绍)
http://blog.csdn.net/zouxy09/article/category/1218766(Sphinx很好很全面的资料,工具使用、API编程等)
http://zuoshu.iteye.com/blog/1463867 (修改Demo的语言/声学模型,英文识别)
http://www.cnblogs.com/yin52133/archive/2012/07/12/2588201.html#2525875 (中文识别解决方案)
相关文章推荐
- Android离线语音识别-中英文,小范围,高准确率
- Android下通过pocketsphinx实现离线语音识别的环境搭建和demo运行
- Android本地语音识别引擎PocketSphinx-语言建模
- Android下PocketSphinx的离线语音识别
- Building PocketSphinxAndroidDemo (from CMUSphinx project)
- 编译运行 pocketsphinx android demo 需要注意的问题
- 编译pocketsphinx-android
- Android下通过pocketsphinx实现离线语音识别的环境搭建和demo运行(续)--实现Windows下的语音识别
- Android下通过pocketsphinx实现离线语音识别的环境搭建和demo运行(续)--实现Windows下的语音识别
- 一、PocketSphinx-Android DNK环境搭建
- Android下PocketSphinx的离线语音识别
- 二、PocketSphinx-Android编译与运行
- Android下PocketSphinx的离线语音识别
- [置顶] Android下通过pocketsphinx实现离线语音识别的环境搭建和demo运行
- Android离线语音识别(PocketSphinx)
- Android离线语音识别(PocketSphinx)
- 3ff8 android地图,判断坐标是否在你要求的范围内
- Android项目技术总结:获取状态栏和标题栏并计算长宽来限制绘制浮动窗口活动范围
- Android permission 权限类及中英文说明
- android 联系人 中英文排序 --代码仓库