android - 如何设置阈值以从 pocketsphinx-android 中的列表中发现关键字?

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

我尝试使用不同的关键字阈值,但我没有找到我的方法......可能我缺少一些基本概念或一些配置参数...... 有人可以帮我解决这个问题吗?

最佳答案

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

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

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

反正这还没有结束。要实现性能良好的识别器,必须遵循一些选择关键短语的规则,然后执行阈值调整。喜欢 CMU tutorial说:

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

关于android - 如何设置阈值以从 pocketsphinx-android 中的列表中发现关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41522815/

相关文章:

android - OnFocusChangeListener 监听背景点击

python - Python-语音识别时间偏移

java - 如何在java中使用sphinx和freetts管理hello.gram以进行对话

android - 组合 `by lazy` 和 `object` 导致编译器错误 "cannot find symbol"

php - android 使用 json 与 php mysql 连接

Python 无法使用 Gstreamer 访问 USB 麦克风以在 Raspberry Pi 上使用 Pocketsphinx 执行语音识别

java - getComponentNames 没有这样的方法错误

speech-recognition - 如何在帧上分割语音数据并计算 MFCC

android - 为什么Webview第一次启动会崩溃?

machine-learning - 增加训练数据并不能减少 CNN 的过度拟合