PocketSphinx文档翻译: 构建可运行于安卓上的Pocketsphinx,Building Pocketsphinx On Android
( ☯:这篇教程里面不是完全正确的 ,但是非常有参考价值。部分评论也有参考价值,于是也被翻译了。 )
我知道,妳们等这个教程等了好久了,现在就为妳们献上。感谢Matthew Cooper写下了这篇文章。此教程中说明的步骤应当能够在任何的GNU/Linux 发行版上正常工作 ,例如Fedora。另外 ,此教程预期的安卓手机系统版本为2.2 及以上。较低版本的安卓系统中 ,其SD卡的路径有点不一样,明白这一点的话同样能够轻松地按照这个教程完成妳的任务 。
下载并编译pocketsphinx
从这个网址下载以下两个源代码包 http://cmusphinx.sourceforge.net/wiki/download/
sphinxbase-0.8
pocketsphinx-0.8
然后从以下仓库下载PocketSphinxDemo
PocketsphinxAndroidDemo – snapshot
将三个源代码包都解压到某个妳能够在日后找到的地方。有一点要特别注意 ,pocketsphinx和sphinxbase源代码包都要解压到同一个上级目录中,并且将解压出来的子目录重命名为“sphinxbase”和“pocketsphinx”,目录名中不要带版本号。
打开终端并执行:
sudo -i
然后输入妳的密码。这样妳就获得root权限了。
妳稍后将用到swig,所以现在就安装它吧。妳需要安装swig 1.3,目前我们还不支持新版本的swig,例如2.0 :
apt-get install swig
或者
yum install swig
现在,在命令行切换(cd)到sphinxbase 目录中,运行以下命令 :
./configure
make
make install
切换到pocketsphinx 目录中,执行:
./configure
make
make install
现在切换到PocketSphinxDemo/jni目录中
打开jni 目录中的Android.mk文件,然后修改SPHINX_PATH(第5行)的值,指向包含有pocketsphinx 和sphinxbase 的上级目录 。
在命令行中执行以下命令:
妳的ndk目录的路径 /ndk-build -B
当然,这里要把 妳的ndk目录的路径 替换成妳电脑上ndk目录的实际路径
Eclipse
现在打开Eclipse,导入PocketSphinxDemo这个项目。
手机
将妳的安卓手机用USB连接,然后在此目录下创建 edu.cmu.pocketsphinx子目录
/mnt/sdcard
妳可以在终端里完成这个操作:
adb shell
在上一步获取到的外壳(shell)中:
mkdir /mnt/sdcard/edu.cmu.pocketsphinx
现在切换进入手机上的edu.cmu.pocketsphinx 目录,并且创建以下的目录结构(☯:注意参考一下 pocketsphinx源代码里的目录关系):
edu.cmu.pocketsphinx
|
----> hmm
| |
| ----> en_US
| |
| ----> hub4wsj_sc_8k
|
----> lm
|
-----> en_US
现在执行quit 以退出adb 外壳。
此时仍然在终端中操作,将电脑上的文件推送到手机上去。
切换到pocketsphinx/model/hmm/en_US/目录然后执行:
adb push ./hub4wsj_sc_8k /mnt/sdcard/edu.cmu.pocketsphinx/hmm/en_US/hub4wsj_sc_8k
切换到pocketsphinx/model/lm/目录然后执行:
adb push ./en_US /mnt/sdcard/edu.cmu.pocketsphinx/lm/en_US
现在打开以下目录中的RecognizerTask.java文件
/src/edu/cmu/pocketsphinx/demo
代码里声明的某些路径在2.2 版本的手机上无效。我们需要修改这些路径,使得它们正常工作。看看下面这段代码。
pocketsphinx.setLogfile("/mnt/sdcard/edu.cmu.pocketsphinx/pocketsphinx.log");
Config c = new Config();
/*
* 在2.2及更高版本的系统中,我们可以使用getExternalFilesDir()或类似的函数
*/
c.setString("-hmm", "/mnt/sdcard/edu.cmu.pocketsphinx/hmm/en_US/hub4wsj_sc_8k");
c.setString("-dict", "/mnt/sdcard/edu.cmu.pocketsphinx/lm/en_US/hub4.5000.dic");
c.setString("-lm", "/mnt/sdcard/edu.cmu.pocketsphinx/lm/en_US/hub4.5000.DMP");
c.setString("-rawlogdir", "/mnt/sdcard/edu.cmu.pocketsphinx"); //只用来储存录音文件
如果妳采用的是不同的模型,则妳需要使用不同的路径,例如对于满语(mandarin)模型就要这样
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");
好了,构建并运行这个项目吧。
评论
-
啊,感谢这篇教程,它写得狠好,狠简单。当然,它需要读者对于安卓开发有基本的了解!
我遇到了一些问题,希望妳能帮助我!
我使用的是:
MacOS 10.6.7 (预装的SWIG版本是1.3.31)
NDK: android-ndk-r5b 2011年1月版
SDK 2.2 API8, 设备模拟器-5554之前一直狠顺利,直到我要使用 NDK 来编译原生代码时出现问题。
—
在命令行执行:
妳的ndk目录的路径/ndk-build -B
当然,将妳的ndk目录的路径 替换成妳的ndk 目录的真实路径
—–在做这一步时,我遇到了错误,它还特别长,所以我只复制开头和结尾的部分:
——MyMac:PocketSphinxDemo root# /Users/MyMac/Documents/android-ndk-r5b/ndk-build -B
Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Compile thumb : pocketsphinx_jni <= pocketsphinx_wrap.c
/Users/MyMac/Documents/androidSphinx/PocketSphinxDemo/jni/pocketsphinx_wrap.c: In function 'Java_edu_cmu_pocketsphinx_pocketsphinxJNI_Decoder_1processRaw_1_1SWIG_10':
/Users/MyMac/Documents/androidSphinx/PocketSphinxDemo/jni/pocketsphinx_wrap.c:1431: warning: assignment discards qualifiers from pointer target type
Compile arm : sphinxutil <= logmath.c
Compile thumb : sphinxutil <= bio.c
Compile thumb : sphinxutil <= bitvec.c
Compile thumb : sphinxutil <= case.c
Compile thumb : sphinxutil <= ckd_alloc.c
Compile thumb : sphinxutil <= cmd_ln.c
Compile thumb : sphinxutil <= ……
….
….
….
/Users/MyMac/Documents/androidSphinx//pocketsphinx/src/libpocketsphinx/ms_gauden.c:251: undefined reference to `bio_fread'
/Users/MyMac/Documents/androidSphinx/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ms_gauden.o):/Users/benamel/Documents/androidSphinx//pocketsphinx/src/libpocketsphinx/ms_gauden.c:279: more undefined references to `bio_fread' follow
/Users/MyMac/Documents/androidSphinx/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ms_gauden.o): In function `gauden_param_read':
/Users/MyMac/Documents/androidSphinx//pocketsphinx/src/libpocketsphinx/ms_gauden.c:283: undefined reference to `bio_verify_chksum'
/Users/MyMac/Documents/androidSphinx/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ms_gauden.o): In function `gauden_dist_precompute':
/Users/MyMac/Documents/androidSphinx//pocketsphinx/src/libpocketsphinx/ms_gauden.c:344: undefined reference to `logmath_log'
/Users/MyMac/Documents/androidSphinx//pocketsphinx/src/libpocketsphinx/ms_gauden.c:347: undefined reference to `logmath_ln_to_log'
collect2: ld returned 1 exit status
make: *** [/Users/MyMac/Documents/androidSphinx/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx_jni.so] Error 1——-
我试过在“PocketSphinxDemo/jni/”和“PocketSphinxDemo/”目录(按照http://developer.android.com/sdk/ndk/index.html的说明是可以这样做的)中都执行了"/ndk-build -B”命令。我记得上面那一堆错误信息是在第二个目录中执行时产生的,但是两个目录中产生的错误信息实际上是非常相似的。
这些信息足够找到原因了吗?
—————-
—————-在教程的后面部分,我成功地将项目导入了Eclipse,构建了它,并且在模拟器中运行。程序启动动了,但是,当我点击“Record”的时候,程序崩溃了。**我修改了“RecognizerTask.java”中的那些路径,直接访问了我的电脑上解压后的“/pocketsphinx/”目录中的“.dic、.DMP等等”文件,而不是将它们复制/推送到SD卡中去。
—————-
—————-
对于教程中所说的在SD卡上创建目录结构的部分,我认为,它们应当是与解压后的“/pocketsphinx/”目录中的结构类似,所以应当是以下这样的一个结构对吧?SDCard—>edu.cmu.pocketsphinx—-> hmm—-> en_US—-> hub4wsj_sc_8k
SDCard—>edu.cmu.pocketsphinx—-> lm—–> en_US再次感谢
-
Benmael:
> /Users/MyMac/Documents/androidSphinx//pocketsphinx/src/libpocketsphinx/ms_gauden.c:347: undefined reference to `logmath_ln_to_log’
collect2: ld returned 1 exit status它在链接到sphinxbase的时候失败了。妳需要检查确认:正确地指定了sphinxbase 的路径;sphinxbase 库存在并且已经编译过了。
> Regarding the part of creating the folder structure in the SDCard, I think it has to be something similar to the unzipped “/pocketsphinx/” dir structure, so the diagram should be something like this maybe?
妳怎么安排这个目录结构并不重要。重要的是,妳要在源代码里指定正确的位置。
-
啊。当我先用ndk-build 来编译一个示例项目时,成功地编译了。但是,当我编译pocketsphinx_jni时就遇到了错误
我不知道原因。
请帮助SharedLibrary : libpocketsphinx_jni.so
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(pocketsphinx.o): In function `ps_reinit’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:224: undefined reference to `logmath_get_base’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:227: undefined reference to `logmath_free’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:228: undefined reference to `logmath_init’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:289: undefined reference to `ptmr_init’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(pocketsphinx.o): In function `ps_free’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:336: undefined reference to `logmath_free’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(pocketsphinx.o): In function `ps_update_lmset’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:409: undefined reference to `ngram_model_free’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(pocketsphinx.o): In function `ps_add_word’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:561: undefined reference to `ngram_model_add_word’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(pocketsphinx.o): In function `ps_start_utt’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:625: undefined reference to `ptmr_reset’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:626: undefined reference to `ptmr_start’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(pocketsphinx.o): In function `ps_end_utt’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:813: undefined reference to `ptmr_stop’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:819: undefined reference to `ptmr_stop’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:829: undefined reference to `ptmr_stop’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:832: undefined reference to `ptmr_stop’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:853: undefined reference to `logmath_exp’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(pocketsphinx.o): In function `ps_get_hyp’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:865: undefined reference to `ptmr_start’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:869: undefined reference to `ptmr_stop’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(pocketsphinx.o): In function `ps_get_hyp_final’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:878: undefined reference to `ptmr_start’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:880: undefined reference to `ptmr_stop’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(pocketsphinx.o): In function `ps_get_prob’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:890: undefined reference to `ptmr_start’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:894: undefined reference to `ptmr_stop’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(pocketsphinx.o): In function `ps_seg_iter’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:903: undefined reference to `ptmr_start’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/pocketsphinx.c:905: undefined reference to `ptmr_stop’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `ps_lattice_link’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:80: undefined reference to `__listelem_malloc__’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:81: undefined reference to `__listelem_malloc__’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:82: undefined reference to `__listelem_malloc__’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `delete_node’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:150: undefined reference to `__listelem_free__’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:155: undefined reference to `__listelem_free__’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:157: undefined reference to `__listelem_free__’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `remove_dangling_links’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:174: undefined reference to `__listelem_free__’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:175: undefined reference to `__listelem_free__’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o):/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:188: more undefined references to `__listelem_free__’ follow
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `ps_lattice_write’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:250: undefined reference to `logmath_get_base’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `ps_lattice_write_htk’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:361: undefined reference to `logmath_log_to_ln’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:361: undefined reference to `logmath_exp’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `dag_param_read’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:378: undefined reference to `lineiter_next’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `ps_lattice_read’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:429: undefined reference to `logmath_retain’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:434: undefined reference to `logmath_init’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:438: undefined reference to `listelem_alloc_init’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:439: undefined reference to `listelem_alloc_init’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:440: undefined reference to `listelem_alloc_init’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:447: undefined reference to `fopen_compchk’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:451: undefined reference to `lineiter_start’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:462: undefined reference to `lineiter_next’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:473: undefined reference to `logmath_init’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:475: undefined reference to `logmath_get_base’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:503: undefined reference to `lineiter_next’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:537: undefined reference to `__listelem_malloc__’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:578: undefined reference to `lineiter_next’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:586: undefined reference to `lineiter_next’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:596: undefined reference to `lineiter_next’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:614: undefined reference to `lineiter_free’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:615: undefined reference to `fclose_comp’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:637: undefined reference to `logmath_log’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:638: undefined reference to `logmath_log’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:640: undefined reference to `logmath_log’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:649: undefined reference to `lineiter_free’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:650: undefined reference to `fclose_comp’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `ps_lattice_init_search’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:669: undefined reference to `logmath_retain’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:673: undefined reference to `listelem_alloc_init’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:674: undefined reference to `listelem_alloc_init’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:675: undefined reference to `listelem_alloc_init’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `ps_lattice_free’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:694: undefined reference to `logmath_free’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:695: undefined reference to `listelem_alloc_free’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:696: undefined reference to `listelem_alloc_free’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:697: undefined reference to `listelem_alloc_free’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `ps_latnode_prob’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:758: undefined reference to `logmath_get_zero’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `ps_lattice_compute_lscr’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:925: undefined reference to `ngram_bg_score’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:936: undefined reference to `ngram_tg_score’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:943: undefined reference to `ngram_tg_score’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:948: undefined reference to `ngram_bg_score’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `ps_lattice_link2itor’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:980: undefined reference to `logmath_add’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `latlink_list_new’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:1068: undefined reference to `__listelem_malloc__’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `ps_lattice_popq’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:1097: undefined reference to `__listelem_free__’
/home/nguyenhuutinh/Downloads/PocketSphinxDemo/obj/local/armeabi/libpocketsphinx.a(ps_lattice.o): In function `ps_lattice_bestpath’:
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:1257: undefined reference to `logmath_get_zero’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:1271: undefined reference to `ngram_bg_score’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:1299: undefined reference to `ngram_ng_prob’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:1318: undefined reference to `logmath_add’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:1321: undefined reference to `ngram_tg_score’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:1343: undefined reference to `logmath_get_zero’
/home/nguyenhuutinh/Downloads/sphinx/pocketsphinx/src/libpocketsphinx/ps_lattice.c:1350: undefined reference to `ngram_ng_prob’ -
遇到未定义的引用(undefined reference)错误时,可以尝试这样解决:
编辑Android.mk文件。修改第162 行:LOCAL_STATIC_LIBRARIES := sphinxutil sphinxfe sphinxfeat sphinxlm pocketsphinx
改成:LOCAL_STATIC_LIBRARIES := pocketsphinx sphinxlm sphinxfeat sphinxfe sphinxutil -
我解决了自己之前遇到的问题了。它与JNI毫无关系。
我误解了教程中所画的那个目录树的结构了:这样写也许会更好:
cd /mnt/sdcard
mkdir edu.cmu.pocketsphinx
cd edu.cmu.pocketsphinx
mkdir hmm
mkdir hmm/en_US
mkdir hmm/en_US/hub4wsj_sc_8k
mkdir lm
mkdir lm/en_US@ Stewart Boling
妳好像遇到了类似的问题,因为妳的logcat 记录跟我的完全一样。
检查一下/mnt/sdcard/edu.cmu.pocketsphinx/pocketsphinx.log中的错误记录。晚安!
-
最近几天都在调试这个问题。
我看到的现象是,程序启动了,但是马上就退出了。eclipse中最后一条调试信息是“JNI_onLoad”
让我们把话说远点。通用来讲,NDK的错误处理非常差,所以要想弄清楚是哪里的问题会是狠难的,它会直接崩溃掉(然后就没戏了)。由于pocketsphinx不大可能在这个层面上出问题,所以,应当是别的什么原因。
问题在于这段话:
“代码里声明的某些路径在2.2 版本的手机上无效。我们需要修改这些路径,使得它们正常工作。看看下面这段代码。
pocketsphinx.setLogfile(”/mnt/sdcard/edu.cmu.pocketsphinx/pocketsphinx.log”);
Config c = new Config();
/*
* 在2.2及更高版本的系统中,我们可以使用getExternalFilesDir()或类似的函数
*/
c.setString(”-hmm”, “/mnt/sdcard/edu.cmu.pocketsphinx/hmm/en_US/hub4wsj_sc_8k”);
c.setString(”-dict”, “/mnt/sdcard/edu.cmu.pocketsphinx/lm/en_US/hub4.5000.dic”);
c.setString(”-lm”, “/mnt/sdcard/edu.cmu.pocketsphinx/lm/en_US/hub4.5000.DMP”);
c.setString(”-rawlogdir”, “/mnt/sdcard/edu.cmu.pocketsphinx”); // Only use it to store the audio”
应该改成,对于2.2及以上版本的系统,将以下代码中的路径改成……
理想情况下,这个示例程序应当重写,将这些文件直接从资源(res)目录里提取出来,这样就不需要手动将它们推送到手机上了。这将会一帮不熟悉安卓的人带来狠大的方便。
