Il VoiceInputIndicator è un componente Jetpack Compose Glimmer che
mostra all'utente l'attività audio. Puoi utilizzare questo componente per accettare l'input vocale o altro audio e fornire un feedback visivo per indicare che la tua app sta acquisendo l'audio.
Questo componente è strettamente un elemento visivo. Non registra l'audio né elabora i dati del microfono da solo. Risponde invece a un level audio fornito dalla tua app, che mostra una rappresentazione visiva dell'intensità dell'audio.
Richiedere le autorizzazioni proiettate
Per acquisire i dati audio per l'indicatore, la tua app ha bisogno dell'autorizzazione
Manifest.permission.RECORD_AUDIO.
Quando crei esperienze aumentate per gli occhiali con display, assicurati di richiedere le autorizzazioni correttamente sia sul dispositivo sia sugli occhiali. Utilizza
ProjectedPermissionsResultContract e
ProjectedPermissionsRequestParams per richiedere l'autorizzazione all'utente.
Per ulteriori informazioni sulla richiesta di autorizzazioni negli ambienti proiettati, vedi Richiedere le autorizzazioni hardware.
Acquisire e normalizzare l'audio
Il VoiceInputIndicator richiede un Float compreso tra 0.0f e 1.0f per
riflettere visivamente l'intensità dell'audio. Poiché funziona esclusivamente come componente visivo e non acquisisce l'audio, la tua app deve monitorare attivamente il microfono e trasmettere in streaming il volume al parametro level dell'indicatore.
Esistono diversi modi per acquisire i dati audio, ma un approccio consiste nell'
utilizzare l'API SpeechRecognizer. Quando utilizzi SpeechRecognizer, puoi acquisire gli aggiornamenti del volume in tempo reale utilizzando il
RecognitionListener.onRmsChanged callback, che fornisce il livello audio in decibel, rmsdB.
Poiché questo valore grezzo in genere è compreso tra 0 e 10, devi normalizzare l'output nell'intervallo richiesto da 0.0f a 1.0f. Puoi mantenere questo livello normalizzato in una variabile di stato per aggiornare continuamente l'indicatore.
Ecco un esempio di utilizzo di un RecognitionListener per aggiornare una variabile di stato:
// Example state variable to hold the normalized level (0.0 to 1.0) // that the VoiceInputIndicator component expects. val audioLevel = MutableStateFlow(0f) // Initialize the Android SpeechRecognizer val speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context) // Listener to capture speech events and audio level changes val listener = object : RecognitionListener { override fun onRmsChanged(rmsdB: Float) { // Normalize raw dB level to a 0.0-1.0 range. // Android SpeechRecognizer's rmsdB typically ranges from 0 to ~10. audioLevel.value = ((rmsdB - 1f) / 9f).coerceIn(0f, 1f) } // ... Implement other required RecognitionListener methods ... override fun onReadyForSpeech(params: Bundle?) {} override fun onBeginningOfSpeech() {} override fun onEndOfSpeech() {} override fun onError(error: Int) {} override fun onResults(results: Bundle?) {} override fun onPartialResults(partialResults: Bundle?) {} override fun onEvent(eventType: Int, params: Bundle?) {} override fun onBufferReceived(buffer: ByteArray?) {} } // Attach the listener to the recognizer speechRecognizer.setRecognitionListener(listener) // Create an intent to specify the recognition model and behavior val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply { putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM) } // Begin listening for audio input speechRecognizer.startListening(intent)
Integrare l'indicatore di input vocale
Una volta che il flusso audio è normalizzato ed esposto correttamente come stato, puoi passarlo direttamente a VoiceInputIndicator.
@Composable fun VoiceInputExample(modifier: Modifier) { // Collect the flow as Compose State so the UI reacts to changes in real-time. val currentLevel by audioLevel.collectAsState() VoiceInputIndicator( // The VoiceInputIndicator component provides a visual "pulse" or indicator // that changes based on the 'level' lambda, which returns a Float between 0.0 and 1.0. level = { currentLevel }, modifier = modifier ) }
Parametri di personalizzazione
Il VoiceInputIndicator fornisce alcuni parametri per personalizzare il suo
comportamento e l'aspetto:
level: una funzione che restituisce un valoreFloatche rappresenta il livello dell'input vocale, da0.0per il silenzio a1.0per il suono più forte.indicatorColor: il colore delle barre dell'indicatore. Per impostazione predefinita, utilizza il colore principale del tema Glimmer; vediGlimmerTheme.colors.primary.modifier: ilmodifierstandard di Compose da applicare all' indicatore.
Componenti correlati
Se la tua UI richiede che l'indicatore si trovi all'interno di un contenitore di sfondo visibile,
utilizza ContainedVoiceInputIndicator. Questa alternativa garantisce che le barre dell'indicatore siano trasparenti, consentendo la visualizzazione del contenitore di sfondo.