Mit der automatischen Spracherkennung (ASR) können Sie bestimmte Äußerungen Ihres Nutzers mithilfe von SpeechRecognizer erkennen und in Text umwandeln.
SpeechRecognizer ist in Android integriert (es sind keine zusätzlichen Bibliotheken erforderlich) und funktioniert auch offline.
Damit SpeechRecognizer die Sprache des Nutzers in Text umwandeln kann, muss der Nutzer Ihrer App die Berechtigung RECORD_AUDIO erteilen. Informationen zum Anfordern dieser Berechtigung für Ihre App
SpeechRecognizer instanziieren
Instanziieren Sie SpeechRecognizer in der Methode onCreate Ihrer projizierten Aktivität, damit sie für die gesamte Lebensdauer der Aktivität verfügbar ist:
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 konfigurieren
Mit der Methode setRecognitionListener können Sie das Objekt angeben, in dem wichtige Callbacks erfolgen, z. B. in RecognitionListener.onResults, das vom System aufgerufen wird, nachdem es gesprochene Sprache erkannt hat.
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
}
}
}
...
}
Wichtige Punkte zum Code
Das Bundle wird für zwei Arrays abgefragt. Das erste Array enthält alle Übereinstimmungen und das zweite das Konfidenzniveau des Spracherkenners für das, was gehört wurde. Die Indexe dieser Arrays entsprechen einander. Es wird die Übereinstimmung mit dem höchsten Konfidenzwert (
mostConfidentIndex) verwendet.Es wird ein String-Abgleich ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt, um zu ermitteln, welche Aktion der Nutzer ausführen möchte.
Alternative Ansätze beim Abgleich
Im vorherigen Beispiel wird die Übereinstimmung mit dem höchsten Konfidenzwert verwendet. Das bedeutet, dass das System sich ziemlich sicher sein muss, was es vom Nutzer verstanden hat, sonst wird keine Übereinstimmung gemeldet. Bei diesem Ansatz kann es zu fälschlicherweise negativen Ergebnissen kommen.
Eine andere Möglichkeit besteht darin, sich alle Übereinstimmungen unabhängig von der Wahrscheinlichkeit anzusehen und nach einer Übereinstimmung zu suchen, die zu der gewünschten Eingabe passt. Im Gegensatz dazu könnte diese Art von Ansatz zu mehr falsch positiven Ergebnissen führen. Die Vorgehensweise hängt weitgehend von Ihrem Anwendungsfall ab.
Jetzt reinhören
Wenn Sie dem Nutzer zuhören möchten, geben Sie beim Aufrufen von startListening die Absicht ACTION_RECOGNIZE_SPEECH an.
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)
}
Wichtige Punkte zum Code
- Wenn Sie
ACTION_RECOGNIZE_SPEECHverwenden, müssen Sie auchEXTRA_LANGUAGE_MODELangeben. LANGUAGE_MODEL_FREE_FORMist für die gesprochene Sprache gedacht.