Perolan
Perolan

Reputation: 19

Android Speech Recognizer No Longer Working Offline

I've seen some posts that seem similar, but they're all fairly old and slightly different. I have an app whose codebase I have not touched in a long time. It makes use of the android SpeechRecognizer Service, and has a toggle for the EXTRA_PREFER_OFFLINE intent param. Previously this was working with no issues, but since I've recently dusted it off I noticed that offline functionality immediately returns with error code 7 NO_MATCH.

I have confirmed that offline language packs are installed, and wrote some stand alone code to test SpeechRecognizer outside my larger code base.

I've not been able to find any documented solutions for the NO_MATCH error, but surely it must occur elsewhere.

For context: This was previously working last year/earlier this year (I've seen people claim this wasn't possible after 2015/17) and on Android 8

Sample code snippet:

 speechRecognizer = SpeechRecognizer.createSpeechRecognizer(getContext());

    final Intent speechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
    speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, true);
    speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "en-US");

    speechRecognizer.setRecognitionListener(new RecognitionListener() {
        @Override
        public void onReadyForSpeech(Bundle bundle) {
            listening = true;
            label.setText(R.string.listening_true);
        }

        @Override
        public void onBeginningOfSpeech() {
        }

        @Override
        public void onRmsChanged(float v) {
        }

        @Override
        public void onBufferReceived(byte[] bytes) {
        }

        @Override
        public void onEndOfSpeech() {
            label.setText(R.string.listening_false);
            listening = false;
        }

        @Override
        public void onError(int i) {
            Log.e(TAG, "Error code " + i);
            label.setText(R.string.listening_false);
            listening = false;
        }

        @Override
        public void onResults(Bundle bundle) {
            ArrayList<String> data = bundle.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            if (data != null && data.size() > 0) {
                resultsTextView.setText(data.get(0));
                resultsTextView.setTextColor(getResources().getColor(R.color.colorAccent));
                listening = false;
            }
        }

        @Override
        public void onPartialResults(Bundle bundle) {
            ArrayList<String> data = bundle.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            if (data != null && data.size() > 0) {
                Log.i(TAG, "how many partial results? " + data.size());
                resultsTextView.setText(data.get(0));
                resultsTextView.setTextColor(getResources().getColor(R.color.design_default_color_primary));
                Log.i(TAG, "Partial results: " + data);
            }
        }

        @Override
        public void onEvent(int i, Bundle bundle) {
        }
    });


    view.findViewById(R.id.button_mic).setOnClickListener(view1 -> {
        if (!listening) {
            speechRecognizer.startListening(speechRecognizerIntent);
        } else {
            speechRecognizer.stopListening();
        }
    });

Upvotes: 0

Views: 2390

Answers (2)

  • Google app's voice input could work offline previously, but unfortunately, this feature has been removed since version 11 (released in March 2020).
  • Thus, to use this feature, we have to keep the version of Google app on device at 10.99.8 or older.
  • However, on some new device released after March 2020, the pre-installed version of Google app is already 11 or 12, so it is not a simple task to downgrade it to an older version.
  • So we need to use adb command to downgrade it from PC. This command will try to force downgrade the app for the 'current user': adb install -r -d --user 0 google.apk

Upvotes: 5

Perolan
Perolan

Reputation: 19

The answer is that this is no loner supported. If you need a short term fix then go to your "Google", not "Google Play Services", app and uninstall updates from the hamburger menu. This seems to downgrade a lot of libraries, including the voice recognition stuff.

A possibility might be to manually bring and load your own libraries, but I haven't tested this personally.

Upvotes: 0

Related Questions