1

キーワード リストと相対的なしきい値に基づいて継続的なキーワード スポッティングをテストするように、 Pocketphinx Android デモを変更しています。

edu.cmu.pocketsphinx.RecognitionListener の実装の onResult メソッドが呼び出されると、この文字列 hypothesis.getHypstr()には可能な一致のリストが含まれます。

ここで、すべての一致とその重みを取得するには、次のようにすることが可能であることを読みました。

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

hypothesis.getHypstr()ただし、複数の一致を示している間に SegmentList が空の場合のように、実行中のコードがセグメントを反復処理することはありません。

ケースを再現するために、より多くの一致が簡単に見つかるように、非常に低いしきい値でこのキーワード リストを使用しています。

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

私のonPartialResult方法は何もしていません:

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

たとえば、"energys" then hypothesis.getHypstr()="blood about energys blood" と言った場合でも、SegmentList に対する反復は行われません。onResult メソッドの先頭にブレークポイントを配置することで確認できます。

なにか提案を?

ありがとう

4

1 に答える 1

0

ここにスレッドの問題があります。onResultレコグナイザーがすでに再起動されている場合にメッセージが配信されるswitchSearchため、仮説がクリアされ、結果のクエリは何も返しません。

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 は必要ありません。

于 2017-01-08T20:52:50.620 に答える