ऑडियो इनपुट शेयर किया जा रहा है

ऑडियो इनपुट आम तौर पर, डिवाइस में पहले से मौजूद माइक, बाहरी माइक या डिवाइस से जुड़े ऑडियो इंटरफ़ेस से आता है. ऑडियो इनपुट, फ़ोन पर हुई बातचीत से भी मिल सकता है.

कभी-कभी, दो या इससे ज़्यादा ऐप्लिकेशन एक ही ऑडियो इनपुट को "कैप्चर" करना चाहते हैं. ऐसा हो सकता है कि वे अलग-अलग टास्क कर रहे हों. उदाहरण के लिए, ऑडियो पाने वाले कुछ ऐप्लिकेशन "रिकॉर्डिंग" कर सकते हैं, जैसे कि एक सामान्य वॉइस रिकॉर्डर. वहीं, कुछ अन्य ऐप्लिकेशन "सुन" सकते हैं, जैसे कि Google Assistant या सुलभता सेवा, जो बोले गए निर्देशों का जवाब देती है.

दोनों ही मामलों में, ये ऐप्लिकेशन ऑडियो इनपुट पाना चाहते हैं. इस पेज पर, हम "कैप्चर" शब्द का इस्तेमाल करते हैं. इससे कोई फ़र्क़ नहीं पड़ता कि कोई ऐप्लिकेशन रिकॉर्ड कर रहा है या सिर्फ़ सुन रहा है.

अगर दो या इससे ज़्यादा ऐप्लिकेशन एक ही समय पर ऑडियो कैप्चर करना चाहते हैं, तो उन सभी को एक ही सोर्स से ऑडियो सिग्नल डिलीवर करने में समस्या आ सकती है. इस पेज पर बताया गया है कि Android सिस्टम, ऑडियो कैप्चर करने वाले कई ऐप्लिकेशन के बीच ऑडियो इनपुट को कैसे शेयर करता है.

Android 10 से पहले के वर्शन में काम करने का तरीका

Android 10 से पहले, इनपुट ऑडियो स्ट्रीम को एक बार में सिर्फ़ एक ऐप्लिकेशन कैप्चर कर सकता था. अगर कोई ऐप्लिकेशन पहले से ही ऑडियो रिकॉर्ड कर रहा था या सुन रहा था, तो आपका ऐप्लिकेशन AudioRecord ऑब्जेक्ट बना सकता है. हालांकि, AudioRecord.startRecording() को कॉल करने पर गड़बड़ी का मैसेज दिखेगा और रिकॉर्डिंग शुरू नहीं होगी.

इस नियम का एक अपवाद यह था कि जब किसी खास ऐप्लिकेशन (जैसे, Google Assistant या सुलभता सेवा) के पास android.permission.CAPTURE_AUDIO_HOTWORD की अनुमति होती थी और वह HOTWORD टाइप के ऑडियो सोर्स का इस्तेमाल करता था. इस मामले में, कोई दूसरा ऐप्लिकेशन रिकॉर्डिंग शुरू कर सकता है. ऐसा होने पर, खास ऐप्लिकेशन बंद हो गया और नए ऐप्लिकेशन ने इनपुट कैप्चर कर लिया.

Android 9 में एक और बदलाव किया गया: सिर्फ़ फ़ोरग्राउंड में चल रहे ऐप्लिकेशन (या फ़ोरग्राउंड सेवा) ही ऑडियो इनपुट कैप्चर कर सकते थे. जब फ़ोरग्राउंड सेवा या फ़ोरग्राउंड यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट के बिना किसी ऐप्लिकेशन ने ऑडियो कैप्चर करना शुरू किया, तो ऐप्लिकेशन चलता रहा, लेकिन उसे कोई ऑडियो नहीं मिला. भले ही, उस समय ऑडियो कैप्चर करने वाला वह एकमात्र ऐप्लिकेशन था.

Android 10 में काम करने का तरीका

Android 10 से पहले के वर्शन में, "पहले आएं, पहले पाएं" के आधार पर ऑडियो कैप्चर किया जाता है. जब कोई ऐप्लिकेशन ऑडियो कैप्चर करना शुरू करता है, तो कोई दूसरा ऐप्लिकेशन ऑडियो इनपुट को तब तक ऐक्सेस नहीं कर सकता, जब तक ऑडियो कैप्चर करने वाला ऐप्लिकेशन बंद नहीं हो जाता.

