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