Jetpack Compose Glimmer'da ses girişi göstergesi

Uygun XR cihazlar
Bu kılavuz, bu tür XR cihazlar için deneyimler oluşturmanıza yardımcı olur.
Görüntüleme Gözlüğü

VoiceInputIndicator, kullanıcılara ses etkinliğini gösteren bir Jetpack Compose Glimmer bileşenidir. Bu bileşeni, ses girişini veya diğer sesleri kabul etmek ve uygulamanızın ses yakaladığını göstermek için görsel geri bildirim sağlamak üzere kullanabilirsiniz.

Bu bileşen tamamen görsel bir öğedir. Ses kaydetmez veya mikrofon verilerini tek başına işlemez. Bunun yerine, uygulamanızın sağladığı bir sese level yanıt verir. Bu ses, ses yoğunluğunun görsel bir temsilini gösterir.

Şekil 1. VoiceInputIndicator örneği.

Tahmini izinleri isteme

Göstergeyi yönlendirmek için ses verilerini yakalamak üzere uygulamanızın Manifest.permission.RECORD_AUDIO iznine ihtiyacı vardır.

Görüntüleme gözlükleri için artırılmış gerçeklik deneyimleri oluştururken hem cihazda hem de gözlükte izinleri doğru şekilde istediğinizden emin olun. Kullanıcıya istem göndermek için ProjectedPermissionsResultContract ve ProjectedPermissionsRequestParams özelliğini kullanın.

Yansıtılan ortamlarda izin isteme hakkında daha fazla bilgi için Donanım izinleri isteme başlıklı makaleyi inceleyin.

Ses yakalama ve normalleştirme

VoiceInputIndicator, ses harcanan efor düzeyini görsel olarak yansıtmak için 0.0f ile 1.0f arasında bir Float gerektirir. Tamamen görsel bir bileşen olarak çalıştığı ve ses yakalamadığı için uygulamanız mikrofonu etkin bir şekilde izlemeli ve ses seviyesini göstergenin level parametresine aktarmalıdır.

Ses verilerini yakalamanın birden fazla yolu olsa da bir yaklaşım SpeechRecognizer API'sini kullanmaktır. SpeechRecognizer kullanırken rmsdB ile desibel cinsinden ses seviyesini sağlayan RecognitionListener.onRmsChanged geri çağırma işlevini kullanarak gerçek zamanlı ses seviyesi güncellemelerini yakalayabilirsiniz.

Bu ham değer genellikle 0 ile 10 arasında olduğundan çıkışı gerekli 0.0f ile 1.0f aralığına normalleştirmeniz gerekir. Göstergeyi sürekli olarak güncellemek için bu normalleştirilmiş seviyeyi bir durum değişkeninde tutabilirsiniz.

Bir durum değişkenini güncellemek için RecognitionListener kullanan bir örneği aşağıda bulabilirsiniz:

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

Ses girişi göstergesini entegre etme

Ses akışınız düzgün şekilde normalleştirilip durum olarak kullanıma sunulduktan sonra doğrudan VoiceInputIndicator'ye iletebilirsiniz.

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

Özelleştirme parametreleri

VoiceInputIndicator, davranışını ve görünümünü özelleştirmek için birkaç parametre sağlar:

  • level: Ses girişinin seviyesini temsil eden bir Float döndüren işlev. Bu işlev, sessizlik için 0.0 ile en yüksek ses için 1.0 arasında bir değer döndürür.
  • indicatorColor: Gösterge çubuklarının rengi. Bu özellik varsayılan olarak Glimmer temasındaki birincil rengi kullanır. GlimmerTheme.colors.primary bölümüne bakın.
  • modifier: Göstergeye uygulanacak standart Oluşturma modifier.

Kullanıcı arayüzünüzde göstergenin görünür bir arka plan kapsayıcısında yer alması gerekiyorsa ContainedVoiceInputIndicator kullanın. Bu alternatif, gösterge çubuklarının şeffaf olmasını sağlar ve arka plan kapsayıcısının görünmesine olanak tanır.