Error ERROR_RECOGNIZER_BUSY with offline speech re

2019-01-09 12:13发布

问题:

I have made research on google offline speech recognition. but it works fine in google nexus 5(OS:-4.4) but same build if I implement in Samsung galaxy s5(OS:-5.0) it is not recognizing and it is showing this error:

8- ERROR_RECOGNIZER_BUSY.

Below is my code. By keeping this link as reference I have made a changes http://www.truiton.com/2014/06/android-speech-recognition-without-dialog-custom-activity/

Without internet voice must recognize. I have worked on Pocket sphinx but it take lot of side voice so client have rejected it.

public class VoiceRecognitionActivity extends Activity implements RecognitionListener {

    private TextView returnedText;
    private static ProgressBar progressBar;
    private static SpeechRecognizer speech = null;
    private static Intent recognizerIntent;
    private String LOG_TAG = "VoiceRecognitionActivity";
    private Button button1;
    Activity activity = VoiceRecognitionActivity.this;
    private TextView textView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        returnedText = (TextView) findViewById(R.id.textView1);
        textView2 = (TextView) findViewById(R.id.textView2);
        progressBar = (ProgressBar) findViewById(R.id.progressBar1);
        button1 = (Button) findViewById(R.id.button1);

         getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    //  toggleButton = (ToggleButton) findViewById(R.id.toggleButton1);

         PackageManager pm = getPackageManager();
         List<ResolveInfo> activities = pm.queryIntentActivities( new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
         if (activities.size() != 0) 
         {
             createSpeechAgain(VoiceRecognitionActivity.this);
         } 
         else 
         {
             textView2.setText("Recognizer_not_present");
         }




        button1.setOnClickListener(new OnClickListener() {          
            @Override
            public void onClick(View arg0) {

                speech.stopListening();
                speech.destroy();

                createSpeechAgain(VoiceRecognitionActivity.this);
            }
        });

    }

    private  void createSpeechAgain(VoiceRecognitionActivity voiceRecognitionActivity) {
        progressBar.setVisibility(View.INVISIBLE);
        speech = SpeechRecognizer.createSpeechRecognizer(voiceRecognitionActivity);
        speech.setRecognitionListener(voiceRecognitionActivity);
        recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en-US");
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, voiceRecognitionActivity.getPackageName());
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3);
        //recognizerIntent.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, Boolean.FALSE);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS, 20000);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 20000);
        // EXTRA_PREFER_OFFLINE

        progressBar.setVisibility(View.VISIBLE);
        progressBar.setIndeterminate(true);
        speech.startListening(recognizerIntent);

    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        /*if (speech != null) {
            speech.destroy();
            Log.i(LOG_TAG, "destroy");
        }*/

    }

    @Override
    public void onBeginningOfSpeech() {
        Log.i(LOG_TAG, "onBeginningOfSpeech");
        progressBar.setIndeterminate(false);
        progressBar.setMax(10);
    }

    @Override
    public void onBufferReceived(byte[] buffer) {
        Log.i(LOG_TAG, "onBufferReceived: " + buffer);
    }

    @Override
    public void onEndOfSpeech() {
        Log.i(LOG_TAG, "onEndOfSpeech");
        progressBar.setIndeterminate(false);
        progressBar.setVisibility(View.INVISIBLE);
        speech.stopListening();
    }

    @Override
    public void onError(int errorCode) {


        String errorMessage = getErrorText(errorCode);
        Log.d(LOG_TAG, "FAILED " + errorMessage);
        textView2.setText(errorMessage);


    }

    @Override
    public void onEvent(int arg0, Bundle arg1) {
        Log.i(LOG_TAG, "onEvent");
    }

    @Override
    public void onPartialResults(Bundle arg0) {
        Log.i(LOG_TAG, "onPartialResults");
    }

    @Override
    public void onReadyForSpeech(Bundle arg0) {
        Log.i(LOG_TAG, "onReadyForSpeech");
    }

    @Override
    public void onResults(Bundle results) {
        Log.i(LOG_TAG, "onResults");
        ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
        String text = "";
        for (String result : matches)
            text += result + "\n";

        returnedText.setText(text);
        Log.v(LOG_TAG, "onResults---> " + text);
        progressBar.setVisibility(View.VISIBLE);
        progressBar.setIndeterminate(true);
        speech.startListening(recognizerIntent);

    }

    @Override
    public void onRmsChanged(float rmsdB) {
        //Log.i(LOG_TAG, "onRmsChanged: " + rmsdB);
        progressBar.setProgress((int) rmsdB);
    }

    public String getErrorText(int errorCode) {
        String message;
        switch (errorCode) {
        case SpeechRecognizer.ERROR_AUDIO:
            message = "Audio recording error";
            Log.v("LOG_TAG", message);

            progressBar.setVisibility(View.VISIBLE);
            progressBar.setIndeterminate(true);
            speech.startListening(recognizerIntent);

            break;
        case SpeechRecognizer.ERROR_CLIENT:
            message = "Client side error";
            Log.v("LOG_TAG", message);

            progressBar.setVisibility(View.VISIBLE);
            progressBar.setIndeterminate(true);
            speech.startListening(recognizerIntent);

            break;
        case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
            message = "Insufficient permissions";

            Log.v("LOG_TAG", message);

            progressBar.setVisibility(View.VISIBLE);
            progressBar.setIndeterminate(true);
            speech.startListening(recognizerIntent);

            break;
        case SpeechRecognizer.ERROR_NETWORK:
            message = "Network error";
            Log.v("LOG_TAG", message);
            break;
        case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
            message = "Network timeout";
            Log.v("LOG_TAG", message);
            break;
        case SpeechRecognizer.ERROR_NO_MATCH:
            message = "No match";
            Log.v("LOG_TAG", message);

            progressBar.setVisibility(View.VISIBLE);
            progressBar.setIndeterminate(true);
            speech.startListening(recognizerIntent);

            break;
        case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
            message = "RecognitionService busy";

            Log.v("LOG_TAG", message);
            speech.stopListening();
            speech.destroy();

            createSpeechAgain(VoiceRecognitionActivity.this);

            break;
        case SpeechRecognizer.ERROR_SERVER:
            message = "error from server";
            Log.v("LOG_TAG", message);
            break;
        case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
            message = "No speech input";
            Log.v("LOG_TAG", message);


            progressBar.setVisibility(View.VISIBLE);
            progressBar.setIndeterminate(true);
            speech.stopListening();
            speech.destroy();

            createSpeechAgain(VoiceRecognitionActivity.this);

            break;
        default:
            message = "Didn't understand, please try again.";
            break;
        }
        return message;
    }
   }

