在跑通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)。而后真机上调试,准确率就上来了~
通过试验,发现准确率在不改变字典的状况下仍然不高,这说明声学模型不变的状况下,字典范围得足够小才能准确识别。
后面音注我是从
/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")
;
这样就能够进行语料库范围的中文语音识别了,准确率很高!