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

时间:2017-01-08 18:25:49

标签: android speech-recognition cmusphinx pocketsphinx pocketsphinx-android

我正在修改pocketsphinx android demo,根据关键字列表和相对阈值测试连续关键字定位。

当我执行edu.cmu.pocketsphinx.RecognitionListener的onResult方法调用此字符串时 hypothesis.getHypstr()将包含可能匹配的列表。

我看了here,为了获得每一个匹配及其权重,可以这样做:

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

例如,如果我说" energy"然后hypothesis.getHypstr() ="关于能量血液的血液"但是没有对SegmentList进行迭代:我可以通过在onResult方法的开头放置一个断点来看到它。

有什么建议吗?

由于

1 个答案:

答案 0 :(得分: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。