Xml :-

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:src="@drawable/ic_launcher" />

    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/toggleButton1"
        android:layout_marginTop="28dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progressBar1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="47dp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/imageView1"
        android:layout_alignLeft="@+id/imageView1"
        android:text="Restart" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/button1"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="19dp"
        android:text="" />

    </RelativeLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.offlinegooglespeechtotext"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="19" />

    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".VoiceRecognitionActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Logcat:-

    09-30 18:05:54.732: D/ResourcesManager(3941): creating new AssetManager and set to /data/app/com.example.offlinegooglespeechtotext-2/base.apk
09-30 18:05:54.772: V/BitmapFactory(3941): DecodeImagePath(decodeResourceStream3) : res/drawable-xxhdpi-v4/sym_def_app_icon.png
09-30 18:05:54.772: V/BitmapFactory(3941): DecodeImagePath(decodeResourceStream3) : res/drawable-xxhdpi/ic_launcher.png
09-30 18:05:54.787: V/BitmapFactory(3941): DecodeImagePath(decodeResourceStream3) : res/drawable-xxhdpi-v4/ic_ab_back_holo_dark_am.png
09-30 18:05:54.797: V/BitmapFactory(3941): DecodeImagePath(decodeResourceStream3) : res/drawable-xxhdpi-v4/sym_def_app_icon.png
09-30 18:05:54.817: D/Activity(3941): performCreate Call secproduct feature valuefalse
09-30 18:05:54.817: D/Activity(3941): performCreate Call debug elastic valuetrue
09-30 18:05:54.827: D/OpenGLRenderer(3941): Render dirty regions requested: true
09-30 18:05:54.867: I/(3941): PLATFORM VERSION : JB-MR-2
09-30 18:05:54.867: I/OpenGLRenderer(3941): Initialized EGL, version 1.4
09-30 18:05:54.877: I/OpenGLRenderer(3941): HWUI protection enabled for context ,  &this =0xb39090d8 ,&mEglDisplay = 1 , &mEglConfig = -1282088012 
09-30 18:05:54.887: D/OpenGLRenderer(3941): Enabling debug mode 0
09-30 18:05:54.957: V/LOG_TAG(3941): No match
09-30 18:05:54.957: D/VoiceRecognitionActivity(3941): FAILED No match
09-30 18:05:54.982: I/Timeline(3941): Timeline: Activity_idle id: android.os.BinderProxy@24862afe time:5837375
09-30 18:05:55.607: I/VoiceRecognitionActivity(3941): onReadyForSpeech
09-30 18:05:55.947: I/VoiceRecognitionActivity(3941): onBeginningOfSpeech
09-30 18:05:57.252: I/VoiceRecognitionActivity(3941): onEndOfSpeech
09-30 18:05:57.322: V/LOG_TAG(3941): No match
09-30 18:05:57.322: D/VoiceRecognitionActivity(3941): FAILED No match
09-30 18:05:57.332: V/LOG_TAG(3941): No match
09-30 18:05:57.332: D/VoiceRecognitionActivity(3941): FAILED No match
09-30 18:05:57.347: V/LOG_TAG(3941): No match
09-30 18:05:57.347: D/VoiceRecognitionActivity(3941): FAILED No match
09-30 18:05:57.367: V/LOG_TAG(3941): RecognitionService busy
09-30 18:05:57.392: D/VoiceRecognitionActivity(3941): FAILED RecognitionService busy
09-30 18:05:57.392: E/SpeechRecognizer(3941): not connected to the recognition service
09-30 18:05:58.232: I/VoiceRecognitionActivity(3941): onReadyForSpeech
09-30 18:06:03.287: V/LOG_TAG(3941): No speech input
09-30 18:06:03.302: D/VoiceRecognitionActivity(3941): FAILED No speech input
09-30 18:06:03.302: E/SpeechRecognizer(3941): not connected to the recognition service

回答1:

ERROR_RECOGNIZER_BUSY is often thrown when you didn't close the SpeechRecognizer proprely. Yo probably are already using one instance of the SpeechRecognizer.

See this http://developer.android.com/reference/android/speech/SpeechRecognizer.html



回答2:

ERROR_RECOGNIZER_BUSY get thrown when you start your speech recognizer again when its already running. As in your code

case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
        message = "RecognitionService busy";

        Log.v("LOG_TAG", message);
        speech.stopListening();
        speech.destroy();

        createSpeechAgain(VoiceRecognitionActivity.this);

        break;

Simply edit your above code with

case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:

            break;

As there is no need to start it again it is already running. If you will start recognition again it will keep throwing same error. and it will go in loop.