【问题标题】:Pocketsphinx - perfecting hot-word detectionPocketsphinx - 完善热词检测
【发布时间】:2016-09-03 18:34:08
【问题描述】:

我最近重新访问了CMU Sphinx,并尝试为Android 设置一个基本的热词检测器,从tutorial 开始并调整sample application

我遇到了各种问题,尽管我深入研究了他们的文档,但我一直无法解决,直到我无法再阅读...

为了复制它们,我做了一个基本项目,旨在检测关键字 wakeup youwakeup me

我的字典:

me M IY
wakeup W EY K AH P
you Y UW

我的语言模型:

\data\
ngram 1=5
ngram 2=5
ngram 3=4

\1-grams:
-0.9031 </s> -0.3010
-0.9031 <s> -0.2430
-1.2041 me -0.2430
-0.9031 wakeup -0.2430
-1.2041 you -0.2430

\2-grams:
-0.3010 <s> wakeup 0.0000
-0.3010 me </s> -0.3010
-0.6021 wakeup me 0.0000
-0.6021 wakeup you 0.0000
-0.3010 you </s> -0.3010

\3-grams:
-0.6021 <s> wakeup me
-0.6021 <s> wakeup you
-0.3010 wakeup me </s>
-0.3010 wakeup you </s>

\end\

以上两个都是使用suggested tool创建的。

还有我的关键短语文件:

wakeup you /1e-20/
wakeup me /1e-20/

改编上面链接的示例应用程序,这是我的代码:

public class PocketSphinxActivity extends Activity implements RecognitionListener {

    private static final String CLS_NAME = PocketSphinxActivity.class.getSimpleName();

    private static final String HOTWORD_SEARCH = "hot_words";

    private volatile SpeechRecognizer recognizer;

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
        setContentView(R.layout.main);

        new AsyncTask<Void, Void, Exception>() {
            @Override
            protected Exception doInBackground(Void... params) {
                Log.i(CLS_NAME, "doInBackground");

                try {

                    final File assetsDir = new Assets(PocketSphinxActivity.this).syncAssets();

                    recognizer = defaultSetup()
                            .setAcousticModel(new File(assetsDir, "en-us-ptm"))
                            .setDictionary(new File(assetsDir, "basic.dic"))
                            .setKeywordThreshold(1e-20f)
                            .setBoolean("-allphone_ci", true)
                            .setFloat("-vad_threshold", 3.0)
                            .getRecognizer();

                    recognizer.addNgramSearch(HOTWORD_SEARCH, new File(assetsDir, "basic.lm"));
                    recognizer.addKeywordSearch(HOTWORD_SEARCH, new File(assetsDir, "hotwords.txt"));
                    recognizer.addListener(PocketSphinxActivity.this);

                } catch (final IOException e) {
                    Log.e(CLS_NAME, "doInBackground IOException");
                    return e;
                }

                return null;
            }

            @Override
            protected void onPostExecute(final Exception e) {
                Log.i(CLS_NAME, "onPostExecute");

                if (e != null) {
                    e.printStackTrace();
                } else {
                    recognizer.startListening(HOTWORD_SEARCH);
                }
            }
        }.execute();
    }

    @Override
    public void onBeginningOfSpeech() {
        Log.i(CLS_NAME, "onBeginningOfSpeech");
    }

    @Override
    public void onPartialResult(final Hypothesis hypothesis) {
        Log.i(CLS_NAME, "onPartialResult");

        if (hypothesis == null)
            return;

        final String text = hypothesis.getHypstr();
        Log.i(CLS_NAME, "onPartialResult: text: " + text);

    }

    @Override
    public void onResult(final Hypothesis hypothesis) {
        // unused
        Log.i(CLS_NAME, "onResult");
    }

    @Override
    public void onEndOfSpeech() {
        // unused
        Log.i(CLS_NAME, "onEndOfSpeech");
    }


    @Override
    public void onError(final Exception e) {
        Log.e(CLS_NAME, "onError");
        e.printStackTrace();
    }

    @Override
    public void onTimeout() {
        Log.i(CLS_NAME, "onTimeout");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(CLS_NAME, "onDestroy");

        recognizer.cancel();
        recognizer.shutdown();
    }
}

注意:- 我是否应该将我选择的关键短语(和其他相关文件)更改为更加不同,并在安静的环境中测试实现,应用的设置和阈值工作非常成功。

问题

  1. 当我说 wakeup youwakeup me 时,两者都会被检测到。

我无法确定如何对结尾音节应用增加的权重。

  1. 当我说唤醒时,通常(但不总是)两者都会被检测到。

我无法确定如何避免这种情况发生。

  1. 在针对背景噪声进行测试时,误报太频繁了。

我无法降低我正在使用的基本阈值,否则在正常情况下无法始终如一地检测到关键短语。

  1. 在长时间针对背景噪音进行测试时(5 分钟应该足以复制),立即返回安静的环境并说出关键短语,导致检测不到。

在成功地重复检测到关键短语之前需要一段不确定的时间 - 就好像测试是在安静的环境中开始的一样。

我找到了potentially related question,但链接不再有效。我想知道我是否应该更频繁地重置识别器,以便以某种方式将背景噪声从平均到检测阈值中重置?

  1. 最后,我想知道我对有限关键词的要求是否允许我减小声学模型的大小?

在我的应用程序中打包时的任何开销当然是有益的。

最后(老实说!),特别希望@NikolayShmyrev 会发现这个问题,有没有计划完全通过 gradle 包装一个基本的 Android 实现/sdk?

感谢那些让我走到今天这一步的人......

【问题讨论】:

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


    【解决方案1】:

    我的语言模型:

    你不需要语言模型,因为你不使用它。

    我无法降低我正在使用的基本阈值,否则在正常情况下无法始终如一地检测到关键短语。

    1e-20 是一个合理的阈值,您可以提供错误检测的示例记录,以便让我更好地了解发生了什么。

    当长时间针对背景噪音进行测试时(5 分钟应该足以复制),立即返回安静的环境并说出关键短语,导致检测不到。

    这是预期的行为。总体而言,长背景噪声使识别器更难快速适应音频参数。如果您的任务是在嘈杂的地方识别文字,最好使用某种硬件降噪功能,例如具有降噪功能的蓝牙耳机。

    最后,我想知道我对有限关键词的要求是否允许我减小声学模型的大小?

    现在不可能。如果你只是为了发现你可以试试https://snowboy.kitt.ai

    【讨论】:

    • 感谢您的回复 Nikolay 以及指向 snowboy 的链接。经过进一步阅读,我现在明白没有使用 LM。您对如何防止检测到两个关键词有什么建议吗?我会寻找链接发生误报的音频文件。
    • 使关键短语足够长且足够独特,并且在您指定的阈值下,每个关键字都将被可靠地检测到。我不太明白你想使用两个相似短语的用例。
    • 我想,如果我开始制作相似的短语并完善系统,那么在实施实际的、更独特的短语时,会更容易,而且我会更有知识。至少,那是我的希望!
    • 检测总是在用户说出略有不同的短语或不同的用户说出相同的短语只是带重音之间的艰难选择。对于第一种情况,您不应该允许声音的细微变化,对于第二种情况,您需要放松模型,以便它仍然可以接受该短语。可能有更好的识别算法来确保关键短语的所有声音都清晰地表达出来,但这不是在 pocketsphinx 中实现的,它只是考虑整个短语并尝试测量差异。
    • 谢谢尼古拉。请问最后一个问题。使用setKeywordThreshold(1e-20f) 是否会覆盖关键字文件中可能设置的更高阈值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多