как запустить службу прослушивания и распознавания в фоновом режиме все время Android

#java #android #service #speech-recognition

#java #Android #Обслуживание #распознавание речи

Вопрос:

Я хочу разрабатывать приложение, которое слушает пользователя каждый раз, когда и когда ключевое слово говорит, что что-то делает.
для этого я использовал vosk-api
Я объявляю IntentService . в настоящее время, когда пользователь нажимает на swich botton в нижней навигации, служба останавливается. Как я могу постоянно запускать службу в фоновом режиме, например ok google ? код:

 public class MainActivity extends AppCompatActivity {

private static final int PERMISSIONS_REQUEST_RECORD_AUDIO = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Check if user has given permission to record audio
    int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.RECORD_AUDIO);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, PERMISSIONS_REQUEST_RECORD_AUDIO);
        return;
    }

}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == PERMISSIONS_REQUEST_RECORD_AUDIO) {
        if (grantResults.length > 0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Intent intent = new Intent(this, MyIntentService.class);
            startService(intent);
        } else {
            Log.e("MainActivity", "RECORD_AUDIO not allowed");
        }
    }
}

public class MyIntentService extends IntentService {

private SpeechService speechService;
private Model model;

public MyIntentService() {
    super("MyIntentService");
}


@Override
protected void onHandleIntent(@Nullable Intent intent) {
    initRecognizer();

    speechService.addListener(new RecognitionListener() {
        @Override
        public void onPartialResult(String s) {
            Log.d("MyIntentService", s   "n");
            if (s.contains("me"))
                Toast.makeText(getApplicationContext(), "coollll!!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onResult(String s) {
            Log.d("MyIntentService", s   "n");
            if (s.contains("me"))
                Toast.makeText(getApplicationContext(), "coollll!!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(Exception e) {
            Log.d("MyIntentService", "Error");
        }

        @Override
        public void onTimeout() {
            speechService.cancel();
            speechService = null;
            Log.d("MyIntentService", "onTimeout");
        }
    });
    speechService.startListening();

}

public void initRecognizer(){
    Assets assets;
    try {
        assets = new Assets(getApplicationContext());
        File assetDir = assets.syncAssets();
        model = new Model(assetDir.toString()   "/model-android");
        KaldiRecognizer rec = new KaldiRecognizer(model, 16000.0f);
        speechService = new SpeechService(rec, 16000.0f);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  

}

Спасибо!

Ответ №1:

Я сделал это, создав службу переднего плана, которая реализует RecognitionListener . Но я начал с vosk демонстрационного приложения.

Я вызываю initModel() внутри onCreate метода в службе. При обратном initModel вызове метода я вызываю recognizeMicrophone метод, который такой же, как в демонстрационном приложении.