Indicatore di input vocale in Jetpack Compose Glimmer

Dispositivi XR applicabili
Queste indicazioni ti aiutano a creare esperienze per questi tipi di dispositivi XR.
Occhiali con display

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.

Figura 1. Un esempio di VoiceInputIndicator.

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 valore Float che rappresenta il livello dell'input vocale, da 0.0 per il silenzio a 1.0 per il suono più forte.
  • indicatorColor: il colore delle barre dell'indicatore. Per impostazione predefinita, utilizza il colore principale del tema Glimmer; vedi GlimmerTheme.colors.primary.
  • modifier: il modifier standard di Compose da applicare all' indicatore.

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.