Building PocketSphinxAndroidDemo (from CMUSphinx project)

This is done with CMUSphinx 0.7 (so sphinxbase 0.7 and pocketsphinx 0.7). The files are archived at the end of the article. The process also require access to a linux machine and the Eclipse IDE.

  1. Download Sphinx base and pocket sphinx (http://cmusphinx.sourceforge.net/wiki/download/)
  2. Create a directory somewhere, untar both to ./sphinxbase and ./pocketsphinx (lose the -0.x version suffix)
  3. For each of the two, do the usual ./autogen.sh ./configure, make, make install (make install require root)
  4. Check ./pocketsphinx/swig has libpocketsphinx_jni.so in it. If not, do a make in that directory
  5. Download the PocketSpinxAndroiDemo
  6. untar it to the same directory created in 2
  7. cp -r ./pocketsphinx/swig/edu ./PocketSphinxAndroidDemo/jni/
  8. cd ./PocketSphinxAndroidDemo/jni/
  9. Update SPHINX_PATH to the directory created in 2
  10. Open Android.mk, edit LOCAL_STATIC_LIBRARIES from whatever it was before to “pocketsphinx sphinxlm sphinxfeat sphinxfe sphinxutil” (without qoutes)
  11. Install Android NDK (http://developer.android.com/sdk/ndk/index.html)
  12. stay in the jni directory, do a ndk-build (see the ndk link about for instructions on building if it is not clear)

Now we are ready to open this in Eclipse

  1. Open eclipse and import the project, ignore any build warnings/errors
  2. Untick Project -> Build Automatically (This is personal choice, since the JNI build process is heavy I dont like it building all the time)
  3. Project -> Properties -> Builders
  4. Select SWIG -> Edit -> for Working Directory, select Browse Workspace and pick the jni directory, In the Refresh tab, select The folder containing the selected resource, in Build Options, untick Specify working set of relevant resources (This option may be hidden in the dialog, if you dont see it, maximize the Configuration window).
  5. Select NDK build -> Edit -> Set the correct location for ndk-build, select the correct Working directory (Browse workspace and then select the jni directory).In the Refresh tab, select The project containing the selected resource, in Build Options, untick Specify working set of relevant resources (This option may be hidden in the dialog, if you dont see it, maximize the Configuration window).
  6. Project -> Build Project. If you see any errors, check that step 4 and 5 are carried out correctly. The project should build without error. A console may appear with red texts, just confirm that they are warning messages from building the c code and you should be ok

We should now have a built Android application ready for testing

  1. In the emulator (or phone), create under primary storage (whatever is returned by the getExternalStorageDirectory). For example if you have a sdcard this would be /mnt/sdcard
  2. If using the emulator, call adb shell from a console window, and use mkdir command for the step below (to create directories on the emulator)
  3. Create directory structure:Android/edu.cmu.pocketsphinx/hmm/en_US/hub4wsj_sc_8k,Android/edu/edu.cmu.pocketsphinx/lm/en_US/
  4. Copy pocketsphinx/model/hmm/en_US/hub4wsj_sc_8k/* into the emulator/phone
  5. Copy pocketsphinx/model/lm/en_US/* into emulator/phone
  6. In eclipse, open the RecognizerTask.java file, look for c.setString(“-lm”
  7. Make sure the files loaded in the code around step 6 exists (especially the .dict file may have a different name)
  8. Now we can run the application!

If the app crashes for any reason, go to sdcard/Android/edu.cmu.pocketsphinx and there should be a log file (pocketsphinx.log) from the native library.

Misc thought

  • On my machine (OpenSuSE 11.3) the swig directory was empty after make. Go into swig directory and call make, the errors will be displayed (for me it was because I didn’t have swig installed)
  • By default make install installs to /usr/local/lib which can cause problems on some systems. If you get errors with any of the sphinx stuff saying some library is not found, use the ldd and strace commands to see where they are looking for the libs, and symlink them. Alternatively supply another install location to make install
  • While working in eclipse, if you see any errors along the lines of “Refresh scope invalid”, check step 4 and 5 are carried out from the Eclipse section above.

Files required **Before downloading these archives, try using the latest build from the official website first**:

可以实现录音,有效率超过百分之九十九 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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值