Jetpack Compose Glimmer में, बोले गए शब्दों के अपने-आप टाइप होने की सुविधा का इंडिकेटर

एक्सआर डिवाइसों पर लागू होने वाली सुविधाएँ
इन दिशा-निर्देशों से आपको इस तरह के एक्सआर डिवाइसों के लिए अनुभव बनाने में मदद मिलती है.
डिसप्ले ग्लास

VoiceInputIndicator, Jetpack Compose Glimmer कॉम्पोनेंट है. यह उपयोगकर्ता को आवाज़ की गतिविधि दिखाता है. इस कॉम्पोनेंट का इस्तेमाल, आवाज़ या अन्य ऑडियो को स्वीकार करने के लिए किया जा सकता है. साथ ही, विज़ुअल फ़ीडबैक देने के लिए भी इसका इस्तेमाल किया जा सकता है, ताकि यह दिखाया जा सके कि आपका ऐप्लिकेशन ऑडियो कैप्चर कर रहा है.

यह कॉम्पोनेंट सिर्फ़ एक विज़ुअल एलिमेंट है. यह अपने-आप ऑडियो रिकॉर्ड नहीं करता या माइक्रोफ़ोन के डेटा को प्रोसेस नहीं करता. इसके बजाय, यह आपके ऐप्लिकेशन से मिले ऑडियो level के हिसाब से जवाब देता है. इसमें ऑडियो की इंटेंसिटी को विज़ुअल तौर पर दिखाया जाता है.

पहली इमेज. VoiceInputIndicator का एक उदाहरण.

प्रोजेक्ट की गई अनुमतियों का अनुरोध करना

इंडिकेटर को चालू करने के लिए, ऑडियो डेटा कैप्चर करने के लिए आपके ऐप्लिकेशन को Manifest.permission.RECORD_AUDIO की अनुमति चाहिए.

डिस्प्ले ग्लास के लिए ऑगमेंटेड अनुभव बनाते समय, पक्का करें कि आपने डिवाइस और स्मार्ट ग्लास, दोनों के लिए अनुमतियों का अनुरोध सही तरीके से किया हो. उपयोगकर्ता को प्रॉम्प्ट करने के लिए, ProjectedPermissionsResultContract और ProjectedPermissionsRequestParams का इस्तेमाल करें.

प्रोजेक्ट किए गए एनवायरमेंट में अनुमतियों का अनुरोध करने के बारे में ज़्यादा जानने के लिए, हार्डवेयर की अनुमतियों का अनुरोध करना लेख पढ़ें.

ऑडियो कैप्चर करना और उसे नॉर्मलाइज़ करना

ऑडियो की इंटेंसिटी को विज़ुअल तौर पर दिखाने के लिए, VoiceInputIndicator को 0.0f और 1.0f के बीच Float की ज़रूरत होती है. यह सिर्फ़ एक विज़ुअल कॉम्पोनेंट के तौर पर काम करता है और ऑडियो कैप्चर नहीं करता है. इसलिए, आपके ऐप्लिकेशन को माइक्रोफ़ोन की लगातार निगरानी करनी होगी. साथ ही, इंडिकेटर के level पैरामीटर को वॉल्यूम स्ट्रीम करना होगा.

ऑडियो डेटा कैप्चर करने के कई तरीके हैं. हालांकि, एक तरीका SpeechRecognizer API का इस्तेमाल करना है. SpeechRecognizer का इस्तेमाल करते समय, RecognitionListener.onRmsChanged कॉलबैक का इस्तेमाल करके, रीयल-टाइम में वॉल्यूम के अपडेट कैप्चर किए जा सकते हैं. यह कॉलबैक, डेसिबल में ऑडियो लेवल rmsdB उपलब्ध कराता है.

आम तौर पर, यह रॉ वैल्यू 0 से 10 के बीच होती है. इसलिए, आपको आउटपुट को ज़रूरी 0.0f से 1.0f रेंज में सामान्य करना होगा. इस सामान्य किए गए लेवल को किसी स्टेट वैरिएबल में सेव किया जा सकता है, ताकि इंडिकेटर को लगातार अपडेट किया जा सके.

यहां एक उदाहरण दिया गया है, जिसमें किसी स्टेट वैरिएबल को अपडेट करने के लिए RecognitionListener का इस्तेमाल किया गया है:

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

बोलकर निर्देश देने की सुविधा के लिए इंडिकेटर को इंटिग्रेट करना

ऑडियो स्ट्रीम को सामान्य करने और उसे स्टेट के तौर पर दिखाने के बाद, उसे सीधे 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
    )
}

पसंद के मुताबिक बनाने के पैरामीटर

VoiceInputIndicator के व्यवहार और दिखने के तरीके को पसंद के मुताबिक बनाने के लिए, कुछ पैरामीटर उपलब्ध होते हैं:

  • level: यह एक ऐसा फ़ंक्शन है जो Float दिखाता है. यह आवाज़ के इनपुट के लेवल को दिखाता है. इसकी रेंज से तक होती है. 0.0 का मतलब है कि आवाज़ नहीं है और 1.0 का मतलब है कि आवाज़ सबसे ज़्यादा है.
  • indicatorColor: इंडिकेटर बार का रंग. डिफ़ॉल्ट रूप से, यह Glimmer थीम के मुख्य रंग का इस्तेमाल करता है. GlimmerTheme.colors.primary देखें.
  • modifier: इंडिकेटर पर लागू होने वाला स्टैंडर्ड कंपोज़ modifier.

अगर आपके यूज़र इंटरफ़ेस (यूआई) में, इंडिकेटर को दिखने वाले बैकग्राउंड कंटेनर में रखना है, तो ContainedVoiceInputIndicator का इस्तेमाल करें. इस विकल्प से यह पक्का किया जाता है कि इंडिकेटर बार पारदर्शी हों, ताकि बैकग्राउंड कंटेनर दिख सके.