找到多个匹配项时无法迭代 SegmentList

Unable to iterate over SegmentList while more than one match is found

我正在修改 pocketsphinx android 演示以测试基于关键字列表和相关阈值的连续关键字识别。

当我实现edu.cmu.pocketsphinx.RecognitionListener的onResult方法调用这个字符串 hypothesis.getHypstr() 将包含可能的匹配列表。

我读到 要获得每场比赛及其权重,可以这样做:

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

但是我的代码 运行 永远不会像 SegmentList 是空的那样迭代段,而 hypothesis.getHypstr() 显示多个匹配项。

为了重现案例,我使用了这个阈值非常低的关键字列表,以便轻松找到更多匹配项:

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

例如,如果我说 "energies" 然后 hypothesis.getHypstr()="blood about energies blood" 但没有对 SegmentList 进行迭代:我可以通过在 onResult 方法的开头放置一个断点来查看它.

有什么建议吗?

谢谢

此处存在线程问题。 onResult 当识别器已经在 switchSearch 中重新启动时发送消息,因此假设被清除并查询结果 returns 没有。

您可以在重新启动识别器之前将此代码放入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。