আপনার XR অ্যাপে স্পেশিয়াল অডিও যোগ করা

প্রযোজ্য XR ডিভাইস
এইসব XR ডিভাইসের জন্য অভিজ্ঞতা তৈরি করতে এই নির্দেশিকা আপনাকে সাহায্য করে।
XR হেডসেট
ওয়্যারড XR গ্লাস

Jetpack SceneCore-এর স্পেশিয়াল অডিও ফিচার আপনাকে Android XR অ্যাপ্লিকেশনের মধ্যে ইমারসিভ অডিও অভিজ্ঞতা তৈরি করতে সাহায্য করে।

স্পেশিয়াল অডিও এমনভাবে তৈরি করা হয় যাতে ব্যবহারকারীরা 3D পরিবেশে কীভাবে সাউন্ড শুনতে পান তা বোঝা যায়। এটি ব্যবহারকারীর উপর ও নিচ সহ সব দিক থেকে আসা সাউন্ডের অনুভূতি তৈরি করে। 3D স্পেসে নির্দিষ্ট লোকেশনে এক বা একাধিক "ভার্চুয়াল স্পিকার" সিমুলেট করার মাধ্যমে সিস্টেম এটি করে।

Android XR-এর জন্য ডিজাইন করা বা পরিবর্তিত হয়নি এমন আগে থেকে থাকা অ্যাপের অডিও Android XR-এ অটোমেটিক স্প্যাশিয়ালাইজ করা হয়। ব্যবহারকারী তার স্পেসে ঘোরাফেরা করার সময়, অ্যাপের UI যে প্যানেলে রেন্ডার করা হয়েছে, সেই প্যানেল থেকে সব অ্যাপ অডিও নির্গত হবে। যেমন, ক্লক অ্যাপ থেকে কোনও টাইমার শেষ হয়ে গেলে, অডিওটি এমনভাবে শোনা যাবে যেন সেটি অ্যাপ প্যানেলের পজিশন থেকে আসছে। Android XR পজিশনাল রিয়ালিজমের জন্য অটোমেটিক সাউন্ড পরিবর্তন করবে। যেমন, অ্যাপ প্যানেল ও ব্যবহারকারীর মধ্যে অনুভূত দূরত্ব অডিও ভলিউমের উপর সূক্ষ্ম প্রভাব ফেলবে যাতে আরও বেশি বাস্তবসম্মত অনুভূতি পাওয়া যায়।

আগে থেকে থাকা অ্যাপ কীভাবে স্পেশিয়াল অডিও রেন্ডার করে সেই সম্পর্কে আরও জানতে, এই পৃষ্ঠায় আপনার অ্যাপে স্টেরিও ও সারাউন্ড সাউন্ড যোগ করুন নিবন্ধটি পড়ুন।

আপনি XR-এর জন্য অ্যাপ অপ্টিমাইজ করলে, Jetpack SceneCore উন্নত স্পেশিয়াল অডিও কাস্টমাইজেশনের জন্য টুল প্রদান করে। আপনি 3D এনভায়রনমেন্টে সাউন্ডকে নিখুঁতভাবে পজিশন করতে পারবেন, বাস্তবসম্মত সাউন্ড ফিল্ডের জন্য অ্যাম্বিসোনিক অডিও ব্যবহার করতে পারবেন এবং বিল্ট-ইন সারাউন্ড সাউন্ড ইন্টিগ্রেশনের সুবিধা নিতে পারবেন।

Android XR-এ উপলভ্য Spatial Audio-এর ধরন

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-এর মাধ্যমে স্পেশিয়ল অডিও প্রয়োগ করার মধ্যে স্পেশিয়ল ক্ষমতা চেক করা এবং স্পেশিয়ল অডিও লোড করার জন্য API বেছে নেওয়া অন্তর্ভুক্ত।

স্পেশিয়াল ক্ষমতা আছে কিনা চেক করা

Spatial audio ফিচার ব্যবহার করার আগে, Session-এ spatial audio কাজ করে কিনা তা চেক করে নিন। নিম্নলিখিত বিভাগে থাকা সব কোড স্নিপেটে, স্পেশিয়ালাইজড অডিও চালানোর চেষ্টা করার আগে ক্যাপাবিলিটি চেক করা হয়।

স্পেশিয়ল অডিও লোড করা

