多余的话不说了,为啥要用“离线”而不用“在线”其实很简单一句话:领导说的…………你可以当他吃错药了……
先声明,“离线语音识别”识别率低下,并且语句固定,提前写死的,因为各种原因需要用一下的就继续看吧……
一、如何实现“离线语音识别”:
当然你可以学习一些“机器学习”、“模式识别”的东西,然后学一些高深的算法,但是有时候公司一个小应用,非要加上一个“语音识别”,你怎么办,你有那么多时间人力精力去研究一个语音识别吗…………所以本文旨在抛砖引玉,谈一下简单的语音识别。
1、Google 离线语音识别包:
据说 Android 4.1 以后,语音识别功能能在手机上下载离线语言包,博主下了发现中文只有 15M+,且识别效果有待商榷,有兴趣的可以单说,这次主要研究标题那货……
2、PocketSphinx:
具体原理太深奥的博主也不懂,姑且谈一下,当初刚刚学习 Android 编程的时候,肯定看见过一种叫“Android NDK”的东西吧,最后咱用的是“Android JDK”。“NDK”你可以理解成:通过 Java 代码调用 C/C++ 的函数,把 Java 与 C 打包成 apk,实现 C/C++ 下的功能。
PocketSphinx 来自于 CMUSphinx,后者源码是 C 的,因此需要 NDK 将 C 程序封装成 Java 链接库 .o 文件,然后在程序中调用。怎么弄?一步一步来…………
二、前期准备:
1、下载 Android NDK:这个就去百度上查吧,目测第一个就是,博主是 android-ndk-r8e-windows-x86_64,你的也许是 32 位机器,那就去下 32 的;
2、下载 Cygwin:http://cygwin.com/install.html,在其中选一个下载;
3、下载 Sphinxbase 0.7:http://ucla.jamesyxu.com/custom_uploads/sphinxbase-0.7.tar.gz
4、下载 PocketSphinx 0.7:http://ucla.jamesyxu.com/custom_uploads/pocketsphinx-0.7.tar.gz
5、下载 PocketSphinxAndroidDemo:http://ucla.jamesyxu.com/custom_uploads/PocketSphinxAndroidDemo.zip
三、安装配置:
目前先把 Eclipse 抛开,别急,以后会合体~~
(1)、安装配置 Cygwin:
Cygwin 相当于 Windows 下的 Linux 环境,因为使用 NDK、PocketSphinx 需要编译源码之类的 Linux 操作,所以需要这么一个东西。另外,这个下载的 setup.exe 相当于一个下载器,以后需要什么东西都要重复下面的步骤……
1、双击 Setup 图标,选第一项:

2、选择安装路径,尽量选中文并且路径不要空格:

3、Next 就行:

4、选择连接网络的方式,这里选直连:

5、选择从哪个网站下载,博主选的那个高亮的,速度还行:

6、进入主下载界面:

7、按照下图的操作,依次下载文件:

注 1:点击此处可以选版本
注 2:1 点击完后,此处自动勾选
注 3:此处是要下载的文件的名称(上图是示例,具体需要下载的文件是下边的)
注:需要下载的文件:autoconf2.1、automake1.10、binutils、gcc-core、gcc-g++、gdb、pcre、pcre-devel、gawk、make、libtool、swig(选择 1.3.40-1,不是 2.0.9-1,不然后期编译不能通过!)
注:如果后期编译出错,看错误,少什么文件再来下载
注:不要同时下载太多,断线只能重下……
7、打开 Cygwin,在命令行下输入 gcc --version,g++ --version,make --version,gdb --version,依次显示信息,则安装正确;
8、修改 cygwin/etc/passwd 文件中的 500:513 为 0:0,获得 root 权限;
(2)、配置 Android NDK:
1、无需特别配置,解压即可,但是需要在 Cygwin 中配置一下:
打开 cygwin/etc/profile,修改如下地方:cygdrive 后边是盘符,然后就是路径了,注意最后的冒号

2、打开 Cygwin,输入 ndk-build,出现如下信息,代表配置正常:

3、测试 NDK 是否正常工作:
①、我们选择 NDK 自带的例子 hello-jni,假设位于 E:\android-ndk-r5\samples\hello-jni(根据你具体的安装位置而定);
②、运行 Cygwin,输入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni,进入到 E:\android-ndk-r5\samples\hello-jni 目录;
③、输入 ndk-build,执行成功后,它会自动生成一个 libs 目录,把编译生成的 .so 文件放在里面。(ndk-build 是调用 NDK 的编译程序);
④、此时去 hello-jni 的 libs 目录下看有没有生成的 .so 文件,如果有,那么 NDK 配置成功。
(3)、编译 PocketSphinx,配置一下 PocketSphinxAndroidDemo 的某些参数:
之前我们下载了:Sphinxbase 0.7、PocketSphinx 0.7、PocketSphinxAndroidDemo
1、三个文件解压,放在一个文件夹内,这里文件夹起名叫 sphinx(你随意)
2、把那两个带 0.7 的文件夹重命名成 sphinxbase、pocketsphinx,理论上会变成下图:

3、打开 Cygwin,依次编译 sphinxbase、pocketsphinx:(以 sphinxbase 为例,pocketsphinx 同理)





注:此时可能会提示错误,说明文件没装全,回 Cygwin 的 setup.exe 去下载
4、同样在 Cygwin 下,进入 pocketsphinx/swig 文件夹,make:

注:这里会出错,提示 jni.h 或者 jni_md.h 不存在,没事,这时候生成了几个文件,我们需要的是那几个文件……


5、把这个 edu 文件夹,复制到 PocketSphinxAndroidDemo 中的 jni 文件夹下
6、用记事本打开 PocketSphinxAndroidDemo/jni/Android.mk 文件,改成下图:(三个文件夹的父文件夹)

7、同样在 Android.mk 文件中,搜索 LOCAL_STATIC_LIBRARIES,把后边的单词顺序改为 pocketsphinx sphinxlm sphinxfeat sphinxfe sphinxutil

8、打开 Cygwin,进入 PocketSphinxAndroidDemo 的 jni 文件夹,执行 ndk-build,没错的话 OK !!
(4)、配置 Eclipse:
1、导入 PocketSphinxAndroidDemo 工程文件,导入过程提示错误,无视即可
2、右键工程,打开属性,构建器(英文版的大概是 builder),右侧会发现 SWIG 和 NDK
①、SWIG:



②、NDK:



注:NDK 不按上面的配的话,构建时会出错,反正我是出错,你不信可以试试……
(5)、程序运行,真机调试:
1、拷贝“声学模型”和“语音字典”到手机上:
①、把 pocketsphinx/model/hmm/en_US 里的 hub4wsj_sc_8k,hmm/en_US,lm/en_US 放入手机的某个文件夹

由于我的手机 root 过了,装了文件夹管理器,可能方便一些……以后会尝试在程序中指定,现在先把 Demo 跑起来为最优先。
②、在 PocketSphinxAndroidDemo 项目中使 RecognizerTask.java 里 c.setString 函数中的参数符合上述路径

注:上述截图不完全,把程序里的那一坨都改了吧~~
2、运行程序,如果程序闪退,说明 NDK 可能配置不成功,否则出现如下界面:
