如何设置阈值以从 pocketsphinx-android 中的列表中发现关键字?
How to setup tresholds to spot keywords from a list in pocketsphinx-android?
我希望我的 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 每次我说话时都有一个不为零的假设,如果我说的东西与我正在寻找的东西非常不同;
- 另外如果我说"hey" onPartialResult hypotesis 往往由多个单词组成;最坏的情况我说 "hey" 并且方法理解 "rainbow about energies blood"
- 然后调用 onResult 方法,但它打印的 Toast 文本与 onPartialResult 上次找到的文本不同;就像它是以一些不平凡的顺序完成的字符串连接。
我尝试使用不同的关键字阈值,但我没有找到我的方法...可能我缺少一些基本概念或一些配置参数...
有人可以帮我解决这个问题吗?
绝对的解决方案是了解阈值的工作原理并正确调整它们。我从 sourceforgeforum 中读到,阈值越高(最大 1),误报越少(有丢失真正匹配的风险),反之亦然(最小 1e-50)。
如果可能识别的权重大于或等于您的阈值,Pocketsphinx 代码将使用您的阈值和 return 匹配:将关键字短语的阈值设置为 1 意味着您希望仅当 pocketsphinx 是时才在结果中包含该关键字短语绝对确定所说的内容。
我使用的是 1e-50,这是一个非常低的阈值,会导致很多误报:有了这个阈值,几乎所有你说的内容都会被理解为你的一个或多个关键字list. 这是我问题中第 1 点和第 2 点的答案。
关于我的第 3 点,答案是 onResult 中的 hypothesis.getHypstr()
包含找到的所有可能匹配项的连接 。要通过查看权重来区分一场比赛与另一场比赛,应该可以迭代段:recognizer.getDecoder().seg()
().
反正这还没完。要实现性能良好的识别器,必须遵循一些选择关键短语的规则,然后执行阈值调整。正如 CMU tutorial 所说:
- 为了获得最佳准确性,最好使用 3-4 个音节的关键字短语;
- 太短的短语容易混淆。
我希望我的 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 每次我说话时都有一个不为零的假设,如果我说的东西与我正在寻找的东西非常不同;
- 另外如果我说"hey" onPartialResult hypotesis 往往由多个单词组成;最坏的情况我说 "hey" 并且方法理解 "rainbow about energies blood"
- 然后调用 onResult 方法,但它打印的 Toast 文本与 onPartialResult 上次找到的文本不同;就像它是以一些不平凡的顺序完成的字符串连接。
我尝试使用不同的关键字阈值,但我没有找到我的方法...可能我缺少一些基本概念或一些配置参数... 有人可以帮我解决这个问题吗?
绝对的解决方案是了解阈值的工作原理并正确调整它们。我从 sourceforgeforum 中读到,阈值越高(最大 1),误报越少(有丢失真正匹配的风险),反之亦然(最小 1e-50)。 如果可能识别的权重大于或等于您的阈值,Pocketsphinx 代码将使用您的阈值和 return 匹配:将关键字短语的阈值设置为 1 意味着您希望仅当 pocketsphinx 是时才在结果中包含该关键字短语绝对确定所说的内容。
我使用的是 1e-50,这是一个非常低的阈值,会导致很多误报:有了这个阈值,几乎所有你说的内容都会被理解为你的一个或多个关键字list. 这是我问题中第 1 点和第 2 点的答案。
关于我的第 3 点,答案是 onResult 中的 hypothesis.getHypstr()
包含找到的所有可能匹配项的连接 。要通过查看权重来区分一场比赛与另一场比赛,应该可以迭代段:recognizer.getDecoder().seg()
(
反正这还没完。要实现性能良好的识别器,必须遵循一些选择关键短语的规则,然后执行阈值调整。正如 CMU tutorial 所说:
- 为了获得最佳准确性,最好使用 3-4 个音节的关键字短语;
- 太短的短语容易混淆。