Offline Speech Recognition In Android (JellyBean)

后端 未结 8 1139
天涯浪人
天涯浪人 2020-11-22 15:26

It looks as though Google has made offline speech recognition available from Google Now for third-party apps. It is being used by the app named Utter.

Has anyone se

相关标签:
8条回答
  • 2020-11-22 15:55

    I successfully implemented my Speech-Service with offline capabilities by using onPartialResults when offline and onResults when online.

    0 讨论(0)
  • 2020-11-22 15:55

    Working example is given below,

    MyService.class

    public class MyService extends Service implements SpeechDelegate, Speech.stopDueToDelay {
    
      public static SpeechDelegate delegate;
    
      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
        //TODO do something useful
        try {
          if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
            ((AudioManager) Objects.requireNonNull(
              getSystemService(Context.AUDIO_SERVICE))).setStreamMute(AudioManager.STREAM_SYSTEM, true);
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
    
        Speech.init(this);
        delegate = this;
        Speech.getInstance().setListener(this);
    
        if (Speech.getInstance().isListening()) {
          Speech.getInstance().stopListening();
        } else {
          System.setProperty("rx.unsafe-disable", "True");
          RxPermissions.getInstance(this).request(permission.RECORD_AUDIO).subscribe(granted -> {
            if (granted) { // Always true pre-M
              try {
                Speech.getInstance().stopTextToSpeech();
                Speech.getInstance().startListening(null, this);
              } catch (SpeechRecognitionNotAvailable exc) {
                //showSpeechNotSupportedDialog();
    
              } catch (GoogleVoiceTypingDisabledException exc) {
                //showEnableGoogleVoiceTyping();
              }
            } else {
              Toast.makeText(this, R.string.permission_required, Toast.LENGTH_LONG).show();
            }
          });
        }
        return Service.START_STICKY;
      }
    
      @Override
      public IBinder onBind(Intent intent) {
        //TODO for communication return IBinder implementation
        return null;
      }
    
      @Override
      public void onStartOfSpeech() {
      }
    
      @Override
      public void onSpeechRmsChanged(float value) {
    
      }
    
      @Override
      public void onSpeechPartialResults(List<String> results) {
        for (String partial : results) {
          Log.d("Result", partial+"");
        }
      }
    
      @Override
      public void onSpeechResult(String result) {
        Log.d("Result", result+"");
        if (!TextUtils.isEmpty(result)) {
          Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
        }
      }
    
      @Override
      public void onSpecifiedCommandPronounced(String event) {
        try {
          if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
            ((AudioManager) Objects.requireNonNull(
              getSystemService(Context.AUDIO_SERVICE))).setStreamMute(AudioManager.STREAM_SYSTEM, true);
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (Speech.getInstance().isListening()) {
          Speech.getInstance().stopListening();
        } else {
          RxPermissions.getInstance(this).request(permission.RECORD_AUDIO).subscribe(granted -> {
            if (granted) { // Always true pre-M
              try {
                Speech.getInstance().stopTextToSpeech();
                Speech.getInstance().startListening(null, this);
              } catch (SpeechRecognitionNotAvailable exc) {
                //showSpeechNotSupportedDialog();
    
              } catch (GoogleVoiceTypingDisabledException exc) {
                //showEnableGoogleVoiceTyping();
              }
            } else {
              Toast.makeText(this, R.string.permission_required, Toast.LENGTH_LONG).show();
            }
          });
        }
      }
    
    
      @Override
      public void onTaskRemoved(Intent rootIntent) {
        //Restarting the service if it is removed.
        PendingIntent service =
          PendingIntent.getService(getApplicationContext(), new Random().nextInt(),
            new Intent(getApplicationContext(), MyService.class), PendingIntent.FLAG_ONE_SHOT);
    
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        assert alarmManager != null;
        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 1000, service);
        super.onTaskRemoved(rootIntent);
      }
    }
    

    For more details,

    https://github.com/sachinvarma/Speech-Recognizer

    Hope this will help someone in future.

    0 讨论(0)
提交回复
热议问题