在调用onEndOfSpeech之后启动它时,为什么SpeechRecognizer会忙?

时间:2017-07-28 06:21:11

标签: android speech-recognition

我正在开发Android并使用SpeechRecognizer来实现连续语音识别。

通过以下代码开始语音识别后:

private void startListening(){
    recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en");
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getActivity().getPackageName());
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS,Long.valueOf(3000L));
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1);
}

在调用startListening()时再次致电onEndOfSpeech

onError将被调用,并显示SpeechRecognizer.ERROR_RECOGNIZER_BUSY

Q1: 在调用SpeechRecognizer后启动onEndOfSpeech时,为什么addtohomescreen.php正忙?

Q2 如何实现连续语音识别的方法?

1 个答案:

答案 0 :(得分:1)

Android语音识别库的设计使得在广泛使用时最终会出现超时。

因此,没有官方文档说明谷歌为何会这样做,即使使用谷歌应用程序,也没有连续的语音识别功能。

为了解决这个问题,我们需要使用语音回调方法来捕获错误并再次尝试收听。我专门创建了一个库以克服这个超时问题,我认为它也符合你的目的。

前往Github - DroidSpeech并将库添加到您的项目中克隆它或者您可以使用gradle依赖。一旦添加了初始化Droid Speech并设置了如下所述的监听器,

DroidSpeech droidSpeech = new DroidSpeech(this, null);
droidSpeech.setOnDroidSpeechListener(this);

要开始收听用户,请拨打以下代码,

droidSpeech.startDroidSpeechRecognition();

您将在侦听器方法中获得语音结果

@Override
public void onDroidSpeechFinalResult(String finalSpeechResult, boolean droidSpeechWillListen)
{
  // Do whatever you want with the speech result
}

这个库的不同之处在于

  1. 在发出每个单词后提供持续的语音识别支持,
  2. 你不必担心演讲忙碌和超时错误,因为图书馆会处理这个错误并确保它完全消除这个问题,
  3. 除了初始化库和设置监听器方法之外,您不必编写任何特定于语音识别的代码行,
  4. 如果需要,可以负责向用户询问麦克风权限
  5. 如果出现错误
  6. ,请注意烦人的嘟嘟声