अपने XR ऐप्लिकेशन में स्पेस ऑडियो जोड़ना

इस्तेमाल किए जा सकने वाले XR डिवाइस
इस गाइड की मदद से, इन XR डिवाइसों के लिए शानदार अनुभव बनाए जा सकते हैं.
XR हेडसेट
वायर वाले XR स्मार्ट ग्लास

Jetpack SceneCore में मौजूद स्पेशल ऑडियो की सुविधाओं की मदद से, Android XR ऐप्लिकेशन में शानदार ऑडियो अनुभव दिया जा सकता है.

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

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

मौजूदा ऐप्लिकेशन, स्पेशल ऑडियो को कैसे रेंडर करते हैं, इस बारे में ज़्यादा जानने के लिए, इस पेज पर अपने ऐप्लिकेशन में स्टीरियो और सराउंड साउंड जोड़ना लेख पढ़ें.

अगर अपने ऐप्लिकेशन को XR के लिए ऑप्टिमाइज़ किया जा रहा है, तो Jetpack SceneCore, स्पेशल ऑडियो को पसंद के मुताबिक बनाने के लिए टूल उपलब्ध कराता है. 3D एनवायरमेंट में आवाज़ों को सटीक पोज़िशन पर रखा जा सकता है. साथ ही, रीयल साउंड फ़ील्ड के लिए ऐम्बिसॉनिक ऑडियो का इस्तेमाल किया जा सकता है. इसके अलावा, बिल्ट-इन सराउंड साउंड इंटिग्रेशन का फ़ायदा लिया जा सकता है.

Android XR में उपलब्ध स्पेशल ऑडियो के टाइप

Android XR, पोज़िशनल, स्टीरियो, सराउंड साउंड, और ऐम्बिसॉनिक ऑडियो को सपोर्ट करता है.

पोज़िशनल ऑडियो

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

स्पेशलाइज़्ड स्टीरियो और सराउंड साउंड

पोज़िशनल, स्टीरियो, और सराउंड साउंड के लिए, Android के सभी मीडिया फ़ॉर्मैट इस्तेमाल किए जा सकते हैं. इन फ़ॉर्मैट के अलावा, Android XR डिवाइस, Dolby Atmos, Dolby Digital, और Dolby Digital+ ऑडियो फ़ॉर्मैट को भी सपोर्ट कर सकते हैं.

स्टीरियो ऑडियो, दो चैनलों वाले ऑडियो फ़ॉर्मैट को कहते हैं. वहीं, सराउंड साउंड, दो से ज़्यादा चैनलों वाले ऑडियो फ़ॉर्मैट को कहते हैं. जैसे, 5.1 सराउंड साउंड या 7.1 सराउंड साउंड कॉन्फ़िगरेशन. हर चैनल का साउंड डेटा, एक स्पीकर से जुड़ा होता है. उदाहरण के लिए, स्टीरियो में संगीत चलाने पर, बाएं स्पीकर चैनल से दाएं स्पीकर चैनल के मुकाबले अलग-अलग इंस्ट्रूमेंट ट्रैक सुनाई दे सकते हैं.

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

ऐम्बिसॉनिक ऑडियो

ऐम्बिसॉनिक ऑडियो (या ऐम्बिसॉनिक्स), ऑडियो के लिए स्काईबॉक्स की तरह होता है. इससे उपयोगकर्ताओं को इमर्सिव साउंडस्केप मिलता है. बैकग्राउंड में एनवायरमेंटल साउंड या अन्य ऐसे सीन के लिए ऐम्बिसॉनिक्स का इस्तेमाल करें जहां आपको सुनने वाले व्यक्ति के आस-पास, पूरी तरह से गोलाकार साउंड फ़ील्ड बनाना हो. Android XR, पहले, दूसरे, और तीसरे ऑर्डर के ऐम्बिसॉनिक्स में, AmbiX ऐम्बिसॉनिक ऑडियो फ़ॉर्मैट को सपोर्ट करता है. हमारा सुझाव है कि Opus (.ogg) और PCM/Wave (.wav) फ़ाइल टाइप इस्तेमाल करें.

Jetpack SceneCore के साथ स्पेशल ऑडियो का इस्तेमाल करना

Jetpack SceneCore के साथ स्पेशल ऑडियो को लागू करने के लिए, स्पेशल ऑडियो की सुविधाओं की जांच करें और स्पेशल ऑडियो लोड करने के लिए कोई एपीआई चुनें.

स्पेशल ऑडियो की सुविधाओं की जांच करना

स्पेशल ऑडियो की सुविधाओं का इस्तेमाल करने से पहले, यह देखें कि Session में स्पेशल ऑडियो की सुविधा काम करती है या नहीं. यहां दिए गए सेक्शन में, कोड के सभी स्निपेट में, स्पेशलाइज़्ड ऑडियो चलाने की कोशिश करने से पहले, सुविधाओं की जांच की जाती है.

