如何在pocketsphinx android中设置Treshold以从列表中发现关键字?
我想让我的Android应用程序做连续的关键字定位。 我正在修改pocketsphinx android演示,以测试我如何做到这一点。 我在一个名为en-keywords.txt的文件中写下了这个列表,从cmudict-en-us.dict中挑选单词: 在setupRecognizer方法中,我删除了每个搜索,并仅将此关键字搜索添加到识别器中:如何在pocketsphinx android中设置Treshold以从列表中发现关键字?,android,speech-recognition,cmusphinx,pocketsphinx,pocketsphinx-android,Android,Speech Recognition,Cmusphinx,Pocketsphinx,Pocketsphinx Android,我想让我的Android应用程序做连续的关键字定位。 我正在修改pocketsphinx android演示,以测试我如何做到这一点。 我在一个名为en-keywords.txt的文件中写下了这个列表,从cmudict-en-us.dict中挑选单词: 在setupRecognizer方法中,我删除了每个搜索,并仅将此关键字搜索添加到识别器中: File keywords= new File(assetsDir, "en-keywords.txt"); recognizer.ad
File keywords= new File(assetsDir, "en-keywords.txt");
recognizer.addKeywordSearch(KWS_SEARCH, keywords);
最后,我修改了onPartialResult,如下所示:
public void onPartialResult(Hypothesis hypothesis) {
if (hypothesis == null)
return;
String text = hypothesis.getHypstr();
switchSearch(KWS_SEARCH);
}
因此,每次找到带有非空值的部分结果时,都会调用onResult并再次开始搜索
我在应用程序运行中看到的不是我所期望的:
每次我说话的时候,如果我说的话和我要找的东西很不一样,onPartialResult也有一个非空的缩合;
另外,如果我说hey on partial结果hyposis通常由多个单词组成;最坏的情况是我说嗨,方法了解彩虹关于血的能量
然后调用onResult方法,但它打印的Toast文本与onPartialResult最后找到的文本不同;就像它是一个字符串的集合,以一些不平凡的顺序完成。
我试着用不同的树状结构来做关键词,但我没有找到我的方法。。。可能我缺少一些基本概念或一些配置参数。。。
有人能在这方面帮助我吗?当然,解决办法是了解阈值是如何工作的,并正确调整它们。我从中了解到,treshold max 1越高,误报率越低,错过真正比赛的风险越小,反之亦然,最小1e-50。 Pocketsphinx代码将使用您的阈值,并在可能识别的权重大于或等于您的阈值时返回匹配项:将一个关键字短语的阈值设置为1意味着您只希望在Pocketsphinx完全确定所说内容的情况下,该关键字短语才会出现在结果中 我使用的是1e-50,这是一个非常低的treshold,会导致很多错误警报:使用该treshold,您所说的几乎所有内容都会被理解为列表中的一个或多个关键字。这是对我问题第1点和第2点的回答 关于我的第三点,答案是onResult中的假设.getHypstr包含找到的每个可能匹配项的concat。要通过查看权重来区分一个匹配项与另一个匹配项,应该可以在以下分段上进行迭代:recognizer.getDecoder.seg 无论如何,这并没有结束。要实现性能良好的识别器,必须遵循一些规则来选择关键短语,然后执行treshold调优。就像上面说的: 为了获得最好的准确度,最好是有3-4个音节的关键词; 太短的短语容易混淆。
好的,我在网上查到的[sourceforge forum:treshold max 1越高,假警报越少,有丢失真实匹配的风险,反之亦然,最小1e-45。我将尝试使用treshold…我还发现,低treshold可以带来多个可能的匹配。但是,当我的Hyptosis识别器中有多个匹配时。getDecoder.seg似乎总是empty…这正常吗?我建议您阅读文档,谢谢@Nikolay,我已经阅读了。所以我想您确认了我问题的解决方案是调整tresholds。您能告诉我一些关于使用多个匹配项和空识别器的hyposis。getDecoder.seg的信息吗?遵循教程的建议也很有帮助。获取帮助在检测阈值上,您需要提供用于优化的测试数据,如上面链接的教程所述。根据我的经验,我会为关键短语选择添加:1.使用单个关键字而不是关键短语;2.使用有限的列表,以便关键字之间几乎没有相似性。您如何看待@Nikolay?
public void onPartialResult(Hypothesis hypothesis) {
if (hypothesis == null)
return;
String text = hypothesis.getHypstr();
switchSearch(KWS_SEARCH);
}