Вы можете использовать автоматическое распознавание речи (ASR) для распознавания конкретных фраз пользователя с помощью SpeechRecognizer и преобразования их в текст. SpeechRecognizer встроен в Android (не требует дополнительных библиотек) и работает даже в автономном режиме.
Для того чтобы SpeechRecognizer мог преобразовывать речь пользователя в текст, пользователю необходимо предоставить вашему приложению разрешение RECORD_AUDIO . Чтобы узнать, как запросить это разрешение для вашего приложения, см. раздел «Запрос разрешений оборудования» .
Создать экземпляр SpeechRecognizer
Создайте экземпляр SpeechRecognizer в методе onCreate вашей проецируемой активности , чтобы он был доступен на протяжении всего времени существования активности:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//The RECORD_AUDIO permission must be granted to your app before instantiation
speechRecognizer = SpeechRecognizer.createOnDeviceSpeechRecognizer(this)
speechRecognizer?.setRecognitionListener(recognitionListener)
...
}
Настройте свой RecognitionListener
Метод setRecognitionListener позволяет указать объект, в котором выполняются важные обратные вызовы, например, в RecognitionListener.onResults , который система вызывает после распознавания речи.
val recognitionListener = object : RecognitionListener {
override fun onResults(results: Bundle?) {
val matches = results?.getStringArrayList(RESULTS_RECOGNITION)
val confidences = results?.getFloatArray(CONFIDENCE_SCORES)
val mostConfidentIndex = confidences!!.indices.maxByOrNull { confidences[it] }
if (mostConfidentIndex != null){
val spokenText = matches[mostConfidentIndex]
if (spokenText.equals("Start my Run", ignoreCase = true)){
// User indicated they want to start a run
}
}
}
...
}
Основные моменты, касающиеся кода.
Запрос к пакету данных выполняется по двум массивам. Первый массив содержит все совпадения, а второй — степень уверенности распознавателя речи в услышанном. Индексы этих массивов соответствуют друг другу. Используется совпадение с наивысшим значением уверенности (
mostConfidentIndex).Для определения желаемого действия пользователя выполняется сопоставление строк без учета регистра.
Альтернативные подходы при сопоставлении
В приведенном выше примере используется совпадение с наивысшим значением достоверности. Такой выбор означает, что система должна быть достаточно уверена в том, что она поняла от пользователя, иначе она не отметит совпадение. При использовании этого подхода могут возникать ложные отрицательные результаты.
Другой подход может заключаться в просмотре всех совпадений независимо от степени достоверности и поиске любого совпадения, соответствующего искомым входным данным. Однако такой подход может привести к большему количеству ложных срабатываний. Выбор подходящего подхода во многом зависит от конкретной задачи.
Начните слушать
Чтобы начать прослушивание пользователя, укажите интент ACTION_RECOGNIZE_SPEECH при вызове функции startListening .
override fun onStart() {
super.onStart()
val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
}
speechRecognizer?.startListening(intent)
}
Основные моменты, касающиеся кода.
- При использовании
ACTION_RECOGNIZE_SPEECHнеобходимо также указать дополнительный параметрEXTRA_LANGUAGE_MODEL. -
LANGUAGE_MODEL_FREE_FORMпредназначен для разговорной речи.