Pocketsphinx - 完善热词检测
Pocketsphinx - perfecting hot-word detection
我重新访问了 CMU Sphinx recently and attempted to set up a basic hot-word detector for Android, starting from the tutorial and adapting the sample application。
我遇到了各种问题,尽管深入研究了他们的文档,但我一直无法解决这些问题,直到我无法阅读更多...
为了复制它们,我做了一个基本项目,旨在检测关键字 wakeup you 和 叫醒我.
我的词典:
me M IY
wakeup W EY K AH P
you Y UW
我的语言模型:
\data\
ngram 1=5
ngram 2=5
ngram 3=4
-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
-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
-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();
}
}
注意:- 我是否应该更改我选择的关键短语(和其他相关文件)以使其更加不同并且我在安静的环境、设置和阈值中测试实施申请工作非常成功。
问题
- 当我说 唤醒你 或 唤醒我 时,两者都会被检测到。
我无法确定如何对结束音节应用增加的权重。
- 当我说只是 唤醒 时,通常(但不总是)两者都会被检测到。
我无法确定如何避免这种情况的发生。
- 针对背景噪音进行测试时,误报太频繁了。
我无法降低我正在使用的基本阈值,否则在正常情况下无法始终如一地检测到关键短语。
- 如果长时间针对背景噪音进行测试(5 分钟应该足以复制),立即返回安静的环境并说出关键短语,则不会检测到。
在成功并重复检测到关键短语之前需要一段不确定的时间——就好像测试是在安静的环境中开始的。
我找到了 potentially related question,但链接不再有效。我想知道我是否应该更频繁地重置识别器,以便以某种方式将背景噪音从平均化到检测阈值中重置?
- 最后,我想知道我对有限关键词的要求是否允许我减小声学模型的大小?
在我的应用程序中打包时的任何开销当然是有益的。
最后(老实说!),特别希望 @NikolayShmyrev 能发现这个问题,有没有计划完全通过 [=94= 包装一个基础 Android implementation/sdk ]?
我感谢那些走到这一步的人...
My language model:
您不需要语言模型,因为您不使用它。
I can't lower the base thresholds I am using, otherwise the keyphrases are not detected consistently under normal conditions.
1e-20 是一个合理的阈值,您可以提供错误检测的样本记录,让我更好地了解发生了什么。
When testing against background noise for a long period (5 minutes should be sufficient to replicate), returning immediately to a quiet environment and uttering the keyphrases, results in no detection.
这是预期的行为。总的来说,长背景噪声使识别器更难快速适应音频参数。如果你的任务是在嘈杂的地方识别单词,最好使用某种硬件降噪,例如带有降噪功能的蓝牙耳机。
Finally, I wonder if my requirements for limited keyphrases, would allow me to reduce the size of the acoustic model?
现在不可能了。如果你只是为了发现你可以尝试 https://snowboy.kitt.ai
我重新访问了 CMU Sphinx recently and attempted to set up a basic hot-word detector for Android, starting from the tutorial and adapting the sample application。
我遇到了各种问题,尽管深入研究了他们的文档,但我一直无法解决这些问题,直到我无法阅读更多...
为了复制它们,我做了一个基本项目,旨在检测关键字 wakeup you 和 叫醒我.
我的词典:
me M IY
wakeup W EY K AH P
you Y UW
我的语言模型:
\data\
ngram 1=5
ngram 2=5
ngram 3=4
-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
-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
-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();
}
}
注意:- 我是否应该更改我选择的关键短语(和其他相关文件)以使其更加不同并且我在安静的环境、设置和阈值中测试实施申请工作非常成功。
问题
- 当我说 唤醒你 或 唤醒我 时,两者都会被检测到。
我无法确定如何对结束音节应用增加的权重。
- 当我说只是 唤醒 时,通常(但不总是)两者都会被检测到。
我无法确定如何避免这种情况的发生。
- 针对背景噪音进行测试时,误报太频繁了。
我无法降低我正在使用的基本阈值,否则在正常情况下无法始终如一地检测到关键短语。
- 如果长时间针对背景噪音进行测试(5 分钟应该足以复制),立即返回安静的环境并说出关键短语,则不会检测到。
在成功并重复检测到关键短语之前需要一段不确定的时间——就好像测试是在安静的环境中开始的。
我找到了 potentially related question,但链接不再有效。我想知道我是否应该更频繁地重置识别器,以便以某种方式将背景噪音从平均化到检测阈值中重置?
- 最后,我想知道我对有限关键词的要求是否允许我减小声学模型的大小?
在我的应用程序中打包时的任何开销当然是有益的。
最后(老实说!),特别希望 @NikolayShmyrev 能发现这个问题,有没有计划完全通过 [=94= 包装一个基础 Android implementation/sdk ]?
我感谢那些走到这一步的人...
My language model:
您不需要语言模型,因为您不使用它。
I can't lower the base thresholds I am using, otherwise the keyphrases are not detected consistently under normal conditions.
1e-20 是一个合理的阈值,您可以提供错误检测的样本记录,让我更好地了解发生了什么。
When testing against background noise for a long period (5 minutes should be sufficient to replicate), returning immediately to a quiet environment and uttering the keyphrases, results in no detection.
这是预期的行为。总的来说,长背景噪声使识别器更难快速适应音频参数。如果你的任务是在嘈杂的地方识别单词,最好使用某种硬件降噪,例如带有降噪功能的蓝牙耳机。
Finally, I wonder if my requirements for limited keyphrases, would allow me to reduce the size of the acoustic model?
现在不可能了。如果你只是为了发现你可以尝试 https://snowboy.kitt.ai