我正在修改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方法的开头放置一个断点来看到它。
有什么建议吗?
由于
答案 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。