【发布时间】:2017-01-07 15:02:55
【问题描述】:
我希望我的 Android 应用程序能够进行连续的关键字发现。 我正在修改 pocketsphinx android 演示来测试我是如何做到的。 我将这个列表写在一个名为 en-keywords.txt 的文件中,从 cmudict-en-us.dict 中挑选单词:
rainbow /1e-50/
about /1e-50/
blood /1e-50/
energies /1e-50/
在 setupRecognizer 方法中,我删除了每个搜索并仅将这个关键字搜索添加到识别器中:
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 每次我说话时都有一个不为零的假设,如果我说的内容与我正在寻找的内容非常不同;
- 如果我说“嘿” onPartialResult 假设通常由多个单词组成;最坏的情况我说“嘿”并且方法理解“关于能量血的彩虹”
- onResult 方法随后被调用,但它打印的 Toast 的文本与 onPartialResult 找到的最后一个文本不同;就像它是以一些不平凡的顺序完成的字符串连接。
我尝试了不同的关键字阈值,但我没有找到自己的方式......可能我错过了一些基本概念或一些配置参数...... 有人可以帮我解决这个问题吗?
【问题讨论】:
-
好的,我在 [sourceforge.net/p/cmusphinx/discussion/help/thread/05d09693/…sourceforge 论坛上发现了这一点:阈值越高(最大 1),误报越少(有丢失真实匹配的风险),反之亦然(最小 1e- 45)。我会尝试在门槛上工作......
-
我还发现低门槛可以带来不止一个可能的匹配here。但是,当我的假设中有不止一场比赛时,
recognizer.getDecoder().seg()似乎总是空的……这正常吗? -
谢谢@Nikolay,我已经做到了。所以我认为你确认我的问题的解决方案是调整阈值。你能告诉我一些关于有多于一场比赛的低血压和一个空的
recognizer.getDecoder().seg()吗? -
遵循教程建议也很有帮助。要获得有关检测阈值的帮助,您需要提供用于调整的测试数据,如上面链接的教程中所述。
标签: android speech-recognition cmusphinx pocketsphinx pocketsphinx-android