1

キーワードリストと相対的なしきい値に基づいて連続キーワード検索をテストするpocketsphinx androidデモを変更しています。複数の一致が見つかったときにSegmentListを繰り返し処理できません

edu.cmu.pocketsphinx.RecognitionListenerを実装したときのonResultメソッドの文字列を hypothesis.getHypstr()とすると、一致する可能性のあるリストが含まれます。

私はこのように行うことが可能であるひとつひとつの試合を取得し、その重みにhereをお読みください。hypothesis.getHypstr()は、より多くのを示しながらSEGMENTLISTが空だった場合、私のコードの実行のようなセグメントを反復処理されることはありませんが

for (Segment seg : recognizer.getDecoder().seg()) { 
    System.out.println(seg.getWord() + " " + seg.getProb()); 
} 

1つのマッチより。

public void onEndOfSpeech() { 
     switchSearch(KWS_SEARCH); 
} 

public void onResult(Hypothesis hypothesis) { 
    if (hypothesis != null) { 

    for (Segment seg : recognizer.getDecoder().seg()) { 
     //No iteration is done here!!! 
     Log.d("onResult", seg.getWord() + " " + seg.getProb()); 
    } 

     String text = hypothesis.getHypstr(); 
     makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 
    } 
} 

:私onPartialResult方法は、一方で何もしていない

rainbow /1e-50/ 
about /1e-50/ 
blood /1e-50/ 
energies /1e-50/ 

:より多くの試合を簡単に見つけられるように、私は非常に低いtresholdsで、このキーワードリストを使用している場合を再現する

例えば、 "energies"と答えた場合、hypothesis.getHypstr() = "blood about energy blood"ではなく、SegmentListに対して反復処理が行われません。つまり、onResultメソッドの先頭にブレークポイントを置くことで確認できます。

提案がありますか?

ありがとうございました

+0

ほとんどの場合、繰り返されますが、何も印刷しません。また、仮説内でループを移動する必要があります!= null条件。 –

+0

ありがとう@Nikolay、私は標準出力の出力を探しているのではなく、代わりに私はコードをデバッグしているブロックは入力されません。あなたは正しい?私は仮説を移すだろう!= null条件だが、とにかくデバッグしている間に、次のブロックが入力されているため仮説がヌルでないことがわかる。 – salvolds

答えて

0

ここにスレッドの問題があります。認識器が既にswitchSearchで再開されたときにメッセージが配信され、仮説がクリアされ、結果のクエリが何も返しません。onResultあなたが認識装置が再起動される前に、それが正常に動作しますswitchSearchの内側にこのコードを置くことができ

private void switchSearch(String searchName) { 
    boolean wasRunning = recognizer.stop(); 

    if (wasRunning) { 
     for (Segment seg : recognizer.getDecoder().seg()) { 
      Log.d("!!!! ", seg.getWord()); 
     } 
    } 

    // If we are not spotting, start listening with timeout (10000 ms or 10 seconds). 
    if (searchName.equals(KWS_SEARCH)) 
     recognizer.startListening(searchName); 
    else 
     recognizer.startListening(searchName, 10000); 

    String caption = getResources().getString(captions.get(searchName)); 
    ((TextView) findViewById(R.id.caption_text)).setText(caption); 
} 

あなただけのキーワードスポッティングを使用した場合、あなたはまた、できるだけ早く呼び出されるonPartialResult内にこのコードを置くことができます無音が検出されたときではなく、キーフレーズが検出されます。それにより反応が速くなります。純粋なキーワードのスポッティングでは、onEndOfSpeechとonResultは必要ありません。

+0

ありがとうNikolay、今私はonPartialResultだけを使用して、その終わりに認識プログラムを停止して再起動します。何か欠点がありますか?私は確率が負の値(-2340のようなもの)であると見ていますが、最も近いものは0に最も近いでしょうか? – salvolds

+0

私はhypotesisとSegmentListが毎回きれいになるように、認識プログラムを停止して再起動します。より良い方法がありますか?時々、onPartialResultには見られないようなキーフレーズがあると言われていますが、それとはまったく違うものがあったとしても、次のスピーチの後に現れます。 – salvolds

関連する問題