我可以修改PocketSphinx的关键字识别器“刷新率”吗?

时间:2015-09-26 12:13:44

标签: android speech-recognition pocketsphinx

我在Android上运行PocketSphinx(版本5prealpha)。我正在使用文件定义的关键字识别器,由以下代码段指定(kwfile是关键字定义文件,mRecognizer是SpeechRecognizer的实例):

mRecognizer.addKeywordSearch(DESCRIPTOR, kwfile);

总体而言,在优化关键字阈值后,识别性能非常好。但是,如果我在一个关键词话语和下一个关键词话语之间等待一段任意时间(5秒到几分钟),则识别性能会受到第二个话语的影响。例如,我会说“关键字”,它将被识别。如果我等待不到5秒并再次说出“关键字”,则可能会识别出第二个话语(识别率超过95%)。但是,如果我等待15秒,识别率会急剧下降,低于50%。

我的假设是,当我第二次说出关键字时,识别器正处于刷新过程中 - 即介于Stop Recognition事件和Start Recognition事件之间,我的演讲超越那个事件。这是我的logcat的典型视图。请注意,5秒后,识别器会“刷新”。在大多数情况下,这大约每5秒发生一次。有时在“刷新”之间可能长达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

所以,我的问题是:我能做些什么来控制这个“刷新率”?这是由我在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;

        }

1 个答案:

答案 0 :(得分:0)

没有“刷新率”这样的东西。识别准确度下降可能是因为您在背景上有一些噪音并且没有正确滤除。您可以研究原始转储以调查沉默是否被视为语音。您可以共享原始音频转储以获得有关此问题的帮助。

在你的代码中有一些不太合理的东西。如果您仅使用关键字定位,则无需像现在这样在onEndOfSpeech中停止并重新启动识别器,您可以跳过它。在定位模式中,您无需等待语音结束即可获得结果,您只需使用部分结果来调用操作并重新启动识别器。