- text2wfreq < weather.txt | wfreq2vocab > weather.tmp.vocab
最近研究Android上的语音识别,在此记录下遇到的问题。
先引用一篇博文,http://leiwuluan.iteye.com/blog/1287305。根据这篇博文的内容,要是没遇到问题的话,应该可以生成一个apk,在手机上可以运行,能进行识别,但是效率很低,识别率也不咋地。现在我们需要自己来构建识别的库。
根据代码
- c.setString("-dict",
- "/sdcard/Android/data/edu/edu.cmu.pocketsphinx/lm/zh_CN/mandarin_notone.dic");
- c.setString("-lm",
- "/sdcard/Android/data/edu/edu.cmu.pocketsphinx/lm/zh_CN/gigatdt.5000.DMP");
程序会引用到两个文件,第一个是字典文件,第二个是声音模型文件,程序先将输入的声音和声音模型文件对比,生成音节编码,再将音节编码在字典中查找,返回最后的字符结果。Sphinx是个很完善的引擎,除了开源之外,官方还提供了各种工具供开发者构建自己的声音对比模型,字典,记忆语言模型。本文参考http://cmusphinx.sourceforge.net/wiki/tutoriallm,用CMUCLMTK构建自己的语言模型。
1.首先,假设你已经根据本文开头的那篇博文成功编译了PocketSphinx并且成功在手机上运行。
2.下载CMUCLMTK,http://sourceforge.net/projects/cmusphinx/files/cmuclmtk/0.7/cmuclmtk-0.7.tar.gz/download
3.将下载的文件解压到Sphinx根目录,参见开篇引用博文。
4.命令行下进入到CMUCLMTK目录,我的为
- /workspace/VoiceRecognition/cmuclmtk-0.7#
我的电脑系统是linux,如果是windows需要用cgwin
5. ./configure
6.make install
7.cd src
8.make install
9.在4的目录下,新建weather.txt,输入
- <s> generally cloudy today with scattered outbreaks of rain and drizzle persistent and heavy at times </s>
- <s> some dry intervals also with hazy sunshine especially in eastern parts in the morning </s>
- <s> highest temperatures nine to thirteen Celsius in a light or moderate mainly east south east breeze </s>
- <s> cloudy damp and misty today with spells of rain and drizzle in most places much of this rain will be
- light and patchy but heavier rain may develop in the west later </s>
10.命令行下输入,
- text2wfreq < weather.txt | wfreq2vocab > weather.tmp.vocab
这时报错,如下
- text2wfreq: error while loading shared libraries: libcmuclmtk.so.0: cannot open shared object file: No such file or directory
参考error while loading shared libraries解决。
11.输入
- text2idngram -vocab weather.tmp.vocab -idngram weather.idngram < weather.txt
12.输入
- idngram2lm -vocab_type 0 -idngram weather.idngram -vocab weather.tmp.vocab -arpa weather.arpa
如果无误,在目录下会生成weather.tmp.DMP文件。
官网说在http://www.speech.cs.cmu.edu/tools/lmtool.html也可以在线提交txt文件,在服务器生成DMP文件,但是我在试的时候,发现访问不了,可能是太多人用了,CMU把这个服务给关了?
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>
<s>搜索</s>
<s>播放</s>
保存为command.txt
在http://www.speech.cs.cmu.edu/tools/lmtool.html上点Browse,提交command.txt,在线生成语言模型文件。
3.在网站上会生成一个.tar.gz文件,下载后解压,其中有一个dic和lm文件,拷出来
4.替换语言模型文件。在1中的demo里面,要将指定声音文件和语言模型文件,在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");
将3中生成的lm和dic文件分别放到sd卡的上述目录
将 http://downloads.sourceforge.net/project/cmusphinx/pocketsphinx/0.7 /pocketsphinx-0.7.tar.gz?r=http%3A%2F %2Fsourceforge.net%2Fprojects%2Fcmusphinx%2F&ts=1332729739& use_mirror=nchc下载的pocketsphinx下面的model/hmm/zh/tdt_sc_8k 下的文件放到/sdcard/Android/data/test/hmm目录下
附件中的data是我使用的文件,可以直接解压后放到sd卡的以上目录,注意,tdt_sc_8k是一个文件夹不是文件
5.文件准备完毕,重新跑1中的demo。语音输入2中的命令,识别率99%以上,但是输入命令集以外的无法识别。
6.附件为工程文件,将data解压,按照工程中4里面写的位置放到sd卡里面即可