我正在使用Android的语音API来不断获取用户的输入。但是,当发生错误时,这并不能很好地发挥作用。
我所做的是在检测错误的方法中重新启动侦听器。它有时会工作,但识别器会经常挂起一段时间。特别是在检测到服务器,网络超时和识别器忙碌错误后。这很烦人!
我找到了一些解决这个问题的尝试,但没有一个能为我工作。
你有更好的主意吗?
这是我的代码:
private void startSR(){
intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
//intent.putExtra(RecognizerIntent., value)
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, mContext.getPackageName());
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 10);
Log.d(TAG,"Speech recognition started!");
if (recognizer != null) {
recognizer = null;
mListener = null;
}
Log.d(TAG,"setRecognitionListener");
recognizer = SpeechRecognizer.createSpeechRecognizer(mContext);
mListener = new Listener();
recognizer.setRecognitionListener(mListener);
recognizer.startListening(intent);
}
class Listener implements RecognitionListener{
@Override
public void onBeginningOfSpeech() {
Log.i(TAG, "onBeginningOfSpeech");
mStatus = "Beginning speech";
}
@Override
public void onBufferReceived(byte[] buffer) {
Log.i(TAG, "onBufferReceived");
}
@Override
public void onEndOfSpeech() {
Log.i(TAG, "onEndOfSpeech");
mStatus = "Speech ended";
}
@Override
public void onEvent(int eventType, Bundle params) {
Log.i(TAG, "onEvent " + eventType);
}
@Override
public void onPartialResults(Bundle partialResults) {
Log.i(TAG, "onPartialResults");
mStatus = "Partial results";
}
@Override
public void onReadyForSpeech(Bundle params) {
Log.i(TAG, "onReadyForSpeech");
mReady = true;
mStatus = "Speech engine ready";
}
@Override
public void onRmsChanged(float rmsdB) {
// TODO Auto-generated method stub
}
@Override
public void onError(int error) {
// TODO Auto-generated method stub
mError = "";
mStatus = "Error detected";
switch (error) {
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
mError = " network timeout";
startListening();
break;
case SpeechRecognizer.ERROR_NETWORK:
mError = " network" ;
//toast("Please check data bundle or network settings");
return;
case SpeechRecognizer.ERROR_AUDIO:
mError = " audio";
break;
case SpeechRecognizer.ERROR_SERVER:
mError = " server";
startListening();
break;
case SpeechRecognizer.ERROR_CLIENT:
mError = " client";
break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
mError = " speech time out" ;
break;
case SpeechRecognizer.ERROR_NO_MATCH:
mError = " no match" ;
startListening();
break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
mError = " recogniser busy" ;
break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
mError = " insufficient permissions" ;
break;
}
Log.i(TAG, "Error: " + error + " - " + mError);
//startSR();
}
@Override
public void onResults(Bundle results) {
mStatus = "Got some results";
mResultAvailable = true;
String str = new String();
Log.d(TAG, "onResults " + results);
mResults = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
//mConfidences = results.getDoubleArray(SpeechRecognizer.CONFIDENCE_SCORES);
Log.i(TAG, toString());
startListening();
}
}// class Listener
public ArrayList<String> getResults(){
return mResults;
}
public void startListening(){
if (SpeechRecognizer.isRecognitionAvailable(mContext)) {
if (recognizer!=null){
recognizer.startListening(intent);
mResultAvailable = false;
mResults = new ArrayList<String>();
}
else
startSR();
}
}
答案 0 :(得分:2)
cancel
,然后致电startListening
startListening
答案 1 :(得分:2)
Intent RC = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
if (!RC.hasExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE))
{
RC.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.dummy");
}
sr.startListening(RC);
答案 2 :(得分:0)
尝试在错误发生后正确清理,例如在cancel
上致电destroy
或SpeechRecognizer
。
答案 3 :(得分:0)
我发帖很晚,但这可能对某人有所帮助。 我也面临同样的错误,&amp;也是在一段随机时间之后没有听, 我试过以下&amp;它对我有所帮助,尝试这样做,
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
recognizer.destroy();
startSR(); // As it destroys the current objects & calling startSR() will instantiate
// objects again