为了账号安全,请及时绑定邮箱和手机立即绑定

Google语音识别超时

Google语音识别超时

潇湘沐 2019-10-21 09:50:18
我正在开发基于语音识别的Android应用程序。直到今天,一切都已经正常运行,并且及时运行,例如,我将启动语音识别器,开始讲话,并且在1到2秒钟内,应用程序就收到了结果。这是一个非常可以接受的用户体验。然后,今天我必须等待十秒或更长时间才能获得识别结果。我尝试设置以下EXTRAS,但没有任何区别RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLISRecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLISRecognizerIntent.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()
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

这是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发送电子邮件,报告问题,并希望他们收到的数量能对他们有所帮助。


查看完整回答
反对 回复 2019-10-21
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

注意!这仅在在线模式下有效。 启用听写模式并禁用部分结果:


intent.putExtra("android.speech.extra.DICTATION_MODE", true);

intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, false);

在听写模式下,speechRecognizer仍会调用,onPartialResults()但是您应该将部分作为最终结果。


查看完整回答
反对 回复 2019-10-21
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

更新:


万一有人在设置语音识别时遇到麻烦,您可以使用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);


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 947 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信