स्पेशल ऑडियो लोड करना

Jetpack SceneCore में इस्तेमाल करने के लिए, स्पेशल ऑडियो लोड करने के लिए इनमें से कोई भी एपीआई इस्तेमाल किया जा सकता है.

  • SoundPool: यह 1 एमबी से कम साइज़ वाले छोटे साउंड इफ़ेक्ट के लिए सही है. इन्हें पहले से लोड किया जाता है और आवाज़ों का बार-बार इस्तेमाल किया जा सकता है. पोज़िशनल ऑडियो के लिए, ऑडियो लोड करने का यह एक शानदार तरीका है.
  • ExoPlayer: यह स्टीरियो और सराउंड साउंड कॉन्टेंट लोड करने के लिए सही है. जैसे, संगीत और वीडियो. इससे बैकग्राउंड में मीडिया चलाया जा सकता है.
  • MediaPlayer: यह ऐम्बिसॉनिक ऑडियो लोड करने का सबसे आसान तरीका है.
  • AudioTrack: यह ऑडियो डेटा लोड करने के तरीके पर सबसे ज़्यादा कंट्रोल देता है. इससे ऑडियो के बफ़र को सीधे तौर पर लिखा जा सकता है. साथ ही, अगर आपने अपनी ऑडियो फ़ाइलें सिंथेसाइज़ या डिकोड की हैं, तो भी इसका इस्तेमाल किया जा सकता है.

मीडिया फ़ॉर्मैट के लिए, डिवाइस के साथ काम करने की सुविधा की जांच करना

कुछ मीडिया फ़ॉर्मैट, Android प्लैटफ़ॉर्म के साथ काम करते हैं. हालांकि, कोई खास Android XR डिवाइस, Dolby Atmos जैसे अन्य फ़ॉर्मैट के साथ भी काम कर सकता है. मीडिया फ़ॉर्मैट के लिए, डिवाइस के साथ काम करने की सुविधा के बारे में क्वेरी करने के लिए, ExoPlayer के AudioCapabilities का इस्तेमाल करें:

val audioCapabilities = AudioCapabilities.getCapabilities(context, androidx.media3.common.AudioAttributes.DEFAULT, null)
if (audioCapabilities.supportsEncoding(C.ENCODING_AC3)) {
    // Device supports playback of the Dolby Digital media format.
}
if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3)) {
    // Device supports playback of the Dolby Digital Plus media format.
}
if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3_JOC)) {
    // Device supports playback of the Dolby Digital Plus with Dolby Atmos media format.
}

इन सुविधाओं की जांच करने के लिए, कॉल ब्लॉक किए जा सकते हैं. इसलिए, इन्हें मुख्य थ्रेड पर कॉल नहीं किया जाना चाहिए.

अपने ऐप्लिकेशन में पोज़िशनल ऑडियो जोड़ना

पोज़िशनल साउंड सोर्स, PointSourceParams और उससे जुड़े Entity से तय होते हैं. Entity की पोज़िशन और ओरिएंटेशन से यह तय होता है कि PointSourceParams को 3D स्पेस में कहां रेंडर किया जाएगा. setPointSourceParams पर SpatialMediaPlayer को कॉल करें, ताकि PointSourceParams और उससे जुड़ी entity को MediaPlayer इंस्टेंस पर सेट किया जा सके.

पोज़िशनल ऑडियो का उदाहरण

यहां दिए गए उदाहरण में, साउंड इफ़ेक्ट वाली ऑडियो फ़ाइल को साउंड पूल में लोड किया गया है. साथ ही, इसे Entity की पोज़िशन पर वापस चलाया गया है.

// Check spatial capabilities before using spatial audio
if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)
) { // The session has spatial audio capabilities
    val maxVolume = 1F
    val lowPriority = 0
    val infiniteLoop = -1
    val normalSpeed = 1F

    val soundPool = SoundPool.Builder()
        .setAudioAttributes(
            AudioAttributes.Builder()
                .setContentType(CONTENT_TYPE_SONIFICATION)
                .setUsage(USAGE_ASSISTANCE_SONIFICATION)
                .build()
        )
        .build()

    val pointSource = PointSourceParams(entity)

    val soundEffect = appContext.assets.openFd("sounds/tiger_16db.mp3")
    val pointSoundId = soundPool.load(soundEffect, lowPriority)

    soundPool.setOnLoadCompleteListener { soundPool, sampleId, status ->
        // wait for the sound file to be loaded into the soundPool
        if (status == 0) {
            SpatialSoundPool.play(
                session = session,
                soundPool = soundPool,
                soundID = pointSoundId,
                params = pointSource,
                volume = maxVolume,
                priority = lowPriority,
                loop = infiniteLoop,
                rate = normalSpeed
            )
        }
    }
} else {
    // The session does not have spatial audio capabilities
}

