Menambahkan audio spasial ke aplikasi XR

Fitur audio spasial di Jetpack SceneCore memungkinkan Anda membuat pengalaman audio yang imersif dalam aplikasi Android XR.

Audio spasial menyimulasikan cara pengguna merasakan suara di lingkungan 3D. Hal ini menciptakan sensasi suara yang berasal dari semua arah, termasuk di atas dan di bawah pengguna. Sistem ini melakukannya dengan menyimulasikan satu atau beberapa "speaker virtual" di lokasi tertentu dalam ruang 3D.

Aplikasi yang sudah ada dan belum didesain untuk atau dimodifikasi untuk Android XR akan memiliki audio yang otomatis di-spatialisasi di Android XR. Saat pengguna berpindah di ruangnya, semua audio aplikasi akan dipancarkan dari panel tempat UI aplikasi dirender. Misalnya, jika timer berbunyi dari aplikasi jam, audio akan terdengar seperti berasal dari posisi panel aplikasi. Android XR akan otomatis mengubah suara untuk realisme posisi. Misalnya, jarak yang dirasakan antara panel aplikasi dan pengguna akan secara halus memengaruhi volume audio untuk memberikan kesan realisme yang lebih besar.

Untuk mengetahui informasi selengkapnya tentang cara aplikasi yang ada merender audio spasial, baca Menambahkan suara stereo dan surround ke aplikasi Anda di halaman ini.

Jika Anda mengoptimalkan aplikasi untuk XR, Jetpack SceneCore menyediakan alat untuk penyesuaian audio spasial lanjutan. Anda dapat memosisikan suara dengan tepat di lingkungan 3D, menggunakan audio ambisonik untuk bidang suara yang realistis, dan memanfaatkan integrasi suara surround bawaan.

Jenis audio spasial yang tersedia di Android XR

Android XR mendukung audio posisional, stereo, suara surround, dan ambisonik.

Audio posisional

Audio posisional dapat diposisikan untuk diputar dari titik tertentu dalam ruang 3D. Misalnya, Anda dapat memiliki model 3D anjing yang menggonggong di sudut lingkungan virtual Anda. Anda dapat memiliki beberapa entity yang memancarkan suara dari setiap posisinya. Untuk merender audio posisional, file harus mono atau stereo.

Suara stereo dan surround yang di-spatialisasi

Semua format media Android didukung untuk suara posisional, stereo, dan surround.

Audio stereo mengacu pada format audio dengan dua saluran dan suara surround mengacu pada format audio dengan lebih dari dua saluran, seperti konfigurasi suara surround 5.1 atau suara surround 7.1. Data suara setiap saluran dikaitkan dengan satu pembicara. Misalnya, saat memutar musik dalam stereo, saluran speaker kiri dapat memunculkan trek instrumen yang berbeda dengan saluran kanan.

Suara surround sering digunakan dalam film dan acara televisi untuk meningkatkan realisme dan pengalaman imersif melalui penggunaan beberapa saluran speaker. Misalnya, dialog sering diputar dari saluran speaker tengah, sedangkan suara helicopter yang terbang dapat menggunakan saluran yang berbeda secara berurutan untuk memberikan kesan bahwa helicopter terbang di sekitar ruang 3D Anda.

Audio Ambisonic

Audio Ambisonic (atau ambisonic) seperti skybox untuk audio, yang memberikan lanskap suara imersif bagi pengguna Anda. Gunakan ambisonics untuk suara lingkungan latar belakang atau skenario lain saat Anda ingin mereplikasi kolom suara sferis penuh yang mengelilingi pendengar. Android XR mendukung format audio ambisonic AmbiX dalam ambisonics urutan pertama, kedua, dan ketiga. Sebaiknya gunakan jenis file Opus (.ogg) dan PCM/Wave (.wav).

Menggunakan audio spasial dengan Jetpack SceneCore

Mengimplementasikan audio spasial dengan Jetpack SceneCore melibatkan pemeriksaan kemampuan spasial dan pemilihan API untuk memuat audio spasial.

Memeriksa kemampuan spasial

Sebelum menggunakan fitur audio spasial, pastikan Session mendukung audio spasial. Di semua cuplikan kode di bagian berikut, kemampuan diperiksa sebelum mencoba memutar audio yang di-spatialisasi.

Memuat audio spasial

Anda dapat menggunakan salah satu API berikut untuk memuat audio spasial untuk digunakan di Jetpack SceneCore.

  • SoundPool: Ideal untuk efek suara singkat dengan ukuran kurang dari 1 MB. Efek suara ini dimuat terlebih dahulu dan suaranya dapat digunakan berulang kali. Ini adalah cara yang bagus untuk memuat audio untuk audio posisional.
  • ExoPlayer: Ideal untuk memuat konten suara stereo dan surround seperti musik dan video. Juga memungkinkan pemutaran media di latar belakang.
  • MediaPlayer: Memberikan cara paling sederhana untuk memuat audio ambisonik.
  • AudioTrack: Memberikan kontrol paling besar atas cara memuat data audio. Memungkinkan penulisan buffer audio secara langsung atau jika Anda menyintesis atau mendekode file audio Anda sendiri.

Menambahkan audio posisional ke aplikasi

Sumber suara posisional ditentukan oleh PointSourceAttributes dan Entity terkait. Posisi dan orientasi Entity menentukan tempat PointSourceAttribute dirender dalam ruang 3D.

