【问题标题】:How to setup tresholds to spot keywords from a list in pocketsphinx-android?如何设置阈值以从 pocketsphinx-android 的列表中发现关键字?
【发布时间】: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 并重新开始搜索。

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

  1. onPartialResult 每次我说话时都有一个不为零的假设,如果我说的内容与我正在寻找的内容非常不同;
  2. 如果我说“嘿” onPartialResult 假设通常由多个单词组成;最坏的情况我说“嘿”并且方法理解“关于能量血的彩虹”
  3. 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


【解决方案1】:

毫无疑问,解决方案是了解阈值的工作原理并正确调整它们。我从sourceforgeforum 中读到,阈值越高(最大值为 1),误报越少(有丢失真实匹配的风险),反之亦然(最小值为 1e-50)。 如果可能识别的权重大于或等于您的阈值,Pocketsphinx 代码将使用您的阈值并返回匹配项:将关键短语的阈值设置为 1 意味着只有当 pocketsphinx 绝对确定什么时,您才希望在结果中包含该关键短语已经说过了。

我使用的是 1e-50,这是一个非常低的阈值,会导致很多误报:在这个阈值下,您所说的几乎所有内容都会被理解为列表中的一个或多个关键字。 这是我问题中第 1 点和第 2 点的答案。

关于我的第三点,答案是 onResult 中的 hypothesis.getHypstr() 包含找到的所有可能匹配项的连接。要通过查看权重来区分一个匹配项,应该可以迭代分段:recognizer.getDecoder().seg() (see here)。

这无论如何都没有结束。要实现一个性能良好的识别器,必须遵循一些规则来选择关键短语,然后执行阈值调整。就像CMU tutorial说的:

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

【讨论】:

  • 根据我的小经验,我会为关键词选择添加: 1. 使用单个关键字而不是关键词; 2. 使用有限的列表,这样关键字之间的相似性就会很小。
  • 你觉得@Nikolay 怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多