कोड के बारे में अहम जानकारी

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

अपने ऐप्लिकेशन में स्टीरियो और सराउंड साउंड जोड़ना

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

स्टीरियो और सराउंड साउंड स्पीकर की पोज़िशन सेट करना

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

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

स्टीरियो के लिए, स्पीकर प्लेसमेंट, सराउंड साउंड की तरह ही होता है. हालांकि, इसमें सिर्फ़ बाएं और दाएं चैनलों को पैनल के बाएं और दाएं ओर रखा जाता है.

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

उपयोगकर्ता के अपने स्पेस में घूमने पर, स्टीरियो और सराउंड साउंड के वर्चुअल स्पीकर, हमेशा सही पोज़िशन पर रहेंगे. इसके लिए, वे अपनी पोज़िशन और ओरिएंटेशन में बदलाव करते रहेंगे.

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

सराउंड साउंड का उदाहरण

यहां दिए गए उदाहरण में, MediaPlayer का इस्तेमाल करके, 5.1 ऑडियो फ़ाइल लोड की गई है. साथ ही, फ़ाइल के सेंटर चैनल को Entity के तौर पर सेट किया गया है.

// Check spatial capabilities before using spatial audio
if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)) {
    // The session has spatial audio capabilities

    val pointSourceAttributes = PointSourceParams(session.scene.mainPanelEntity)

    val mediaPlayer = MediaPlayer()

    val fivePointOneAudio = appContext.assets.openFd("sounds/aac_51.ogg")
    mediaPlayer.reset()
    mediaPlayer.setDataSource(fivePointOneAudio)

    val audioAttributes =
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()

    SpatialMediaPlayer.setPointSourceParams(
        session,
        mediaPlayer,
        pointSourceAttributes
    )

    mediaPlayer.setAudioAttributes(audioAttributes)
    mediaPlayer.prepare()
    mediaPlayer.start()
} else {
    // The session does not have spatial audio capabilities
}

कोड के बारे में अहम जानकारी

  • पोज़िशनल ऑडियो के उदाहरण की तरह, पहला चरण यह है कि स्पेशल ऑडियो की सुविधाएं उपलब्ध हैं या नहीं, यह देखने के लिए spatialCapabilities का इस्तेमाल किया जाए.
  • contentType को AudioAttributes.CONTENT_TYPE_MUSIC और usage को AudioAttributes.USAGE_MEDIA पर सेट करने से, सिस्टम इस ऑडियो फ़ाइल को सराउंड साउंड के तौर पर ट्रीट करता है.

अपने ऐप्लिकेशन में ऐम्बिसॉनिक साउंड फ़ील्ड जोड़ना

ऐम्बिसॉनिक साउंड फ़ील्ड को वापस चलाने का सबसे आसान तरीका है कि फ़ाइल को MediaPlayer से लोड किया जाए. ऐम्बिसॉनिक साउंड, पूरे साउंडस्केप पर लागू होता है. इसलिए, पोज़िशन बताने के लिए, Entity तय करने की ज़रूरत नहीं होती. इसके बजाय, चैनलों की संख्या तय करने के लिए, सही ऐम्बिसॉनिक ऑर्डर के साथ SoundFieldAttributes का इंस्टेंस बनाएं.

ऐम्बिसॉनिक्स का उदाहरण

यहां दिए गए उदाहरण में, MediaPlayer का इस्तेमाल करके, ऐम्बिसॉनिक साउंड फ़ील्ड चलाया गया है.

// Check spatial capabilities before using spatial audio
if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)) {
    // The session has spatial audio capabilities

    val soundFieldAttributes =
        SoundFieldAttributes(SpatializerConstants.AmbisonicsOrder.FIRST_ORDER)

    val mediaPlayer = MediaPlayer()

    val soundFieldAudio = appContext.assets.openFd("sounds/foa_basketball_16bit.wav")

    mediaPlayer.reset()
    mediaPlayer.setDataSource(soundFieldAudio)

    val audioAttributes =
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()

    SpatialMediaPlayer.setSoundFieldAttributes(
        session,
        mediaPlayer,
        soundFieldAttributes
    )

    mediaPlayer.setAudioAttributes(audioAttributes)
    mediaPlayer.prepare()
    mediaPlayer.start()
} else {
    // The session does not have spatial audio capabilities
}

कोड के बारे में अहम जानकारी

  • पिछले स्निपेट की तरह, पहला चरण यह है कि स्पेशल ऑडियो की सुविधाएं उपलब्ध हैं या नहीं, यह देखने के लिए hasCapability() का इस्तेमाल किया जाए.
  • contentType और usage सिर्फ़ जानकारी के लिए हैं.
  • AMBISONICS_ORDER_FIRST_ORDER से SceneCore को यह सिग्नल मिलता है कि साउंड फ़ील्ड फ़ाइल में चार चैनल तय किए गए हैं.