Error ERROR_RECOGNIZER_BUSY with offline speech recognition
Asked Answered
S

2

11

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
Stanislaus answered 30/9, 2015 at 12:33 Comment(3)
Hi finally i came to conclusion #17617494 here 1.Make sure the default offline Android Voice Recogniser is set to Google product not Samsung/Vlingo other 2.If you want offline u can make some slight hake. You will get data from partial result. It may or may not match your commandBiondo
3. Specifically request offline = true, makes controlling this feature available in APi 23(6.0 +) 4.EXTRA_PREFER_OFFLINE support is available u can see the link here developer.android.com/reference/android/speech/…Biondo
Long related #5811442Idonah
F
3

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

Fleecy answered 11/10, 2015 at 16:36 Comment(0)
C
0

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.

Cento answered 20/11, 2017 at 9:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.