即使没有我说话,PocketSphinx android显示结果

时间:2015-07-01 08:45:12

标签: android pocketsphinx-android

我在android上使用pocketsphinx来发现一个关键字,但它不识别任何其他关键字而不是所需的关键字。此外,它甚至不等我发言并在logcat中显示关键字。

这是我的代码:

public class SpeechService extends Service implements RecognitionListener {

private static final String TAG = "myTag";
private static final String KWS_SEARCH = "wakeup";
private static final String KEY_PHRASE = "hello";

private SpeechRecognizer recognizer;
private PowerManager.WakeLock lock;

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onDestroy() {
    super.onDestroy();
    recognizer.cancel();
    recognizer.shutdown();
    lock.release();
}

@Override
public int onStartCommand(Intent data, int flags, int startId) {
    new AsyncTask<Void, Void, Exception>() {
        @Override
        protected Exception doInBackground(Void... params) {
            try {
                Assets assets = new Assets(SpeechService.this);
                File assetDir = assets.syncAssets();
                setupRecognizer(assetDir);
            } catch (IOException e) {
                return e;
            }
            return null;
        }

        @Override
        protected void onPostExecute(Exception result) {
            if(result == null)
                recognizer.startListening(KWS_SEARCH);
        }
    }.execute();

    return START_STICKY;
}

private void setupRecognizer(File assetsDir) throws IOException {
    // The recognizer can be configured to perform multiple searches
    // of different kind and switch between them

    recognizer = defaultSetup()
            .setAcousticModel(new File(assetsDir, "en-us-ptm"))
            .setDictionary(new File(assetsDir, "cmudict-en-us.dict"))


            //.setRawLogDir(assetsDir)


            .setKeywordThreshold(1e-40f)


            .setBoolean("-allphone_ci", true)

            .getRecognizer();
    recognizer.addListener(this);

    // Create keyword-activation search.
    recognizer.addKeyphraseSearch(KWS_SEARCH, KEY_PHRASE);
}

@Override
public void onBeginningOfSpeech() {
    //Log.i(TAG, "onBeginningOfSpeech");
}

@Override
public void onEndOfSpeech() {
    //Log.i(TAG, "onEndOfSpeech");
    if(!recognizer.getSearchName().equals(KWS_SEARCH)) {
        recognizer.cancel();
        recognizer.startListening(KWS_SEARCH);
    }
}

@Override
public void onPartialResult(Hypothesis hypothesis) {
    //Log.i(TAG, "onPartialResult");
    if(hypothesis == null)
        return;
    String result = hypothesis.getHypstr();
    Log.i(TAG, "result = " + result);
    recognizer.cancel();
    recognizer.startListening(KWS_SEARCH);
}

@Override
public void onResult(Hypothesis hypothesis) {
    //Log.i(TAG, "onResult");
}

@Override
public void onError(Exception e) {
    Log.i(TAG, "onError");
    recognizer.startListening(KWS_SEARCH);
}

@Override
public void onTimeout() {
    Log.i(TAG, "onTimeout");
    recognizer.startListening(KWS_SEARCH);
}
}

当我还没有说话时,这是Logcat。

result = hello
result = hello
result = hello hello
result = hello
result = hello hello
result = hello

依旧......

我做错了什么???

2 个答案:

答案 0 :(得分:1)

如果您有太多错误警报,您可以将此关键字阈值从1e-40降低到1e-20甚至1e-10:

        .setKeywordThreshold(1e-40f)

答案 1 :(得分:1)

我也有同样的问题。

我认为识别“你好”太容易了,所以我第一次将关键词改为两个单词。

但使用起来并不好,因为有时它无法识别。

所以我自己编写了语法并使用了addGrammarSearch方法。顺便说一句,你的语法不能只是一个单词,你必须添加一些单词来欺骗噪音。

最后我写了判断方法来识别onParticalResult或onResult方法中的关键字。

如果你有任何更好的答案我想知道。

相关问题