Możesz użyć automatycznego rozpoznawania mowy (ASR), aby rozpoznawać konkretne wypowiedzi
użytkownika za pomocą SpeechRecognizer i przekształcać je w tekst.
SpeechRecognizer jest wbudowany w Androida (nie wymaga dodatkowych bibliotek) i działa nawet offline.
Aby SpeechRecognizer mógł przekształcić mowę użytkownika w tekst, użytkownik musi
przyznać Twojej aplikacji uprawnienie RECORD_AUDIO. Aby dowiedzieć się, jak poprosić
o to uprawnienie w aplikacji, przeczytaj artykuł Prośba o uprawnienia do sprzętu.
Tworzenie instancji SpeechRecognizer
Utwórz instancję SpeechRecognizer w metodzie przewidywanego działania
onCreate, aby była dostępna przez cały czas trwania
działania:
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)
...
}
Konfigurowanie RecognitionListener
Metoda setRecognitionListener umożliwia określenie obiektu, w którym
są wykonywane ważne wywołania zwrotne, np. w RecognitionListener.onResults,
które system wywołuje po rozpoznaniu mowy.
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
}
}
}
...
}
Najważniejsze informacje o kodzie
W pakiecie wysyłane są zapytania o 2 tablice. Pierwsza tablica zawiera wszystkie dopasowania, a druga – pewność rozpoznawania mowy co do tego, co zostało usłyszane. Indeksy tych tablic odpowiadają sobie. Używane jest dopasowanie z najwyższym poziomem ufności (
mostConfidentIndex).Aby określić, jakie działanie chce wykonać użytkownik, przeprowadzane jest dopasowanie ciągów znaków bez uwzględniania wielkości liter.
Alternatywne metody dopasowywania
W poprzednim przykładzie używane jest dopasowanie z najwyższym poziomem ufności. Oznacza to, że system musi być dość pewny tego, co zrozumiał od użytkownika, aby oznaczyć dopasowanie. W przypadku tej metody mogą wystąpić fałszywe negatywy.
Innym rozwiązaniem może być przejrzenie wszystkich dopasowań niezależnie od pewności i znalezienie dopasowania, które pasuje do szukanych danych wejściowych. Z kolei takie podejście może prowadzić do większej liczby fałszywych alarmów. Metoda, którą należy zastosować, zależy w dużej mierze od przypadku użycia.
Zacznij słuchać
Aby zacząć słuchać użytkownika, podczas wywoływania startListening określ ACTION_RECOGNIZE_SPEECH
intencję.
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)
}
Najważniejsze informacje o kodzie
- W przypadku używania
ACTION_RECOGNIZE_SPEECHmusisz też określić dodatkowy elementEXTRA_LANGUAGE_MODEL. LANGUAGE_MODEL_FREE_FORMjest przeznaczony do mowy konwersacyjnej.