Pocketsphinx -完善热词检测



我最近重新访问了CMU Sphinx,并尝试为Android设置一个基本的热词检测器,从教程开始并调整示例应用程序。

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

为了复制它们,我做了一个基本的项目,旨在检测关键字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

以上两个都是使用建议的工具创建的。

和我的关键短语文件:

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时,两者都会被检测到。

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

  • 当我说wakeup时,通常(但不总是)两者都会被检测到。

    我不知道怎样才能避免这种情况的发生。

  • 在对背景噪声进行测试时,误报频率过高。
  • 我不能降低我使用的基本阈值,否则在正常条件下不能始终检测到关键短语。

  • 当长时间(5分钟应该足以复制)在背景噪声下测试时,立即返回到安静的环境并说出关键短语,结果没有检测到。
  • 需要一段不确定的时间才能成功地重复检测到关键短语——就好像测试是在一个安静的环境中开始的。

    我发现了一个可能相关的问题,但链接不再工作。我想知道我是否应该更频繁地重置识别器,以便以某种方式重置背景噪声,使其不被平均到检测阈值中?

  • 最后,我想知道我对有限关键字的要求是否允许我缩小声学模型的尺寸?
  • 在我的应用程序中进行打包时的任何开销当然是有益的。

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

    我感谢那些走到这一步的人。

    我的语言模型:

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

    我不能降低我使用的基本阈值,否则在正常条件下不能始终检测到关键短语。

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

    在长时间(5分钟应该足以重复)的背景噪音下进行测试时,立即返回到安静的环境并说出关键短语,结果没有检测到。

    这是预期的行为。总的来说,长背景噪声使识别器难以快速适应音频参数。如果你的任务是在嘈杂的地方识别单词,最好使用某种硬件降噪,例如带降噪功能的蓝牙耳机。

    最后,我想知道我对有限关键字的要求是否允许我缩小声学模型的尺寸?

    现在是不可能的。如果你只是想寻找点,你可以试试https://snowboy.kitt.ai

    相关内容

    • 没有找到相关文章

    最新更新