折腾了一天终于把这个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。

Android免费离线语音合成 android离线语音识别_Android免费离线语音合成

二、编译语音识别文件

(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也放进里面,如下:

Android免费离线语音合成 android离线语音识别_语音识别_02

       

(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能查看相应版本表示已安装成功

Android免费离线语音合成 android离线语音识别_Android免费离线语音合成_03

(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

Android免费离线语音合成 android离线语音识别_windows_04

还是报错,不清楚是什么原因,不过edu文件夹已经生成了,把这个文件夹拷贝到Demo程序的jni文件夹下,用linux执行也可以

cp -r ./pocketsphinx/swig/edu ./PocketSphinxAndroidDemo/jni/

Android免费离线语音合成 android离线语音识别_windows_05

(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

Android免费离线语音合成 android离线语音识别_语音识别_06

终于 生成了.so文件( libs/armeabi/libpocketsphinx_jni.so)

三、导入Demo到Eclipse中

打开Eclipse-ImortProjects,导入PocketSphinxAndroidDemo,会报错没关系

Android免费离线语音合成 android离线语音识别_语音识别_07

右键工程-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为当前工程所在的文件夹,注意修改)

Android免费离线语音合成 android离线语音识别_android_08

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。

然后就可以运行程序到手机中了,不对词典和模型文件进行修改,识别率还是比较低的。

Android免费离线语音合成 android离线语音识别_windows_09