1

我希望我的 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. 如果我在PartialResult 上说“嘿”,hypotesis 通常由多个单词组成;最坏的情况我说“嘿”并且方法理解“关于能量血液的彩虹”
  3. 然后调用 onResult 方法,但它打印的 Toast 文本与 onPartialResult 找到的最后一个文本不同;就像它是以一些不平凡的顺序完成的字符串的连接。

我尝试使用不同的关键字阈值,但我没有找到自己的方式......可能我错过了一些基本概念或一些配置参数......有人可以帮助我吗?

4

1 回答 1

2

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

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

关于我的第三点,答案是hypothesis.getHypstr()onResult 包含所有可能匹配的 concat found。要通过查看权重来区分一个匹配项,应该可以迭代 Segments:(recognizer.getDecoder().seg()参见此处)。

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

  1. 为了获得最佳准确性,最好使用 3-4 个音节的关键词;
  2. 太短的短语很容易混淆。
于 2017-01-08T19:17:56.673 回答