Android 10 में प्राथमिकता की एक स्कीम लागू की गई है. इसकी मदद से, ऐप्लिकेशन के चलने के दौरान, इनपुट ऑडियो स्ट्रीम को एक ऐप्लिकेशन से दूसरे ऐप्लिकेशन पर स्विच किया जा सकता है. ज़्यादातर मामलों में, अगर कोई नया ऐप्लिकेशन ऑडियो इनपुट कैप्चर करता है, तो पहले से ऑडियो कैप्चर कर रहा ऐप्लिकेशन चलता रहता है. हालांकि, उसे कोई ऑडियो नहीं मिलता. कुछ मामलों में, सिस्टम दोनों ऐप्लिकेशन को ऑडियो डिलीवर करना जारी रख सकता है. शेयर करने की अलग-अलग स्थितियों के बारे में यहां बताया गया है.

यह स्कीम, ऑडियो फ़ोकस के उस तरीके से मिलती-जुलती है जिससे ऑडियो आउटपुट का इस्तेमाल करने के लिए, कई ऐप्लिकेशन को मैनेज किया जाता है. हालांकि, ऑडियो फ़ोकस को प्रोग्राम के हिसाब से मैनेज किया जाता है. इसके लिए, फ़ोकस पाने और उसे छोड़ने के अनुरोध किए जाते हैं. वहीं, इनपुट स्विच करने की जो स्कीम यहां बताई गई है वह प्राथमिकता की नीति पर आधारित है. यह नीति, नया ऐप्लिकेशन ऑडियो कैप्चर करना शुरू करने पर अपने-आप लागू हो जाती है.

ऑडियो कैप्चर करने के लिए, Android दो तरह के ऐप्लिकेशन में अंतर करता है:

  • "सामान्य" ऐप्लिकेशन, उपयोगकर्ता इंस्टॉल करता है.
  • "Privileged" ऐप्लिकेशन, डिवाइस पर पहले से इंस्टॉल होते हैं. इनमें Google Assistant और सुलभता से जुड़ी सभी सेवाएं शामिल हैं.

इसके अलावा, अगर कोई ऐप्लिकेशन "निजता के लिहाज़ से संवेदनशील" ऑडियो सोर्स का इस्तेमाल करता है, तो उसके साथ अलग तरह से व्यवहार किया जाता है: CAMCORDER या VOICE_COMMUNICATION.

ऑडियो इनपुट का इस्तेमाल करने और उसे शेयर करने के लिए, प्राथमिकता के नियम इस तरह हैं:

  • खास ऐप्लिकेशन को सामान्य ऐप्लिकेशन की तुलना में ज़्यादा प्राथमिकता दी जाती है.
  • जिन ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) फ़ोरग्राउंड में दिखता है उन्हें बैकग्राउंड में चलने वाले ऐप्लिकेशन के मुकाबले ज़्यादा प्राथमिकता दी जाती है.
  • निजता के लिहाज़ से संवेदनशील सोर्स से ऑडियो कैप्चर करने वाले ऐप्लिकेशन को, अन्य ऐप्लिकेशन की तुलना में ज़्यादा प्राथमिकता दी जाती है.
  • दो सामान्य ऐप्लिकेशन, एक ही समय पर ऑडियो कैप्चर नहीं कर सकते.
  • कुछ मामलों में, खास अधिकार वाला ऐप्लिकेशन, ऑडियो इनपुट को किसी दूसरे ऐप्लिकेशन के साथ शेयर कर सकता है.
  • अगर बैकग्राउंड में चल रहे एक जैसी प्राथमिकता वाले दो ऐप्लिकेशन ऑडियो कैप्चर कर रहे हैं, तो बाद में शुरू किए गए ऐप्लिकेशन को ज़्यादा प्राथमिकता दी जाती है.

शेयर करने से जुड़ी स्थितियां

जब दो ऐप्लिकेशन ऑडियो कैप्चर करने की कोशिश करते हैं, तो हो सकता है कि दोनों को इनपुट सिग्नल मिले या उनमें से किसी एक को कोई आवाज़ न सुनाई दे.

इसके चार मुख्य उदाहरण हैं:

  • Assistant + सामान्य ऐप्लिकेशन
  • सुलभता सेवा + सामान्य ऐप्लिकेशन
  • दो सामान्य ऐप्लिकेशन
  • वॉइस कॉल + सामान्य ऐप्लिकेशन

Assistant + सामान्य ऐप्लिकेशन

Assistant एक खास ऐप्लिकेशन है, क्योंकि यह पहले से इंस्टॉल होता है और इसमें RoleManager.ROLE_ASSISTANT की भूमिका होती है. इस भूमिका के साथ पहले से इंस्टॉल किए गए किसी भी अन्य ऐप्लिकेशन को भी इसी तरह से मैनेज किया जाता है.

