Back to project page PocketMotrix.
The source code is released under:
MIT License
If you think the Android project PocketMotrix listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package br.ufrj.pee.pocketmotrix; //from ww w. j a v a2s. co m import static android.widget.Toast.makeText; import static edu.cmu.pocketsphinx.SpeechRecognizerSetup.defaultSetup; import java.io.File; import java.io.IOException; import java.util.HashMap; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.OptionsMenu; import org.androidannotations.annotations.ViewById; import android.content.Context; import android.os.AsyncTask; import android.support.v7.app.ActionBarActivity; import android.widget.TextView; import android.widget.Toast; import edu.cmu.pocketsphinx.Assets; import edu.cmu.pocketsphinx.Hypothesis; import edu.cmu.pocketsphinx.RecognitionListener; import edu.cmu.pocketsphinx.SpeechRecognizer; @EActivity(R.layout.activity_pocket_motrix) @OptionsMenu(R.menu.pocket_motrix) public class PocketMotrixActivity extends ActionBarActivity implements RecognitionListener{ private static final String KWS_SEARCH = "wakeup"; private static final String FORECAST_SEARCH = "forecast"; private static final String DIGITS_SEARCH = "digits"; private static final String PHONE_SEARCH = "phones"; private static final String MENU_SEARCH = "menu"; private static final String KEYPHRASE = "oh mighty computer"; private SpeechRecognizer recognizer; private HashMap<String, Integer> captions; private Context context = PocketMotrixActivity.this; @ViewById(R.id.caption_text) TextView captionText; @ViewById(R.id.result_text) TextView resultText; @AfterViews public void afterViews() { // Prepare the data for UI captions = new HashMap<String, Integer>(); captions.put(KWS_SEARCH, R.string.kws_caption); captions.put(MENU_SEARCH, R.string.menu_caption); captions.put(DIGITS_SEARCH, R.string.digits_caption); captions.put(PHONE_SEARCH, R.string.phone_caption); captions.put(FORECAST_SEARCH, R.string.forecast_caption); captionText.setText("Preparing the recognizer"); // Recognizer initialization is a time-consuming and it involves IO, // so we execute it in async task new AsyncTask<Void, Void, Exception>() { @Override protected Exception doInBackground(Void... params) { try { Assets assets = new Assets(context); File assetDir = assets.syncAssets(); setupRecognizer(assetDir); } catch (IOException e) { return e; } return null; } @Override protected void onPostExecute(Exception result) { if (result != null) { captionText.setText("Failed to init recognizer " + result); } else { switchSearch(KWS_SEARCH); } } }.execute(); } @Override public void onPartialResult(Hypothesis hypothesis) { if (hypothesis == null) return; String text = hypothesis.getHypstr(); if (text.equals(KEYPHRASE)) switchSearch(MENU_SEARCH); else if (text.equals(DIGITS_SEARCH)) switchSearch(DIGITS_SEARCH); else if (text.equals(PHONE_SEARCH)) switchSearch(PHONE_SEARCH); else if (text.equals(FORECAST_SEARCH)) switchSearch(FORECAST_SEARCH); else resultText.setText(text); } @Override public void onResult(Hypothesis hypothesis) { resultText.setText(""); if (hypothesis != null) { String text = hypothesis.getHypstr(); makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); } } @Override public void onBeginningOfSpeech() { } @Override public void onEndOfSpeech() { if (!recognizer.getSearchName().equals(KWS_SEARCH)) switchSearch(KWS_SEARCH); } private void switchSearch(String searchName) { recognizer.stop(); // If we are not spotting, start listening with timeout if (searchName.equals(KWS_SEARCH)) recognizer.startListening(searchName); else recognizer.startListening(searchName, 10000); String caption = getResources().getString(captions.get(searchName)); captionText.setText(caption); } private void setupRecognizer(File assetsDir) { // The recognizer can be configured to perform multiple searches // of different kind and switch between them File modelsDir = new File(assetsDir, "models"); recognizer = defaultSetup() .setAcousticModel(new File(modelsDir, "hmm/en-us-semi")) .setDictionary(new File(modelsDir, "dict/cmu07a.dic")) // To disable logging of raw audio comment out this call (takes a lot of space on the device) .setRawLogDir(assetsDir) // Threshold to tune for keyphrase .setKeywordThreshold(1e-40f) // Use context-independent phonetic search, context-dependent is too slow for mobile .setBoolean("-allphone_ci", true) .getRecognizer(); recognizer.addListener(this); // Create keyword-activation search. recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE); // Create grammar-based search for selection between demos File menuGrammar = new File(modelsDir, "grammar/menu.gram"); recognizer.addGrammarSearch(MENU_SEARCH, menuGrammar); // Create grammar-based search for digit recognition File digitsGrammar = new File(modelsDir, "grammar/digits.gram"); recognizer.addGrammarSearch(DIGITS_SEARCH, digitsGrammar); // Create language model search File languageModel = new File(modelsDir, "lm/weather.dmp"); recognizer.addNgramSearch(FORECAST_SEARCH, languageModel); // Phonetic search File phoneticModel = new File(modelsDir, "phone/en-phone.dmp"); recognizer.addAllphoneSearch(PHONE_SEARCH, phoneticModel); } @Override public void onError(Exception error) { captionText.setText(error.getMessage()); } @Override public void onTimeout() { switchSearch(KWS_SEARCH); } }