关于Windows 环境下,Android 平台使用PocketSphinx做离线语音识别

        折腾了一天终于把这个Demo跑起来,虽然我还是不太明白,还是想把它记录下来,免得很快又忘记了。有一篇博客很详细地介绍这个:http://blog.csdn.net/zouxy09/article/details/7978108 

一、搭建NDK编译环境和安装cygwin


        搭建NDK编译环境和安装cygwin:http://blog.csdn.net/pengchua/article/details/7582949cygwin的下载和安装过程会比较久,耐心等待。安装后,例如

        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的)


(2)demo的下载地址:

PocketSphinxAndroidDemo    http://sourceforge.net/p/cmusphinx/code/HEAD/tree/

已经上传到csdn了,找不到的到这里下: http://download.csdn.net/detail/aaaeee2011/6425963

将前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.40http://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。
然后就可以运行程序到手机中了,不对词典和模型文件进行修改,识别率还是比较低的。


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
可以实现录音,有效率超过百分之九十九 package edu.cmu.pocketsphinx.demo; import java.util.Date; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class PocketSphinxIntent extends Activity implements OnTouchListener, RecognitionListener { static { System.loadLibrary("pocketsphinx_jni"); } public static final String EXTRA_RESULTS = "PockectSphinxExtraResults"; /** * Recognizer task, which runs in a worker thread. */ RecognizerTask rec; /** * Thread in which the recognizer task runs. */ Thread rec_thread; /** * Time at which current recognition started. */ Date start_date; /** * Number of seconds of speech. */ float speech_dur; /** * Are we listening? */ boolean listening; /** * Progress dialog for final recognition. */ ProgressDialog rec_dialog; /** * Performance counter view. */ TextView performance_text; /** * Editable text view. */ EditText edit_text; Intent intent; /** * Respond to touch events on the Speak button. * * This allows the Speak button to function as a "push and hold" button, by * triggering the start of recognition when it is first pushed, and the end * of recognition when it is released. * * @param v * View on which this event is called * @param event * Event that was triggered. */ public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: start_date = new Date(); this.listening = true; this.rec.start(); break; case MotionEvent.ACTION_UP: Date end_date = new Date();
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值