Jetpack SceneCore-এ ব্যবহারের জন্য স্পেশিয়াল অডিও লোড করতে, আপনি নিম্নলিখিত API-এর যেকোনও একটি ব্যবহার করতে পারবেন।

  • SoundPool: ১ এমবির কম সাইজের ছোট সাউন্ড এফেক্টের জন্য আদর্শ। এগুলি আগে থেকেই লোড করা থাকে এবং সাউন্ডগুলি বারবার ব্যবহার করা যেতে পারে। পজিশনাল অডিওর জন্য অডিও লোড করার এটি একটি দুর্দান্ত উপায়।
  • ExoPlayer: মিউজিক ও ভিডিওর মতো স্টেরিও ও সারাউন্ড সাউন্ড কন্টেন্ট লোড করার জন্য আদর্শ। এছাড়াও, ব্যাকগ্রাউন্ডে মিডিয়া প্লেব্যাক করার অনুমতি দেয়।
  • MediaPlayer: অ্যাম্বিসোনিক অডিও লোড করার সবচেয়ে সহজ উপায় প্রদান করে।
  • AudioTrack: কীভাবে অডিও ডেটা লোড করতে হয় সেই বিষয়ে সবচেয়ে বেশি নিয়ন্ত্রণ প্রদান করে। সরাসরি অডিও বাফার লেখার অনুমতি দেয় অথবা আপনি নিজের অডিও ফাইল সিন্থেসাইজ বা ডিকোড করলে।

মিডিয়া ফর্ম্যাট সাপোর্ট করে কিনা তা চেক করুন

কিছু মিডিয়া ফর্ম্যাট Android প্ল্যাটফর্মে কাজ করে। তবে, কোনও নির্দিষ্ট Android XR ডিভাইস অতিরিক্ত ফর্ম্যাট সাপোর্ট করতে পারে, যেমন Dolby Atmos. মিডিয়া ফর্ম্যাট সংক্রান্ত সহায়তার ব্যাপারে কোয়েরি করতে, ExoPlayer-এর AudioCapabilities ব্যবহার করুন:

val audioCapabilities = AudioCapabilities.getCapabilities(
    context,
    androidx.media3.common.AudioAttributes.DEFAULT,
    null,
    emptyList()
)

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-এর পজিশন ও ওরিয়েন্টেশন 3D স্পেসে PointSourceParams কোথায় রেন্ডার করা হবে তা নির্ধারণ করে। MediaPlayer ইনস্ট্যান্সে PointSourceParams এবং এর সাথে যুক্ত entity সেট করতে SpatialMediaPlayer-এ কল setPointSourceParams করুন।

পজিশনাল অডিওর উদাহরণ

নিচের উদাহরণে একটি সাউন্ড এফেক্ট অডিও ফাইল সাউন্ড পুলে লোড করা হয়েছে এবং 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()

    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,
                entity = entity,
                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-এর মাধ্যমে অটোমেটিক অডিও স্পেশিয়ালাইজ করা মোবাইল অ্যাপ অন্তর্ভুক্ত।

স্টিরিও সাউন্ডের ক্ষেত্রে, স্পিকার প্লেসমেন্ট সারাউন্ড সাউন্ডের মতোই হয়, তবে শুধু প্যানেলের বাঁদিক ও ডানদিকে বাঁদিক ও ডানদিকের চ্যানেল যথাক্রমে পজিশন করা থাকে।

আপনার একাধিক প্যানেল থাকলে এবং আপনি যদি বেছে নিতে চান যে কোন প্যানেল অডিও নির্গমন করবে অথবা আপনি যদি চান যে স্টেরিও বা সারাউন্ড অডিও অন্য কোনও Entity-এর সাপেক্ষে রেন্ডার হোক, তাহলে আপনি PointSourceAttributes ব্যবহার করে সেন্টার চ্যানেলের লোকেশন নির্ধারণ করতে পারবেন। বাকি চ্যানেলগুলি আগের মতো সাজানো হবে। এইসব পরিস্থিতিতে, আপনাকে অবশ্যই 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()

    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,
        entity = session.scene.mainPanelEntity,
    )

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

কোড সম্পর্কে মূল বিষয়

আপনার অ্যাপে অ্যাম্বিসোনিক সাউন্ড ফিল্ড যোগ করা

অ্যাম্বিসনিক সাউন্ড ফিল্ড প্লেব্যাক করার সবচেয়ে সহজ উপায় হল, MediaPlayer দিয়ে ফাইল লোড করা। যেহেতু অ্যাম্বিসোনিক সাউন্ড সমগ্র সাউন্ডস্কেপে প্রযোজ্য হয়, তাই পজিশন দেওয়ার জন্য আপনাকে Entity নির্দিষ্ট করতে হবে না। এর পরিবর্তে, আপনি চ্যানেলের সংখ্যা নির্দিষ্ট করে উপযুক্ত অ্যাম্বিসোনিক অর্ডার সহ SoundFieldAttributes-এর একটি ইনস্ট্যান্স তৈরি করেন।

Ambionics-এর উদাহরণ

নিচের উদাহরণে 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 এবং ব্যবহার সংক্রান্ত তথ্য শুধুমাত্র তথ্যমূলক উদ্দেশ্যে দেওয়া হয়েছে।
  • AMBISONICS_ORDER_FIRST_ORDER SceneCore-কে সিগন্যাল দেয় যে সাউন্ড ফিল্ড ফাইল চারটি চ্যানেলকে ডিফাইন করে।