PocketSphinx android demo runtime exception

时光毁灭记忆、已成空白 提交于 2019-11-28 13:06:18

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);
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!