找到多个匹配项时无法迭代 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。
我正在修改 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。