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

Uygun XR cihazlar
Bu kılavuz, bu tür XR cihazlar için deneyimler geliştirmenize yardımcı olur.
Görüntülü Gözlük

VoiceInputIndicator, kullanıcıya 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 kaydettiğini gösteren görsel geri bildirim sağlamak için kullanabilirsiniz.

Bu bileşen tamamen görsel bir öğedir. Ses kaydetmez veya mikrofon verilerini kendi başına işlemez. Bunun yerine, uygulamanız tarafından sağlanan ve ses yoğunluğunun görsel bir temsilini gösteren sesli level öğesine yanıt verir.

Şekil 1. VoiceInputIndicator örneği.

Yansıtılan izinleri isteme

Uygulamanızın, göstergeyi çalıştırmak için ses verilerini yakalaması gerekir. Bunun için Manifest.permission.RECORD_AUDIO izni gereklidir.

Görüntülü gözlükler 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ıdan bilgi istemek için ProjectedActivityCompat.requestPermissions kullanın.

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

Sesi 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 kaydetmediği için uygulamanızın mikrofonu aktif olarak izlemesi ve ses seviyesini göstergenin level parametresine aktarması gerekir.

Ses verilerini yakalamanın birden fazla yolu olsa da yaklaşımlardan biri SpeechRecognizer API'sini kullanmaktır. SpeechRecognizer kullanırken, ses seviyesini desibel cinsinden (rmsdB) 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.

Aşağıda, bir durum değişkenini güncellemek için RecognitionListener kullanan bir örnek verilmiştir:

// 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 doğru şekilde normalleştirilip durum olarak gösterildikten sonra doğrudan VoiceInputIndicator'e 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. Sessizlik için 0.0, en yüksek ses için 1.0 değerini döndürür.
  • indicatorColor: Gösterge çubuklarının rengi. Varsayılan olarak, Glimmer temasındaki birincil rengi kullanır. GlimmerTheme.colors.primary bölümüne bakın.
  • modifier: Göstergeye uygulanacak standart Compose modifier.

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