Прослушивание на голосовую команду в фоновом режиме на Андроид?
Стоит задача реализовать прослушку голосовых команд бесконечно долго (пока телефон работает, что логично). Если пользователь произносит команду Х, то происходит какое-то действие. Принципиально чтобы эта прослушка работала даже тогда, когда телефон лежит с выключенным экраном на столе. Каким-то образом Google Assistant это сделал со своим "Ок, Гугл".
Я уже попробовал стандартный SpeechRecognizer, но он не может слушать бесконечно. Пробовал создать цикл, чтобы прослушка запускалась заново, однако это уже получается костыль и есть небольшой промежуток времени, когда программа не слушает вообще. Пробовал также cmu sphinx - тоже не подошло. Наличие или отсутствие интернета для работы программы не принципиально. Есть ли готовые решения или как это реализовать самому?
Ответы (1 шт):
Можно изменить некоторые параметры данного функционала, например:
EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS- Время, которое должно пройти после того, как слушатель прекратит слушать речь, чтобы считать ввод завершеннымEXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS- Минимальная длина высказывания, запись не прекратится до этого времениEXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS- Время, которое должно пройти после того, как слушатель прекратит слышать речь, чтобы считать ввод, возможно, завершенным
Вот есть документация по данным методам. Так же можно в случае ошибки начинать прослушивание снова:
@Override
public void onError(int error) {
String errorMessage = getErrorText(error);
Log.i(Constants.TAG, "FAILED " + errorMessage);
speech.destroy();
speech = null;
StartListening();
}
private void StartListening() {
speech = SpeechRecognizer.createSpeechRecognizer(this);
speech.setRecognitionListener(this);
recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en");
recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName());
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3);
//if setting.SpeechEnable
speech.startListening(recognizerIntent);
}