我可以修改 PocketSphinx 的关键字识别器 "refresh rate" 吗?
Can I modify PocketSphinx's keyword recognizer "refresh rate"?
我是 运行 PocketSphinx Android(版本 5prealpha)。我正在使用文件定义的关键字识别器,由以下代码段指定(kwfile
是关键字定义文件,mRecognizer
是 SpeechRecognizer 的一个实例):
mRecognizer.addKeywordSearch(DESCRIPTOR, kwfile);
整体来说,在优化了关键词阈值后,识别性能还是不错的。但是,如果我在一个关键字话语和下一个关键词话语之间等待任意时间(5 秒到几分钟),则第二个话语的识别性能会受到影响。例如,我会说 "keyword," 它会被识别。如果我等待少于 5 秒并再次说 "keyword",则第二个话语可能会被识别(识别率超过 95%)。但是,如果我等待 15 秒,识别率会急剧下降,低于 50%。
我的假设是,当我第二次说关键字时,识别器正处于刷新过程中 - 即它处于 Stop Recognition
事件和 Start Recognition
事件之间,并且我的演讲超越了那个事件。这是我的 logcat 的典型视图。请注意,5 秒后,识别器 "refreshes"。大多数情况下,这种情况大约每 5 秒发生一次。有时 "refreshes" 之间可能长达 30 秒,但通常在 5 秒左右。
09-26 07:11:06.800 20397-20397/...﹕ Start recognition "kwfile"
09-26 07:11:06.815 20397-23642/...﹕ Starting decoding
09-26 07:11:11.310 20397-20397/...﹕ Stop recognition
09-26 07:11:11.315 20397-20397/...﹕ Start recognition "kwfile"
09-26 07:11:11.360 20397-23645/...﹕ Starting decoding
09-26 07:11:17.405 20397-20397/...﹕ Stop recognition
所以,我的问题是:我可以做些什么来控制这个 "refresh rate"?这是因为我在 RecognitionListener
实现中做错了什么(见下文,但请注意 - 我通常不会在话语之间得到任何部分结果。)?或者是否有一个我不知道要设置此刷新率的 PocketSphinx API 调用?或者,我可以在 PocketSphinx 源代码中更改某些内容以改进此行为吗?
class VoiceListener implements RecognitionListener{
private boolean isCommand = false;
@Override
public void onBeginningOfSpeech() {
Log.d(TAG,"Beginning of Speech");
// do nothing
}
@Override
public void onEndOfSpeech() {
Log.d(TAG,"End of Speech");
// do nothing
}
@Override
public void onPartialResult(Hypothesis arg0) {
if( arg0 != null){
Log.d(TAG, "Partial results list: " + arg0.getHypstr());
isCommand = false;
// handle recognition results for keywords
for( String command : this.getCurrentCommands() ) {
if (arg0.getHypstr().contains(command)) {
this.onRecognition(arg0.getHypStr());
isCommand = true;
mRecognizer.stop();
}
}
// call stop, and let onResults() handle grammar results
if( arg0.getHypstr().contains(Command.STOP_WORD))
mRecognizer.stop();
}
}
@Override
public void onResult(Hypothesis results) {
String data;
if( results == null ){
data = null;
}else{
data = results.getHypstr();
}
Log.d(TAG,"Final results: " + data );
// handle grammar recognition results
if( !isCommand ){
this.onRecognition(data);
}
return;
}
没有"refresh rate"这样的东西。识别精度下降可能是因为背景中有一些噪音并且没有被正确过滤掉。您可以研究原始转储以调查沉默是否算作讲话。您可以共享原始音频转储以获得有关此问题的帮助。
你的代码中有些地方不太合理。如果您仅使用关键字识别,则无需像现在这样在 onEndOfSpeech 中停止并重新启动识别器,您可以跳过它。在定位模式下,您无需等待语音结束即可获得结果,您可以只使用部分结果来调用操作并重新启动识别器。
我是 运行 PocketSphinx Android(版本 5prealpha)。我正在使用文件定义的关键字识别器,由以下代码段指定(kwfile
是关键字定义文件,mRecognizer
是 SpeechRecognizer 的一个实例):
mRecognizer.addKeywordSearch(DESCRIPTOR, kwfile);
整体来说,在优化了关键词阈值后,识别性能还是不错的。但是,如果我在一个关键字话语和下一个关键词话语之间等待任意时间(5 秒到几分钟),则第二个话语的识别性能会受到影响。例如,我会说 "keyword," 它会被识别。如果我等待少于 5 秒并再次说 "keyword",则第二个话语可能会被识别(识别率超过 95%)。但是,如果我等待 15 秒,识别率会急剧下降,低于 50%。
我的假设是,当我第二次说关键字时,识别器正处于刷新过程中 - 即它处于 Stop Recognition
事件和 Start Recognition
事件之间,并且我的演讲超越了那个事件。这是我的 logcat 的典型视图。请注意,5 秒后,识别器 "refreshes"。大多数情况下,这种情况大约每 5 秒发生一次。有时 "refreshes" 之间可能长达 30 秒,但通常在 5 秒左右。
09-26 07:11:06.800 20397-20397/...﹕ Start recognition "kwfile"
09-26 07:11:06.815 20397-23642/...﹕ Starting decoding
09-26 07:11:11.310 20397-20397/...﹕ Stop recognition
09-26 07:11:11.315 20397-20397/...﹕ Start recognition "kwfile"
09-26 07:11:11.360 20397-23645/...﹕ Starting decoding
09-26 07:11:17.405 20397-20397/...﹕ Stop recognition
所以,我的问题是:我可以做些什么来控制这个 "refresh rate"?这是因为我在 RecognitionListener
实现中做错了什么(见下文,但请注意 - 我通常不会在话语之间得到任何部分结果。)?或者是否有一个我不知道要设置此刷新率的 PocketSphinx API 调用?或者,我可以在 PocketSphinx 源代码中更改某些内容以改进此行为吗?
class VoiceListener implements RecognitionListener{
private boolean isCommand = false;
@Override
public void onBeginningOfSpeech() {
Log.d(TAG,"Beginning of Speech");
// do nothing
}
@Override
public void onEndOfSpeech() {
Log.d(TAG,"End of Speech");
// do nothing
}
@Override
public void onPartialResult(Hypothesis arg0) {
if( arg0 != null){
Log.d(TAG, "Partial results list: " + arg0.getHypstr());
isCommand = false;
// handle recognition results for keywords
for( String command : this.getCurrentCommands() ) {
if (arg0.getHypstr().contains(command)) {
this.onRecognition(arg0.getHypStr());
isCommand = true;
mRecognizer.stop();
}
}
// call stop, and let onResults() handle grammar results
if( arg0.getHypstr().contains(Command.STOP_WORD))
mRecognizer.stop();
}
}
@Override
public void onResult(Hypothesis results) {
String data;
if( results == null ){
data = null;
}else{
data = results.getHypstr();
}
Log.d(TAG,"Final results: " + data );
// handle grammar recognition results
if( !isCommand ){
this.onRecognition(data);
}
return;
}
没有"refresh rate"这样的东西。识别精度下降可能是因为背景中有一些噪音并且没有被正确过滤掉。您可以研究原始转储以调查沉默是否算作讲话。您可以共享原始音频转储以获得有关此问题的帮助。
你的代码中有些地方不太合理。如果您仅使用关键字识别,则无需像现在这样在 onEndOfSpeech 中停止并重新启动识别器,您可以跳过它。在定位模式下,您无需等待语音结束即可获得结果,您可以只使用部分结果来调用操作并重新启动识别器。