Puoi utilizzare il riconoscimento vocale automatico per riconoscere espressioni specifiche
del tuo utente utilizzando SpeechRecognizer e trasformarle in testo.
SpeechRecognizer è integrato in Android (senza richiedere librerie aggiuntive) e
funziona anche offline.
Affinché SpeechRecognizer possa convertire la voce dell'utente in testo, l'utente deve
concedere alla tua app l'autorizzazione RECORD_AUDIO. Per scoprire come richiedere
questa autorizzazione per la tua app, consulta Richiedere autorizzazioni hardware.
Instanzia SpeechRecognizer
Crea un'istanza di SpeechRecognizer nel metodo onCreate() dell'attività degli occhiali AI in modo che sia disponibile per tutta la durata dell'attività:
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)
...
}
Configura il tuo RecognitionListener
Il metodo setRecognitionListener() consente di specificare l'oggetto in cui
vengono effettuati callback importanti, ad esempio in RecognitionListener.onResults(),
che il sistema chiama dopo aver riconosciuto la lingua parlata.
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
}
}
}
...
}
Punti chiave sul codice
Viene eseguita una query sul bundle per due array. Il primo array include tutte le corrispondenze, mentre il secondo indica il livello di certezza del sistema di riconoscimento vocale in merito a ciò che è stato ascoltato. Gli indici di queste matrici corrispondono tra loro. Viene utilizzata la corrispondenza con il valore di confidenza più alto (
mostConfidentIndex).Viene eseguita una corrispondenza di stringhe senza distinzione tra maiuscole e minuscole per determinare l'azione che l'utente vuole intraprendere.
Approcci alternativi per la corrispondenza
Nell'esempio precedente, viene utilizzata la corrispondenza con il valore di confidenza più alto. Questa scelta significa che il sistema deve essere abbastanza sicuro di ciò che ha compreso dall'utente, altrimenti non segnalerà una corrispondenza. Quando utilizzi questo approccio, potresti ottenere falsi negativi.
Un altro approccio potrebbe essere quello di esaminare tutte le corrispondenze indipendentemente dal livello di confidenza e trovare qualsiasi corrispondenza che corrisponda all'input che stai cercando. Al contrario, questo tipo di approccio potrebbe portare a un numero maggiore di falsi positivi. L'approccio da adottare dipende in gran parte dal tuo caso d'uso.
Inizia l'ascolto
Per iniziare ad ascoltare l'utente, specifica l'intent ACTION_RECOGNIZE_SPEECH
quando chiami 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)
}
Punti chiave sul codice
- Quando utilizzi
ACTION_RECOGNIZE_SPEECH, devi specificare anche l'extraEXTRA_LANGUAGE_MODEL. LANGUAGE_MODEL_FREE_FORMè destinato al linguaggio colloquiale.