Android Speech Recognition Continuous Service

后端 未结 2 1984
面向向阳花
面向向阳花 2020-11-27 02:59

I\'m trying to create a service to run continuous speech recognition in Android 4.2. Using the answer from this link ( Android Speech Recognition as a service on Android 4.

相关标签:
2条回答
  • 2020-11-27 03:26

    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)
  • 2020-11-27 03:35

    Class members in MainActivity

    private int mBindFlag;
    private Messenger mServiceMessenger;
    

    Start service in onCreate()

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    
        Intent service = new Intent(activityContext, VoiceCommandService.class);
        activityContext.startService(service);
        mBindFlag = Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH ? 0 : Context.BIND_ABOVE_CLIENT;
    
    }
    

    Bind service in onStart()

    @Override
    protected void onStart()
    {
        super.onStart();
    
        bindService(new Intent(this, VoiceCommandService.class), mServiceConnection, mBindFlag);
    }
    
    @Override
    protected void onStop()
    {
        super.onStop();
    
        if (mServiceMessenger != null)
        {
            unbindService(mServiceConnection);
            mServiceMessenger = null;
        }
    }
    

    mServiceConnection member

    private final ServiceConnection mServiceConnection = new ServiceConnection()
    {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service)
        {
            if (DEBUG) {Log.d(TAG, "onServiceConnected");} //$NON-NLS-1$
    
            mServiceMessenger = new Messenger(service);
            Message msg = new Message();
            msg.what = VoiceCommandService.MSG_RECOGNIZER_START_LISTENING; 
    
            try
            {
                mServiceMessenger.send(msg);
            } 
            catch (RemoteException e)
            {
                e.printStackTrace();
            }
        }
    
        @Override
        public void onServiceDisconnected(ComponentName name)
        {
            if (DEBUG) {Log.d(TAG, "onServiceDisconnected");} //$NON-NLS-1$
            mServiceMessenger = null;
        }
    
    }; // mServiceConnection
    

    In the service

    @Override
    public IBinder onBind(Intent intent)
    {
        Log.d(TAG, "onBind");  //$NON-NLS-1$
    
        return mServerMessenger.getBinder();
    }
    
    0 讨论(0)
提交回复
热议问题