Wskaźnik głosowego wprowadzania tekstu w Jetpack Compose Glimmer

Odpowiednie urządzenia z XR
Te wskazówki pomogą Ci tworzyć aplikacje na te typy urządzeń z XR.
Okulary z wyświetlaczem

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.

Rysunek 1. Przykład komponentu VoiceInputIndicator.

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, od 0.0 dla ciszy do 1.0 dla najgłośniejszego dźwięku.
  • indicatorColor: kolor pasków wskaźnika. Domyślnie używa koloru podstawowego z motywu Glimmer; zobacz GlimmerTheme.colors.primary.
  • modifier: standardowy modyfikator Compose modifier, który ma być stosowany do wskaźnika.

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.