2017-07-28 48 views
3

我正在开发Android,并使用SpeechRecognizer来实现连续语音识别。为什么SpeechRecognizer在onEndOfSpeech被调用后启动时很忙?

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

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后开始已叫什么名字?

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

回答

1

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

因此,没有官方文档说明为什么Google会这样做,即使使用Google应用程序,也没有可用的连续语音识别。

为了克服这个问题,我们需要利用语音回调方法来抓住错误并再次尝试收听。我创建了一个专门用来克服这个超时问题的库,我认为它也可以满足您的需求。

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

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. 注意到恼人的蜂鸣声的护理声音如果有错误
+0

谢谢,我会试试! – Wun

+0

为什么在几次尝试后停止工作?还是我用它错了? – edwardffs

相关问题