Contoh audio posisional

Contoh berikut memuat file audio efek suara ke dalam kumpulan suara dan memutarnya kembali pada posisi Entity.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_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 = PointSourceAttributes(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 = xrSession,
                soundPool = soundPool,
                soundID = pointSoundId,
                attributes = pointSource,
                volume = maxVolume,
                priority = lowPriority,
                loop = infiniteLoop,
                rate = normalSpeed
            )
        }
    }
} else {
    // The session does not have spatial audio capabilities
}

Poin penting tentang kode

  • Langkah pertama adalah memeriksa apakah kemampuan Audio Spasial saat ini tersedia dengan menggunakan getSpatialCapabilities().
  • Menetapkan contentType ke CONTENT_TYPE_SONIFICATION dan penggunaan ke USAGE_ASSISTANCE_SONIFICATION memungkinkan sistem memperlakukan file audio ini sebagai efek suara.
  • Contoh sebelumnya memuat file audio ke dalam kumpulan segera sebelum menggunakannya untuk menjaga kode tetap bersama agar lebih sederhana. Idealnya, Anda harus memuat semua efek suara secara asinkron saat memuat aplikasi sehingga semua file audio tersedia di kumpulan saat Anda membutuhkannya.

Menambahkan suara stereo dan surround ke aplikasi

Cara yang direkomendasikan untuk menambahkan suara stereo dan surround ke aplikasi Anda adalah dengan menggunakan Exoplayer. Untuk informasi selengkapnya tentang cara menggunakan Audio Spasial dengan Exoplayer, lihat panduan Audio Spasial.

Pemosisi speaker stereo dan suara surround

Dengan pemosisian speaker suara surround, speaker suara surround virtual diposisikan dan diorientasikan relatif terhadap speaker tengah, di sekitar pengguna dalam konfigurasi ITU standar.

Secara default, speaker saluran tengah ditempatkan di mainPanelEntity aplikasi. Hal ini mencakup aplikasi seluler yang memiliki audio yang di-spatialisasi secara otomatis oleh Android XR.

Untuk stereo, penempatan speaker mirip dengan suara surround, kecuali hanya saluran kiri dan kanan yang diposisikan di sisi kiri dan kanan panel.

Jika memiliki beberapa panel dan ingin memilih panel mana yang memunculkan audio, atau jika Anda ingin audio stereo atau surround dirender relatif terhadap Entity lain, Anda dapat menggunakan PointSourceAttributes untuk menentukan lokasi saluran tengah. Saluran yang tersisa akan ditempatkan seperti yang disebutkan sebelumnya. Dalam situasi ini, Anda juga harus menggunakan MediaPlayer.

Saat pengguna berpindah-pindah di ruang, speaker virtual stereo dan suara surround akan bergerak dan menyesuaikan untuk memastikan speaker selalu berada dalam posisi yang optimal.

Jika Anda telah mengonfigurasi MediaPlayer atau ExoPlayer untuk terus memutar suara stereo atau surround dari latar belakang, posisi speaker virtual akan diubah saat aplikasi berada di latar belakang. Karena tidak ada panel atau titik lain di ruang untuk mengaitkan suara, audio spasial akan bergerak bersama pengguna (dengan kata lain, "terkunci ke kepala").

Contoh suara surround

Contoh berikut memuat file audio 5.1 menggunakan MediaPlayer dan menetapkan saluran tengah file menjadi Entity.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) {
    // The session has spatial audio capabilities

    val pointSourceAttributes = PointSourceAttributes(xrSession.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.setPointSourceAttributes(
        xrSession,
        mediaPlayer,
        pointSourceAttributes)

    mediaPlayer.setAudioAttributes(audioAttributes)
    mediaPlayer.prepare()
    mediaPlayer.start()

} else {
    // The session does not have spatial audio capabilities
}

Poin penting tentang kode

Menambahkan kolom suara ambisonik ke aplikasi

Cara termudah untuk memutar medan suara ambisonic adalah dengan memuat file dengan MediaPlayer. Karena suara ambisonik berlaku untuk seluruh lanskap suara, Anda tidak perlu menentukan Entity untuk memberikan posisi. Sebagai gantinya, Anda membuat instance SoundFieldAttributes dengan urutan ambisonic yang sesuai yang menentukan jumlah saluran.

Contoh Ambionics

Contoh berikut memutar medan suara ambisonik menggunakan MediaPlayer.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) {
    // The session has spatial audio capabilities

    val soundFieldAttributes =
        SoundFieldAttributes(SpatializerConstants.AMBISONICS_ORDER_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(
        xrSession,
        mediaPlayer,
        soundFieldAttributes)

    mediaPlayer.setAudioAttributes(audioAttributes)
    mediaPlayer.prepare()
    mediaPlayer.start()

} else {
    // The session does not have spatial audio capabilities
}

Poin penting tentang kode

  • Seperti cuplikan sebelumnya, langkah pertama adalah memeriksa apakah kemampuan Audio Spasial saat ini tersedia dengan menggunakan getSpatialCapabilities().
  • contentType dan usage bersifat informatif semata.
  • AMBISONICS_ORDER_FIRST_ORDER memberi sinyal ke SceneCore bahwa file bidang suara menentukan empat saluran.