Android, इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • Assistant, ऑडियो को कैप्चर कर सकती है. इससे कोई फ़र्क़ नहीं पड़ता कि वह फ़ोरग्राउंड में है या बैकग्राउंड में. हालाँकि, अगर कोई दूसरा ऐप्लिकेशन, निजता के लिहाज़ से संवेदनशील ऑडियो सोर्स का इस्तेमाल करके पहले से ही ऑडियो कैप्चर कर रहा है, तो Assistant ऑडियो कैप्चर नहीं कर सकती.

  • ऐप्लिकेशन को ऑडियो तब तक मिलता रहता है, जब तक Assistant के पास स्क्रीन के सबसे ऊपर दिखने वाला यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट मौजूद होता है.

ध्यान दें कि दोनों ऐप्लिकेशन को ऑडियो सिर्फ़ तब मिलता है, जब Assistant बैकग्राउंड में हो और दूसरा ऐप्लिकेशन, निजता के लिहाज़ से संवेदनशील ऑडियो सोर्स से ऑडियो कैप्चर न कर रहा हो.

सुलभता सेवा + सामान्य ऐप्लिकेशन

AccessibilityService के लिए, एलान करना ज़रूरी है.

Android, इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • अगर सेवा का यूज़र इंटरफ़ेस सबसे ऊपर है, तो सेवा और ऐप्लिकेशन, दोनों को ऑडियो इनपुट मिलता है. इस सुविधा की मदद से, वॉइस कॉल को कंट्रोल किया जा सकता है या बोले गए निर्देशों से वीडियो कैप्चर किया जा सकता है.

  • अगर सेवा सबसे ऊपर नहीं है, तो इस मामले को नीचे दिए गए दो-ऐप्लिकेशन वाले सामान्य मामले की तरह माना जाता है.

दो सामान्य ऐप्लिकेशन

जब दो ऐप्लिकेशन एक साथ ऑडियो कैप्चर कर रहे हों, तो सिर्फ़ एक ऐप्लिकेशन को ऑडियो मिलता है और दूसरे को नहीं.

Android, इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • अगर दोनों ऐप्लिकेशन में से किसी में भी निजता से जुड़ी संवेदनशील जानकारी नहीं है, तो जिस ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) सबसे ऊपर है उसे ऑडियो मिलेगा. अगर दोनों में से किसी भी ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) नहीं है, तो जिस ऐप्लिकेशन ने सबसे हाल ही में कैप्चर करना शुरू किया है उसे ऑडियो मिलेगा.
  • अगर इनमें से कोई ऐप्लिकेशन निजता के लिहाज़ से संवेदनशील है, तो उसे ऑडियो मिलता है और दूसरे ऐप्लिकेशन को ऑडियो नहीं मिलता. भले ही, उसका यूज़र इंटरफ़ेस (यूआई) सबसे ऊपर हो या उसने हाल ही में ऑडियो कैप्चर करना शुरू किया हो.
  • अगर दोनों ऐप्लिकेशन निजता के लिहाज़ से संवेदनशील हैं, तो जिस ऐप्लिकेशन ने हाल ही में ऑडियो कैप्चर करना शुरू किया है उसे ऑडियो मिलेगा और दूसरे ऐप्लिकेशन को ऑडियो नहीं मिलेगा.

वॉइस कॉल + सामान्य ऐप्लिकेशन

अगर AudioManager.getMode() से मिला ऑडियो मोड MODE_IN_CALL या MODE_IN_COMMUNICATION है, तो इसका मतलब है कि वॉइस कॉल चालू है.

Android, इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • कॉल में हमेशा ऑडियो सुनाई देता है.
  • अगर ऐप्लिकेशन कोई सुलभता सेवा है, तो वह ऑडियो कैप्चर कर सकता है.
  • अगर ऐप्लिकेशन को खास अधिकार मिले हैं (पहले से इंस्टॉल किया गया है) और उसके पास CAPTURE_AUDIO_OUTPUT की अनुमति है, तो वह वॉइस कॉल को कैप्चर कर सकता है.

    वॉइस कॉल के अपलिंक (TX), डाउनलिंक (RX) या दोनों को कैप्चर करने के लिए, ऐप्लिकेशन को ऑडियो सोर्स MediaRecorder.AudioSource.VOICE_UPLINK या MediaRecorder.AudioSource.VOICE_DOWNLINK और/या डिवाइस AudioDeviceInfo.TYPE_TELEPHONY की जानकारी देनी होगी.

Android 11 पर काम करने का तरीका

Android 11 (एपीआई लेवल 30), Android 10 की प्राथमिकता स्कीम का पालन करता है. इसके बारे में ऊपर बताया गया है. यह AudioRecord, MediaRecorder, और AAudioStream में नए तरीके भी उपलब्ध कराता है. इनकी मदद से, एक साथ ऑडियो कैप्चर करने की सुविधा को चालू और बंद किया जा सकता है. भले ही, इस्तेमाल का कोई भी उदाहरण चुना गया हो.

