androidpocketsphinx-android

PocketSphinx android displaying results even without me speaking


I am using pocketsphinx on android for spotting a keyword, but it doesn't recognize any other keyword than the required one. Moreover it doesn't even wait for me to speak and displays the keyword in the logcat.

Here is my code:

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);
}
}

Here is the Logcat when I haven't even spoken yet.

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

and so on...

What am I doing wrong???


Solution

  • If you have too many false alarms you can reduce keyword threshold from 1e-40 to 1e-20 or even 1e-10 in this line:

            .setKeywordThreshold(1e-40f)