আপনার XR অ্যাপে স্থানিক অডিও যোগ করুন, আপনার XR অ্যাপে স্থানিক অডিও যোগ করুন

প্রযোজ্য এক্সআর ডিভাইস
এই নির্দেশিকা আপনাকে এই ধরনের এক্সআর ডিভাইসগুলির জন্য অভিজ্ঞতা তৈরি করতে সাহায্য করে।
এক্সআর হেডসেট
তারযুক্ত এক্সআর চশমা

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

স্পেশিয়াল অডিও একটি ত্রিমাত্রিক পরিবেশে ব্যবহারকারীরা যেভাবে শব্দ উপলব্ধি করেন, তার অনুকরণ করে। এটি ব্যবহারকারীর উপরে এবং নীচে সহ সব দিক থেকে শব্দ নির্গত হওয়ার অনুভূতি তৈরি করে। সিস্টেমটি ত্রিমাত্রিক স্থানের নির্দিষ্ট অবস্থানে এক বা একাধিক "ভার্চুয়াল স্পিকার" অনুকরণ করার মাধ্যমে এটি করে থাকে।

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

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

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

অ্যান্ড্রয়েড এক্সআর-এ উপলব্ধ স্পেশিয়াল অডিওর প্রকারভেদ

অ্যান্ড্রয়েড এক্সআর পজিশনাল, স্টেরিও, সারাউন্ড সাউন্ড এবং অ্যাম্বিসোনিক অডিও সমর্থন করে।

অবস্থানগত অডিও

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

স্থানিক স্টেরিও এবং সারাউন্ড সাউন্ড

পজিশনাল, স্টেরিও এবং সারাউন্ড সাউন্ডের জন্য সমস্ত অ্যান্ড্রয়েড মিডিয়া ফরম্যাট সমর্থিত। এই ফরম্যাটগুলো ছাড়াও, অ্যান্ড্রয়েড এক্সআর ডিভাইসগুলো ডলবি অ্যাটমস , ডলবি ডিজিটাল এবং ডলবি ডিজিটাল+ অডিও ফরম্যাট সমর্থন করতে পারে।

স্টেরিও অডিও বলতে দুটি চ্যানেলযুক্ত অডিও ফরম্যাটকে বোঝায় এবং সারাউন্ড সাউন্ড বলতে দুইটির বেশি চ্যানেলযুক্ত অডিও ফরম্যাটকে বোঝায়, যেমন ৫.১ সারাউন্ড সাউন্ড বা ৭.১ সারাউন্ড সাউন্ড কনফিগারেশন। প্রতিটি চ্যানেলের সাউন্ড ডেটা একটি স্পিকারের সাথে যুক্ত থাকে। উদাহরণস্বরূপ, স্টেরিওতে গান চালানোর সময়, বাম স্পিকার চ্যানেলটি ডান স্পিকারের চেয়ে ভিন্ন বাদ্যযন্ত্রের ট্র্যাক নির্গত করতে পারে।

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

অ্যাম্বিসোনিক অডিও

অ্যাম্বিসোনিক অডিও (বা অ্যাম্বিসোনিক্স) হলো অডিওর জন্য একটি স্কাইবক্সের মতো, যা আপনার ব্যবহারকারীদের জন্য একটি নিমগ্ন সাউন্ডস্কেপ প্রদান করে। পারিপার্শ্বিক শব্দের পটভূমিতে অথবা এমন অন্যান্য পরিস্থিতিতে যেখানে আপনি শ্রোতাকে ঘিরে থাকা একটি পূর্ণ-গোলাকার সাউন্ড ফিল্ডের প্রতিরূপ তৈরি করতে চান, সেখানে অ্যাম্বিসোনিক্স ব্যবহার করুন। অ্যান্ড্রয়েড এক্সআর প্রথম, দ্বিতীয় এবং তৃতীয়-ক্রমের অ্যাম্বিসোনিক্সে অ্যাম্বিএক্স অ্যাম্বিসোনিক অডিও ফরম্যাট সমর্থন করে। আমরা ওপাস ( .ogg ) এবং পিসিএম/ওয়েভ ( .wav ) ফাইল টাইপগুলো ব্যবহারের পরামর্শ দিই।

Jetpack SceneCore-এর সাথে স্পেশিয়াল অডিও ব্যবহার করুন

Jetpack SceneCore-এর সাথে স্পেশিয়াল অডিও প্রয়োগ করতে হলে স্পেশিয়াল সক্ষমতা যাচাই করতে হয় এবং স্পেশিয়াল অডিও লোড করার জন্য একটি এপিআই বেছে নিতে হয়।

স্থানিক সক্ষমতা যাচাই করুন

স্পেশিয়াল অডিও ফিচার ব্যবহার করার আগে, Session স্পেশিয়াল অডিও সাপোর্ট করে কিনা তা যাচাই করে নিন। পরবর্তী সেকশনগুলোর সমস্ত কোড স্নিপেটে, স্পেশিয়ালাইজড অডিও প্লে করার চেষ্টার আগে ক্যাপাবিলিটিগুলো যাচাই করা হয়।

স্থানিক অডিও লোড করুন

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

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

মিডিয়া ফরম্যাট সমর্থনের জন্য পরীক্ষা করুন

অ্যান্ড্রয়েড প্ল্যাটফর্ম কিছু মিডিয়া ফরম্যাট সমর্থন করে । তবে, কোনো নির্দিষ্ট অ্যান্ড্রয়েড এক্সআর ডিভাইস ডলবি অ্যাটমসের মতো অতিরিক্ত ফরম্যাটও সমর্থন করতে পারে। মিডিয়া ফরম্যাট সমর্থনের বিষয়ে জানতে, এক্সোপ্লেয়ারের 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 টি ত্রিমাত্রিক স্থানে কোথায় রেন্ডার করা হবে। একটি 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(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 দ্বারা স্বয়ংক্রিয়ভাবে স্পেশিয়ালাইজড হয়।

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

যদি আপনার একাধিক প্যানেল থাকে এবং আপনি বেছে নিতে চান কোন প্যানেল থেকে অডিও নির্গত হবে, অথবা যদি আপনি চান যে স্টেরিও বা সারাউন্ড অডিও অন্য কোনো 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(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
}

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

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

অ্যাম্বিসোনিক সাউন্ড ফিল্ড প্লেব্যাক করার সবচেয়ে সহজ উপায় হলো একটি 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-কে জানায় যে সাউন্ড ফিল্ড ফাইলটি চারটি চ্যানেল নির্ধারণ করে।