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.
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 einenFloat-Wert zurückgibt, der den Pegel der Spracheingabe darstellt. Er reicht von0.0für Stille bis1.0für den lautesten Ton.indicatorColor: Die Farbe der Indikatorbalken. Standardmäßig wird die Primärfarbe aus dem Glimmer-Theme verwendet, sieheGlimmerTheme.colors.primary.modifier: Der Standard-Compose-modifier, der auf den Indikator angewendet werden soll.
Zugehörige Komponenten
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.