VoiceInputIndicator adalah komponen Glimmer Jetpack Compose yang menampilkan aktivitas suara kepada pengguna. Anda dapat menggunakan komponen ini untuk menerima input suara atau audio lain dan memberikan masukan visual untuk menunjukkan bahwa aplikasi Anda sedang merekam audio.
Komponen ini murni merupakan elemen visual. Aplikasi ini tidak merekam audio atau memproses data mikrofonnya sendiri. Sebagai gantinya, aplikasi merespons level audio yang disediakan
oleh aplikasi Anda, yang menampilkan representasi visual intensitas audio.
Meminta izin yang diproyeksikan
Untuk merekam data audio guna menggerakkan indikator, aplikasi Anda memerlukan izin
Manifest.permission.RECORD_AUDIO.
Saat Anda membuat pengalaman beraugmentasi untuk kacamata tampilan, pastikan Anda
meminta izin dengan benar di perangkat dan kacamata. Gunakan
ProjectedPermissionsResultContract dan
ProjectedPermissionsRequestParams untuk memunculkan perintah kepada pengguna.
Untuk mengetahui informasi selengkapnya tentang meminta izin di lingkungan yang diproyeksikan, lihat Meminta izin hardware.
Merekam dan menormalisasi audio
VoiceInputIndicator memerlukan Float antara 0.0f dan 1.0f untuk mencerminkan intensitas audio secara visual. Karena beroperasi murni sebagai komponen visual dan tidak merekam audio, aplikasi Anda harus memantau mikrofon secara aktif dan mengalirkan volume ke parameter level indikator.
Meskipun ada beberapa cara untuk merekam data audio, salah satu caranya adalah dengan menggunakan SpeechRecognizer API. Saat menggunakan SpeechRecognizer, Anda
dapat merekam update volume real-time menggunakan
callback RecognitionListener.onRmsChanged, yang memberikan tingkat audio
dalam desibel, rmsdB.
Karena nilai mentah ini biasanya berada di antara 0 dan 10, Anda harus menormalisasi output ke rentang 0.0f hingga 1.0f yang diperlukan. Anda dapat menyimpan tingkat yang dinormalisasi ini dalam variabel status untuk terus memperbarui indikator.
Berikut adalah contoh penggunaan RecognitionListener untuk memperbarui variabel
status:
// 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)
Mengintegrasikan indikator input suara
Setelah aliran audio dinormalisasi dan diekspos dengan benar sebagai status, Anda dapat meneruskannya langsung ke 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 ) }
Parameter penyesuaian
VoiceInputIndicator menyediakan beberapa parameter untuk menyesuaikan perilaku dan tampilannya:
level: Fungsi yang menampilkanFloatyang merepresentasikan tingkat input suara, mulai dari0.0untuk keheningan hingga1.0untuk suara paling keras.indicatorColor: Warna batang indikator. Secara default, ini menggunakan warna primer dari tema Glimmer; lihatGlimmerTheme.colors.primary.modifier:modifierCompose standar yang akan diterapkan ke indikator.
Komponen terkait
Jika UI Anda memerlukan indikator untuk berada dalam penampung latar belakang yang terlihat,
gunakan ContainedVoiceInputIndicator. Alternatif ini memastikan bahwa
batang indikator transparan, sehingga penampung latar belakang dapat terlihat
menembus.