猿问

Google语音识别超时

我正在开发基于语音识别的Android应用程序。


直到今天,一切都已经正常运行,并且及时运行,例如,我将启动语音识别器,开始讲话,并且在1到2秒钟内,应用程序就收到了结果。


这是一个非常可以接受的用户体验。


然后,今天我必须等待十秒或更长时间才能获得识别结果。


我尝试设置以下EXTRAS,但没有任何区别


RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS

RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS

RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS

我一直在不断更改我的应用程序,但是这些更改均与语音识别器无关。


我有什么方法可以减少语音识别器从切换onBeginningOfSpeech()到的时间onResults()?


这是花费多长时间的示例


07-01 17:50:20.839 24877-24877/com.voice I/Voice: onReadyForSpeech()

07-01 17:50:21.614 24877-24877/com.voice I/Voice: onBeginningOfSpeech()

07-01 17:50:38.163 24877-24877/com.voice I/Voice: onEndOfSpeech()


潇湘沐
浏览 948回答 3
3回答

慕的地8271018

这是Google'Now'V6.0.23。*版本的一个错误,并且在最新的V6.1.28。*中仍然存在。自V5.11.34。*版本发布以来,Google的实施SpeechRecognizer一直受到bug困扰。您可以使用此要旨来复制其中的许多内容。您可以使用此BugRecognitionListener来解决其中的一些问题。我已经直接向Now团队报告了这些内容,因此他们知道了,但是目前还没有任何修复的方法。Google Now没有外部错误跟踪器,因为它不是AOSP的一部分,所以恐怕您无济于事。正如您正确指出的那样,您详细介绍的最新错误几乎使它们的实现无法使用,从而忽略了用于控制语音输入时序的参数。根据文档:此外,根据识别器的实现,这些值可能不会起作用。这是我们应该期待的……如果您不讲话或发出任何可检测的声音,则识别将无限期继续。我目前正在创建一个项目来复制此新错误以及所有其他错误,我将继续转发并在此处链接。编辑 -我希望我可以创建一种变通办法,使用部分或不稳定结果的检测作为触发来知道用户仍在讲话。他们停止后,我可以recognizer.stopListening()在设定的时间段后手动致电。不幸的是,stopListening()它也被破坏了并且实际上并没有停止识别,因此没有解决方法。围绕上述尝试破坏销毁识别器并仅依靠部分结果直到该点(未销毁销毁识别onResults()器时)都无法产生可靠的实现,除非您只是使用关键字spotting即可。在Google修复此问题之前,我们无能为力。您唯一的出路是给apps-help@google.com发送电子邮件,报告问题,并希望他们收到的数量能对他们有所帮助。

慕姐4208626

注意!这仅在在线模式下有效。 启用听写模式并禁用部分结果:intent.putExtra("android.speech.extra.DICTATION_MODE", true);intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, false);在听写模式下,speechRecognizer仍会调用,onPartialResults()但是您应该将部分作为最终结果。

牧羊人nacy

更新:万一有人在设置语音识别时遇到麻烦,您可以使用Droid语音库,该库是我为克服android中的语音超时问题而构建的。我的应用完全依赖语音识别功能,而Google投下了炸弹。根据事物的外观,我相信至少在不久的将来不会解决此问题。就目前而言,我确实找到了一种解决方案,可以让Google语音识别按预期提供语音结果。注意:此方法与上述解决方案略有不同。此方法的主要目的是确保用户说出的整个单词都在onPartialResults()处捕获。在正常情况下,如果用户在给定的情况下说出多个单词,则响应时间太快,部分结果将常常不是只得到第一个单词,而是得到全部结果。因此,为确保每个单词都被onPartialResults()捕获,引入了一个处理程序来检查用户暂停延迟,然后过滤结果。还要注意,来自onPartialResults()的结果数组将经常只有一个项目。SpeechRecognizer userSpeech = SpeechRecognizer.createSpeechRecognizer(this);Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);speechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);speechIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName());speechIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);speechIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, ModelData.MAX_VOICE_RESULTS);Handler checkForUserPauseAndSpeak = new Handler(); Boolean speechResultsFound = false;userSpeech.setRecognitionListener(new RecognitionListener(){    @Override    public void onRmsChanged(float rmsdB)    {        // NA    }    @Override    public void onResults(Bundle results)    {        if(speechResultsFound) return;        speechResultsFound = true;        // Speech engine full results (Do whatever you would want with the full results)    }    @Override    public void onReadyForSpeech(Bundle params)    {        // NA    }    @Override    public void onPartialResults(Bundle partialResults)    {        if(partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION).size() > 0 &&                partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION).get(0) != null &&                !partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION).get(0).trim().isEmpty())        {            checkForUserPauseAndSpeak.removeCallbacksAndMessages(null);            checkForUserPauseAndSpeak.postDelayed(new Runnable()            {                @Override                public void run()                {                    if(speechResultsFound) return;                    speechResultsFound = true;                    // Stop the speech operations                    userSpeech.destroy();                    // Speech engine partial results (Do whatever you would want with the partial results)                }            }, 1000);        }    }    @Override    public void onEvent(int eventType, Bundle params)    {        // NA    }    @Override    public void onError(int error)    {        // Error related code    }    @Override    public void onEndOfSpeech()    {        // NA    }    @Override    public void onBufferReceived(byte[] buffer)    {        // NA    }    @Override    public void onBeginningOfSpeech()    {        // NA    }});userSpeech.startListening(speechIntent);
随时随地看视频慕课网APP

相关分类

Android
我要回答