折腾了一天终于把这个Demo跑起来,虽然我还是不太明白,还是想把它记录下来,免得很快又忘记了。有一篇博客很详细地介绍这个:
一、搭建NDK编译环境和安装cygwin
搭建NDK编译环境和安装cygwin:,cygwin的下载和安装过程会比较久,耐心等待。安装后,例如
cygwin目录为:D:\Program Files\cygwin
android-ndk-r9解压后的目录:E:\software\android-ndk-r9
在cygwin的安装目录中修改 home\<你的用户名>\.bash_profile 文件中最后添加环境变量,我这里的配置是
NDK=/cygdrive/e/software/android-ndk-r9,
打开Cygwin就可以输入:
cd $NDK
能够进入工作目录表示OK。
二、编译语音识别文件
(1)Sphinxbase和pocketsphinx的下载链接: (下载.tar.gz版本,不要下win32的)
pocketsphinx 0.8 : http://sourceforge.net/projects/cmusphinx/files/pocketsphinx/0.8/
Sphinxbase 0.8: http://sourceforge.net/projects/cmusphinx/files/sphinxbase/0.8/
(2)demo的下载地址:
PocketSphinxAndroidDemo : http://sourceforge.net/p/cmusphinx/code/HEAD/tree/
已经上传到csdn了,找不到的到这里下:
将前2个文件放到相应目录去,例如 E:\Sphinx 解压后 去掉0.8版本号 ,得到pocketsphinx和sphinxbase文件夹,demo也放进里面,如下:
(3)安装swig(You need swig 1.3, for now we do not support newer swig like 2.0,老外说这个不支持2.0以上的版本,下载swig-1.3.40)
swig-1.3.40:http://sourceforge.net/projects/swig/files/swig/swig-1.3.40/ 解压到相应目录,例如我放在:E:\software\Tools\swigwin-1.3.40
设置电脑上的环境变量,右键我的电脑-属性-高级系统设置-环境变量,在PATH中添加swig的存放目录。打开cgywin安装swig,cd进去存放目录
cd /cygdrive/e/software/Tools/swigwin-1.3.40
然后依次执行
sh autogen.sh
./configure
make
make install
输入swig -version能查看相应版本表示已安装成功
(4)编译,打开cygwin进入到该目录,下面的make install指令好像需要root权限,(切换到root权限的办法是:修改cygwin/etc/passwd文件中的 500:513 为 0:0 ,出自这位博主:root),打开之前可以先修改这个。 下面就是编译的工作了,cd进去两个文件夹分别执行(老外说windows下sphinxbase不用编译,我都编译了一下,好像没关系)
sh autogen.sh
./configure
make
make install
编译完这两个后,查看pocketsphinx\swig文件夹里面应该只有三个文件,还需要编译出来一个edu的文件夹,进入swig目录
cd /cygdrive/e/Sphinx/pocketsphinx/swig
执行make, 然后报错,说找不到包,大神说这样解决: http://cgwxyz.blog.163.com/blog/static/262806020105307929424/ 。进去pocketsphinx文件夹和sphinxbase文件夹分别将里面的*.pc文件拷贝进cygwin安装目录pkgconfig文件夹里面,如 D:\Program Files\cygwin\lib\pkgconfig。 回来继续make
还是报错,不清楚是什么原因,不过edu文件夹已经生成了,把这个文件夹拷贝到Demo程序的jni文件夹下,用linux执行也可以
cp -r ./pocketsphinx/swig/edu ./PocketSphinxAndroidDemo/jni/
(5)执行ndk-build
用ndk编译前要设置Android.mk的路径,在PocketSphinxAndroidDemo/jni/找到Android.mk,记事本修改里面内容
第 5 行改为sphinxbase和pocketsphinx所在的目录,如(去掉$HOME,路径前加上/cygdrive/)
SPHINX_PATH := /cygdrive/e/Sphinx
第162行将(之前一直编译出错,好像就是因为这个,在stack overflow上说这样解决的)
LOCAL_STATIC_LIBRARIES := sphinxutil sphinxfe sphinxfeat sphinxlm pocketsphinx
改为:
LOCAL_STATIC_LIBRARIES := pocketsphinx sphinxlm sphinxfeat sphinxfe sphinxutil
保存后,在cygwin中进入到PocketSphinxAndroidDemo/jni/目录
cd /cygdrive/e/Sphinx/PocketSphinxAndroidDemo/jni
使用NDK build,
$NDK/ndk-build -B
终于 生成了.so文件( libs/armeabi/libpocketsphinx_jni.so)
三、导入Demo到Eclipse中
打开Eclipse-ImortProjects,导入PocketSphinxAndroidDemo,会报错没关系
右键工程-Properties-Builders,点击NDK Build Edit编辑,Main标签
Location修改为cygwin的bash.exe所在目录,Working Directory修改为cygwin的bin文件夹,Arguments修改为
--login -c "cd /cygdrive/f/MyCode/Android/voice/PocketSphinxDemo && $NDK/ndk-build"
/cygdrive/f/MyCode/Android/voice/PocketSphinxDemo为当前工程所在的文件夹,注意修改)
Refresh标签选择“The project containing the selected resource”,Build Options标签去掉“Specify working set of relevant resources”
SWIG的Edit也类似,Main标签不用修改,
Refresh标签选择“The folder containing the selected resource”,Build Options标签去掉“Specifiy working set of relevant resources”
到此为止,如果工程没报错,PC端的设置已经完成
四、往手机SDcard添加文件
在手机的/sdcard/Android/data/下添加文件夹edu.cmu.pocketsphinx,在RecognizerTask.java文件里面说的很清楚,需要使用到这个目录下的文件
public RecognizerTask() {
pocketsphinx
.setLogfile("/sdcard/Android/data/edu.cmu.pocketsphinx/pocketsphinx.log");
Config c = new Config();
/*
* In 2.2 and above we can use getExternalFilesDir() or whatever it's
* called
*/
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/en_US/hub4.5000.dic");
c.setString("-lm",
"/sdcard/Android/data/edu.cmu.pocketsphinx/lm/en_US/hub4.5000.DMP");
/*
c.setString("-hmm",
"/sdcard/Android/data/edu.cmu.pocketsphinx/hmm/zh/tdt_sc_8k");
c.setString("-dict",
"/sdcard/Android/data/edu.cmu.pocketsphinx/lm/zh_TW/mandarin_notone.dic");
c.setString("-lm",
"/sdcard/Android/data/edu.cmu.pocketsphinx/lm/zh_TW/gigatdt.5000.DMP");
*/
.....
.....
}
对应程序在edu.cmu.pocketsphinx目录下创建两个文件夹lm和hmm,将pocketsphinx/model/hmm下的en_US文件夹放进hmm,pocketsphinx/model/lm下的en_US文件夹放进lm。
然后就可以运行程序到手机中了,不对词典和模型文件进行修改,识别率还是比较低的。