1

我正在修改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 方法的开头放置一个断点来查看它。

有什么建议吗?

谢谢

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 回答