Anzeige für Spracheingabe in Jetpack Compose Glimmer

XR‑Geräte, für die der Leitfaden gilt
Dieser Leitfaden hilft Ihnen dabei, Erlebnisse für die folgenden Arten von XR-Geräten zu entwickeln.
Displaybrillen

Der VoiceInputIndicator ist eine Jetpack Compose Glimmer-Komponente, die dem Nutzer die Audioaktivität anzeigt. Mit dieser Komponente können Sie Spracheingaben oder andere Audioinhalte akzeptieren und visuelles Feedback geben, um zu zeigen, dass Ihre App Audio aufnimmt.

Diese Komponente ist rein visuell. Sie nimmt keine Audioinhalte auf und verarbeitet keine Mikrofondaten. Stattdessen reagiert sie auf einen von Ihrer App bereitgestellten Audiopegel (level), der die Audiointensität visuell darstellt.

Abbildung 1. Beispiel für den VoiceInputIndicator

Projizierte Berechtigungen anfordern

Zum Erfassen von Audiodaten für die Anzeige benötigt Ihre App die Manifest.permission.RECORD_AUDIO Berechtigung.

Wenn Sie Augmented-Reality-Erlebnisse für Displaybrillen entwickeln, müssen Sie Berechtigungen sowohl auf dem Gerät als auch auf der Brille korrekt anfordern. Verwenden Sie ProjectedPermissionsResultContract und ProjectedPermissionsRequestParams, um den Nutzer aufzufordern.

Weitere Informationen zum Anfordern von Berechtigungen in projizierten Umgebungen, siehe Hardwareberechtigungen anfordern.

Audio aufnehmen und normalisieren

Der VoiceInputIndicator erfordert einen Float zwischen 0.0f und 1.0f, um die Audiointensität visuell darzustellen. Da er nur als visuelle Komponente fungiert und keine Audioinhalte aufnimmt, muss Ihre App das Mikrofon aktiv überwachen und die Lautstärke an den level-Parameter des Indikators streamen.

Es gibt mehrere Möglichkeiten, Audiodaten zu erfassen. Eine davon ist die Verwendung der SpeechRecognizer-API. Wenn Sie SpeechRecognizer verwenden, können Sie Echtzeit-Lautstärkeupdates mit dem RecognitionListener.onRmsChanged Callback erfassen, der den Audio pegel in Dezibel (rmsdB) liefert.

Da dieser Rohwert in der Regel zwischen 0 und 10 liegt, müssen Sie die Ausgabe auf den erforderlichen Bereich von 0.0f bis 1.0f normalisieren. Sie können diesen normalisierten Pegel in einer Statusvariablen speichern, um den Indikator kontinuierlich zu aktualisieren.

Hier ein Beispiel für die Verwendung eines RecognitionListener zum Aktualisieren einer Status variablen:

// 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)

Spracheingabeanzeige einbinden

Sobald Ihr Audiostream ordnungsgemäß normalisiert und als Status verfügbar gemacht wurde, können Sie ihn direkt an den VoiceInputIndicator übergeben.

@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
    )
}

Anpassungsparameter

Der VoiceInputIndicator bietet einige Parameter, mit denen Sie sein Verhalten und Aussehen anpassen können:

  • level: Eine Funktion, die einen Float-Wert zurückgibt, der den Pegel der Spracheingabe darstellt. Er reicht von 0.0 für Stille bis 1.0 für den lautesten Ton.
  • indicatorColor: Die Farbe der Indikatorbalken. Standardmäßig wird die Primärfarbe aus dem Glimmer-Theme verwendet, siehe GlimmerTheme.colors.primary.
  • modifier: Der Standard-Compose-modifier, der auf den Indikator angewendet werden soll.

Wenn der Indikator in Ihrer UI in einem sichtbaren Hintergrundcontainer platziert werden soll, verwenden Sie den ContainedVoiceInputIndicator. Bei dieser Alternative sind die Indikatorbalken transparent, sodass der Hintergrundcontainer durchscheinen kann.