नए तरीके ये हैं:

जब setPrivacySensitive() true होता है, तब कैप्चर करने का इस्तेमाल निजी होता है. साथ ही, खास सुविधाओं वाला Assistant भी एक साथ कैप्चर नहीं कर सकता. यह सेटिंग, ऑडियो सोर्स के हिसाब से तय होने वाले डिफ़ॉल्ट ऐक्शन और सेटिंग को बदल देती है. उदाहरण के लिए, VOICE_COMMUNICATION डिफ़ॉल्ट रूप से निजी होता है, लेकिन UNPROCESSED नहीं.

कॉन्फ़िगरेशन में बदलाव

जब कई ऐप्लिकेशन एक साथ ऑडियो कैप्चर कर रहे हों, तो उनमें से सिर्फ़ एक या दो ऐप्लिकेशन "ऐक्टिव" होते हैं (ऑडियो कैप्चर कर रहे होते हैं). बाकी ऐप्लिकेशन म्यूट होते हैं (ऑडियो कैप्चर नहीं कर रहे होते हैं). जब ऐक्टिव ऐप्लिकेशन बदलते हैं, तो ऑडियो फ़्रेमवर्क इन नियमों के मुताबिक ऑडियो पाथ को फिर से कॉन्फ़िगर कर सकता है:

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

ज़्यादा प्राथमिकता वाले ऐप्लिकेशन के चालू होने पर, हो सकता है कि चालू ऐप्लिकेशन की आवाज़ बंद हो जाए. इसलिए, कॉन्फ़िगरेशन में बदलाव होने पर सूचना पाने के लिए, AudioRecord या MediaRecorder ऑब्जेक्ट पर AudioManager.AudioRecordingCallback को रजिस्टर किया जा सकता है. ये बदलाव हो सकते हैं:

  • कैप्चर की गई आवाज़ को म्यूट या अनम्यूट करना
  • डिवाइस बदला गया
  • प्रीप्रोसेसिंग में बदलाव
  • स्ट्रीम की प्रॉपर्टी में बदलाव किया गया है (सैंपलिंग रेट, चैनल मास्क, सैंपल फ़ॉर्मैट)

कैप्चर शुरू करने से पहले, आपको AudioRecord.registerAudioRecordingCallback() को कॉल करना होगा. कॉलबैक सिर्फ़ तब लागू होता है, जब ऐप्लिकेशन को ऑडियो मिल रहा हो और उसमें कोई बदलाव हो.

onRecordingConfigChanged() वाला तरीका, एक AudioRecordingConfiguration ऑब्जेक्ट लौटाता है. इसमें ऑडियो कैप्चर करने की मौजूदा स्थिति की जानकारी होती है. इस बदलाव के बारे में जानने के लिए, ये तरीके अपनाएं:

isClientSilenced()
अगर कैप्चर करने की नीति की वजह से, क्लाइंट को मिलने वाले ऑडियो को फ़िलहाल म्यूट किया गया है, तो यह फ़ंक्शन true वैल्यू दिखाता है
getAudioDevice()
यह फ़ंक्शन, इस्तेमाल किए जा रहे ऑडियो डिवाइस की जानकारी दिखाता है.
getEffects()
यह फ़ंक्शन, प्रीप्रोसेसिंग के लिए चालू इफ़ेक्ट दिखाता है. ध्यान दें कि अगर क्लाइंट सबसे ज़्यादा प्राथमिकता वाला ऐप्लिकेशन नहीं है, तो हो सकता है कि चालू इफ़ेक्ट, getClientEffects() से मिले इफ़ेक्ट से अलग हो.
getFormat()
यह स्ट्रीम की प्रॉपर्टी दिखाता है. ध्यान दें कि क्लाइंट को मिलने वाला असल ऑडियो डेटा, हमेशा getClientFormat() से मिले ज़रूरी फ़ॉर्मैट के मुताबिक होता है. यह फ़्रेमवर्क, हार्डवेयर इंटरफ़ेस में इस्तेमाल किए गए फ़ॉर्मैट को क्लाइंट के बताए गए फ़ॉर्मैट में बदलने के लिए, ज़रूरी रीसैंपलिंग, चैनल, और फ़ॉर्मैट कन्वर्ज़न अपने-आप करता है.
AudioRecord.getActiveRecordingConfiguration()
यह फ़ंक्शन, रिकॉर्डिंग के लिए चालू कॉन्फ़िगरेशन दिखाता है.

AudioManager.getActiveRecordingConfigurations() को कॉल करके, डिवाइस पर चालू सभी रिकॉर्डिंग की सामान्य जानकारी देखी जा सकती है.