VoiceInputIndicator to komponent Jetpack Compose Glimmer, który
wyświetla użytkownikowi aktywność dźwiękową. Możesz użyć tego komponentu, aby akceptować dane głosowe lub inne dźwięki i wyświetlać informacje wizualne wskazujące, że aplikacja rejestruje dźwięk.
Ten komponent jest wyłącznie elementem wizualnym. Nie nagrywa dźwięku ani nie przetwarza danych z mikrofonu. Zamiast tego reaguje na poziom dźwięku level przekazywany
przez aplikację, który pokazuje wizualną reprezentację intensywności dźwięku.
Wysyłanie prośby o uprawnienia do projekcji
Aby rejestrować dane audio na potrzeby wskaźnika, aplikacja potrzebuje uprawnienia
Manifest.permission.RECORD_AUDIO.
Podczas tworzenia rozszerzonych aplikacji na okulary z wyświetlaczem upewnij się, że prosisz o uprawnienia prawidłowo zarówno na urządzeniu, jak i na okularach. Aby wyświetlić prośbę do użytkownika, użyj
ProjectedPermissionsResultContract i
ProjectedPermissionsRequestParams.
Więcej informacji o wysyłaniu próśb o uprawnienia w środowiskach projekcji, zobacz Wysyłanie prośby o uprawnienia do sprzętu.
Rejestrowanie i normalizowanie dźwięku
Aby
wizualnie odzwierciedlić intensywność dźwięku, komponent VoiceInputIndicator wymaga wartości Float z zakresu od 0.0f do 1.0f. Ponieważ działa on wyłącznie jako komponent wizualny i nie rejestruje dźwięku, aplikacja musi aktywnie monitorować mikrofon i przesyłać głośność do parametru level wskaźnika.
Istnieje wiele sposobów rejestrowania danych audio, ale jednym z nich jest
użycie interfejsu API SpeechRecognizer. Gdy używasz SpeechRecognizer, możesz rejestrować aktualizacje głośności w czasie rzeczywistym za pomocą wywołania zwrotnego RecognitionListener.onRmsChanged, które podaje poziom dźwięku w decybelach, rmsdB.
Ponieważ ta wartość zwykle mieści się w zakresie od 0 do 10, musisz znormalizować dane wyjściowe do wymaganego zakresu od 0.0f do 1.0f. Możesz przechowywać ten znormalizowany poziom w zmiennej stanu, aby stale aktualizować wskaźnik.
Oto przykład użycia RecognitionListener do aktualizowania zmiennej stanu:
// 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)
Integracja wskaźnika głosowego wprowadzania tekstu
Gdy strumień audio zostanie prawidłowo znormalizowany i udostępniony jako stan, możesz przekazać
go bezpośrednio do 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 ) }
Parametry dostosowywania
VoiceInputIndicator udostępnia kilka parametrów, które pozwalają dostosować jego
działanie i wygląd:
level: funkcja zwracająca wartośćFloat, która reprezentuje poziom danych głosowych, od0.0dla ciszy do1.0dla najgłośniejszego dźwięku.indicatorColor: kolor pasków wskaźnika. Domyślnie używa koloru podstawowego z motywu Glimmer; zobaczGlimmerTheme.colors.primary.modifier: standardowy modyfikator Composemodifier, który ma być stosowany do wskaźnika.
Powiązane komponenty
Jeśli interfejs wymaga, aby wskaźnik znajdował się w widocznym kontenerze tła,
użyj ContainedVoiceInputIndicator. Ta alternatywa zapewnia, że paski wskaźnika są przezroczyste, co pozwala na wyświetlanie kontenera tła.