Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在pocketsphinx android中设置Treshold以从列表中发现关键字?_Android_Speech Recognition_Cmusphinx_Pocketsphinx_Pocketsphinx Android - Fatal编程技术网

如何在pocketsphinx android中设置Treshold以从列表中发现关键字?

如何在pocketsphinx android中设置Treshold以从列表中发现关键字?,android,speech-recognition,cmusphinx,pocketsphinx,pocketsphinx-android,Android,Speech Recognition,Cmusphinx,Pocketsphinx,Pocketsphinx Android,我想让我的Android应用程序做连续的关键字定位。 我正在修改pocketsphinx android演示,以测试我如何做到这一点。 我在一个名为en-keywords.txt的文件中写下了这个列表,从cmudict-en-us.dict中挑选单词: 在setupRecognizer方法中,我删除了每个搜索,并仅将此关键字搜索添加到识别器中: File keywords= new File(assetsDir, "en-keywords.txt"); recognizer.ad

我想让我的Android应用程序做连续的关键字定位。 我正在修改pocketsphinx android演示,以测试我如何做到这一点。 我在一个名为en-keywords.txt的文件中写下了这个列表,从cmudict-en-us.dict中挑选单词:

在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并再次开始搜索

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

每次我说话的时候,如果我说的话和我要找的东西很不一样,onPartialResult也有一个非空的缩合; 另外,如果我说hey on partial结果hyposis通常由多个单词组成;最坏的情况是我说嗨,方法了解彩虹关于血的能量 然后调用onResult方法,但它打印的Toast文本与onPartialResult最后找到的文本不同;就像它是一个字符串的集合,以一些不平凡的顺序完成。 我试着用不同的树状结构来做关键词,但我没有找到我的方法。。。可能我缺少一些基本概念或一些配置参数。。。
有人能在这方面帮助我吗?

当然,解决办法是了解阈值是如何工作的,并正确调整它们。我从中了解到,treshold max 1越高,误报率越低,错过真正比赛的风险越小,反之亦然,最小1e-50。 Pocketsphinx代码将使用您的阈值,并在可能识别的权重大于或等于您的阈值时返回匹配项:将一个关键字短语的阈值设置为1意味着您只希望在Pocketsphinx完全确定所说内容的情况下,该关键字短语才会出现在结果中

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

关于我的第三点,答案是onResult中的假设.getHypstr包含找到的每个可能匹配项的concat。要通过查看权重来区分一个匹配项与另一个匹配项,应该可以在以下分段上进行迭代:recognizer.getDecoder.seg

无论如何,这并没有结束。要实现性能良好的识别器,必须遵循一些规则来选择关键短语,然后执行treshold调优。就像上面说的:

为了获得最好的准确度,最好是有3-4个音节的关键词; 太短的短语容易混淆。
好的,我在网上查到的[sourceforge forum:treshold max 1越高,假警报越少,有丢失真实匹配的风险,反之亦然,最小1e-45。我将尝试使用treshold…我还发现,低treshold可以带来多个可能的匹配。但是,当我的Hyptosis识别器中有多个匹配时。getDecoder.seg似乎总是empty…这正常吗?我建议您阅读文档,谢谢@Nikolay,我已经阅读了。所以我想您确认了我问题的解决方案是调整tresholds。您能告诉我一些关于使用多个匹配项和空识别器的hyposis。getDecoder.seg的信息吗?遵循教程的建议也很有帮助。获取帮助在检测阈值上,您需要提供用于优化的测试数据,如上面链接的教程所述。根据我的经验,我会为关键短语选择添加:1.使用单个关键字而不是关键短语;2.使用有限的列表,以便关键字之间几乎没有相似性。您如何看待@Nikolay?
public void onPartialResult(Hypothesis hypothesis) {
        if (hypothesis == null)
            return;

        String text = hypothesis.getHypstr();

        switchSearch(KWS_SEARCH);
    }