如何设置阈值以从 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 并重新开始搜索。

我在应用程序 运行 中看到的不是我所期望的:

  1. onPartialResult 每次我说话时都有一个不为零的假设,如果我说的东西与我正在寻找的东西非常不同;
  2. 另外如果我说"hey" onPartialResult hypotesis 往往由多个单词组成;最坏的情况我说 "hey" 并且方法理解 "rainbow about energies blood"
  3. 然后调用 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 所说:

  1. 为了获得最佳准确性,最好使用 3-4 个音节的关键字短语;
  2. 太短的短语容易混淆。