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

时间:2017-01-07 15:02:55

标签: android speech-recognition cmusphinx pocketsphinx pocketsphinx-android

我希望我的Android应用程序能够连续发现关键字。 我正在修改pocketsphinx android demo以测试我是如何做到的。 我在名为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);
    }

这样每次发现部分结果时出现非空的hypotes,就会调用onResult并再次开始搜索。

我在应用中看到的并不是我所期待的:

  1. onPartialResult每次我说话的时候都有一个非空的小说,如果我说的话与我正在寻找的东西有很大不同;
  2. 如果我说“嘿”onPartialResult hypotesis通常由多个单词组成;最坏的情况我说“嘿”,方法理解“关于能量血液的彩虹”
  3. 然后调用
  4. onResult方法,但它打印的Toast文本与onPartialResult找到的文本不同;就好像它是以一些非平凡的顺序完成的字符串连接。
  5. 我尝试使用不同的关键字阈值,但我找不到自己的方式......可能我缺少一些基本概念或一些配置参数...... 有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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