PocketSphinx android demo runtime exception

后端 未结 1 1549
粉色の甜心
粉色の甜心 2020-12-11 12:36

I downloaded the source code of pocket sphinx demo. I\'m trying to run it but it is throwing a runtime exception. I\'ve posted the logcat of my code.

09-09 11:45:38

相关标签:
1条回答
  • 2020-12-11 13:08

    You could see the following errors in the log:

    09-09 11:47:26.250: E/cmusphinx(7912): ERROR: "fsg_search.c", line 142: The word 'nine' is missing in the dictionary
    09-09 11:46:59.750: E/cmusphinx(7912): ERROR: "kws_search.c", line 158: The word 'taking' is missing in the dictionary
    

    Looks like your dictionary is incompatible with your changes. You need to make sure dictionary contains all required words.

    And, I see you made some changes but most of them are incomplete. For example you commented the code to setup named searches in setupRecognizer but didn't change switch code, so it still tries to switch to older searches. You can try something like this, it should work:

    package edu.cmu.pocketsphinx.demo;
    
    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 android.app.Activity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    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;
    
    public class PocketSphinxActivity extends Activity implements
            RecognitionListener {
    
        private static final String KWS_SEARCH = "KEYPHRASE";
        private static final String DICTATION_SEARCH = "DICTATION";
    
        private static final String KEYPHRASE = "MORNING";
    
        private SpeechRecognizer recognizer;
        private HashMap<String, Integer> captions;
    
        @Override
        public void onCreate(Bundle state) {
            super.onCreate(state);
    
            // Prepare the data for UI
            captions = new HashMap<String, Integer>();
            captions.put(KWS_SEARCH, R.string.kws_caption);
            captions.put(DICTATION_SEARCH, R.string.forecast_caption);
            setContentView(R.layout.main);
            ((TextView) findViewById(R.id.caption_text))
                    .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(PocketSphinxActivity.this);
    
                        File assetDir = assets.syncAssets();
    
                        setupRecognizer(assetDir);
    
                        recognizer.startListening(KWS_SEARCH);
    
                    } catch (IOException e) {
                        return e;
                    }
                    return null;
                }
    
                @Override
                protected void onPostExecute(Exception result) {
                    if (result != null) {
                        ((TextView) findViewById(R.id.caption_text))
                                .setText("Failed to init recognizer " + result);
                    } else {
                        switchSearch(KWS_SEARCH);
                    }
                }
            }.execute();
        }
    
        @Override
        public void onPartialResult(Hypothesis hypothesis) {
            String text = hypothesis.getHypstr();
            Log.d("Spoken text",text);
    
            if (text.equals(KEYPHRASE))
                switchSearch(DICTATION_SEARCH);
    
            else
                ((TextView) findViewById(R.id.result_text)).setText(text);
        }
    
        @Override
        public void onResult(Hypothesis hypothesis) {
            ((TextView) findViewById(R.id.result_text)).setText("");
            if (hypothesis != null) {
                String text = hypothesis.getHypstr();
                makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
            }
        }
    
        @Override
        public void onBeginningOfSpeech() {
        }
    
        @Override
        public void onEndOfSpeech() {
            Log.d("end","In end of speech");
            if (DICTATION_SEARCH.equals(recognizer.getSearchName()))
                switchSearch(KWS_SEARCH);
        }
    
        private void switchSearch(String searchName) {
            recognizer.stop();
            recognizer.startListening(searchName);
            String caption = getResources().getString(captions.get(searchName));
            ((TextView) findViewById(R.id.caption_text)).setText(caption);
        }
    
        private void setupRecognizer(File assetsDir) {
            File modelsDir = new File(assetsDir, "models");
            recognizer = defaultSetup()
                    .setAcousticModel(new File(modelsDir, "hmm/en-us"))
                    .setDictionary(new File(modelsDir, "dict/5497.dic"))
                    .setRawLogDir(assetsDir).setKeywordThreshold(1e-20f)
                    .setFloat("-beam", 1e-30f)
                    .getRecognizer();
            recognizer.addListener(this);
    
            // Create keyword-activation search.
            recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);
    
            // Create language model search.
            File languageModel = new File(modelsDir, "lm/3015.lm");
            recognizer.addNgramSearch(DICTATION_SEARCH, languageModel);
        }
    }
    
    0 讨论(0)
提交回复
热议问题