Android语音识别器未连接到识别服务。

3
我希望在我的Android应用程序中加入永久语音识别功能。
我知道在Android 4.1.1和4.2上,语音识别会不时地出现卡顿的问题,因此我设置了一个计时器,定期检查语音识别是否还在运行。如果它没有运行,我就停止它并重新启动。但是,不幸的是,在某个时候当它尝试重新启动语音识别器时,会出现类似这样的问题:
SpeechRecognizer not connected to the recognition service

在 onError 回调函数中,我收到错误代码 8(文档称为:ERROR_RECOGNIZER_BUSY),尽管在启动语音识别器之前我停止了所有计时器。
代码如下:
public class MainActivity extends Activity {
private SpeechRecognizer mSpeechRecognizer;
private RecognitionListener mRecognitionListener;

private Intent mi;
private boolean isSpeechRecognizerAlive;
Timer myTimer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mi = new Intent(getApplicationContext(), MyService.class);

    mRecognitionListener = new RecognitionListener(){

        @Override
        public void onRmsChanged(float rmsdB) {
        }

        @Override
        public void onResults(Bundle results) {
            Log.e("recognizer listener", "onResults");

            ArrayList<String> result = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            for(int i=0;i<result.size();i++){
                Log.e(String.valueOf(i), result.get(i));
            }

            startRecognition(new View(getApplicationContext()));
        }

        @Override
        public void onReadyForSpeech(Bundle params) {
            Log.e("recognizer listener", "onReadyForSpeech");
        }

        @Override
        public void onPartialResults(Bundle partialResults) {
            Log.e("recognizer listener", "onPartialResults");
        }

        @Override
        public void onEvent(int eventType, Bundle params) {
            Log.e("recognizer listener", "onEvent");
        }

        @Override
        public void onError(int error) {
            Log.e("recognizer listener", "onError: " + String.valueOf(error));

            isSpeechRecognizerAlive = false;
        }

        @Override
        public void onEndOfSpeech() {
            Log.e("recognizer listener", "onEndOfSpeech");
        }

        @Override
        public void onBufferReceived(byte[] buffer) {
            Log.e("recognizer listener", "onBufferReceived");
        }

        @Override
        public void onBeginningOfSpeech() {
            Log.e("recognizer listener", "onBeginningOfSpeech");
            isSpeechRecognizerAlive = true;
        }

    };

    new CheckRecognizer().execute("");
}

private void checkIfRecognizerAslive(){
    Log.e("check", "check");
    if(!isSpeechRecognizerAlive){
        Log.e("check1", "check1");
        stopRecognition(new View(getApplicationContext()));
        startRecognition(new View(getApplicationContext()));
    }
}

@Override
protected void onResume() {
    super.onResume();
    Log.e("Start", "service");
}

@Override
protected void onPause() {
    super.onPause();
    Log.e("Stop", "service");
}


public void startRecognition(View view){
    Log.e("MainActivity", "startRecognition");
    isSpeechRecognizerAlive = false;
    mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(getApplicationContext());
    mSpeechRecognizer.setRecognitionListener(mRecognitionListener);
    mSpeechRecognizer.startListening(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH));
}

public void stopRecognition(View view){
    Log.e("MainActivity", "stopRecognition");
    if(mSpeechRecognizer != null){
        mSpeechRecognizer.stopListening();
        mSpeechRecognizer.cancel();
        mSpeechRecognizer.destroy();
        mSpeechRecognizer = null;
    }
}

private class CheckRecognizer extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {

        myTimer = new Timer();
        myTimer.schedule(new TimerTask() {          
            @Override
            public void run() {
                publishProgress();
            }

        }, 0, 4000);


        return "";
    }

    @Override
    protected void onPostExecute(String result) {

    }

    @Override
    protected void onPreExecute() {}

    @Override
    protected void onProgressUpdate(Void... values) {
        checkIfRecognizerAslive();
    }
}

我真的不知道我做错了什么。你能帮我找出问题吗?或者有人知道为什么即使我销毁了语音识别器,它仍然忙碌吗?欢迎任何建议。如果您对如何在Android上进行永久语音识别有其他建议,那将是非常好的。非常感谢!

1个回答

0
当监听器在开始监听后调用cancel()时,似乎这将总是导致RecognitionListener.onError()
   18:43:01.842 native                    W  W0209 18:43:01.841218   26262 soda_async_impl.cc:861] SODA stopped processing audio, mics audio processed in millis: 2000, loopback audio processed in millis: 0
   18:43:01.845 A                         W  #onError space agsa_transcription_CANCELLED code -1!
   18:43:01.852                           W  Recognizer network error
                                             io.grpc.StatusException: CANCELLED
                                                at io.grpc.Status.asException(SourceFile:1)
                                                at com.google.android.apps.search.transcription.g.am.e(SourceFile:1)
                                                at com.google.android.apps.search.transcription.g.am.d(SourceFile:3)
                                                at com.google.android.apps.search.transcription.g.am.a(SourceFile:2)
                                                at com.google.android.apps.search.transcription.g.ac.a(SourceFile:1)
                                                at com.google.android.apps.search.transcription.g.av.a(SourceFile:2)
                                                at com.google.android.voicesearch.serviceapi.GoogleRecognitionService.onCancel(SourceFile:10)
                                                at android.speech.RecognitionService.dispatchCancel(RecognitionService.java:146)
                                                at android.speech.RecognitionService.-wrap1(Unknown Source:0)
                                                at android.speech.RecognitionService$1.handleMessage(RecognitionService.java:88)
                                                at android.os.Handler.dispatchMessage(Handler.java:106)
                                                at android.os.Looper.loop(Looper.java:176)
                                                at android.app.ActivityThread.main(ActivityThread.java:6662)
                                                at java.lang.reflect.Method.invoke(Native Method)
                                                at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
   18:43:01.855                           I  #markBufferClosed, read 64000 bytes
   18:43:01.856                           I  Audio focus releasing status: RELEASED
   18:43:01.856                           W  #read failed: read EOF from AudioAccessor.
   18:43:01.857                           W  #read failed: read EOF from AudioAccessor.
   18:43:01.857                           I  Sending end of audio to Soda.
   18:43:01.862                           I  startDetection successful
   18:43:01.863 native                    W  W0209 18:43:01.863233   26262 hybrid_selector_impl.cc:141] No active session.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接