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 mempersepsikan suara dalam lingkungan 3D. Teknologi ini menciptakan sensasi suara yang berasal dari segala arah, termasuk dari atas dan bawah pengguna. Sistem melakukan ini dengan menyimulasikan satu atau beberapa "speaker virtual" di lokasi tertentu dalam ruang 3D.

Aplikasi lama yang belum didesain atau diubah untuk Android XR akan memiliki audio yang otomatis di-spasialisasi di Android XR. Saat pengguna bergerak 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 mengubah suara secara otomatis untuk realisme posisi. Misalnya, jarak yang dirasakan antara panel aplikasi dan pengguna akan memengaruhi volume audio secara halus untuk memberikan rasa 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 tingkat lanjut. Anda dapat memosisikan suara secara presisi di lingkungan 3D, menggunakan audio ambisonik untuk medan suara yang realistis, dan memanfaatkan integrasi suara surround bawaan.

Jenis audio spasial yang tersedia di Android XR

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

Audio posisional

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

Stereo spasial dan suara surround

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

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

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

Audio ambisonik

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

Menggunakan audio spasial dengan Jetpack SceneCore

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

Memeriksa kemampuan spasial

Sebelum menggunakan fitur audio spasial, periksa apakah Session mendukung audio spasial. Di semua cuplikan kode di bagian berikut, kemampuan diperiksa sebelum mencoba memutar audio spasial.

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 yang berukuran kurang dari 1 MB, efek suara ini dimuat terlebih dahulu dan dapat digunakan berulang kali. Cara ini sangat bagus untuk memuat audio untuk audio spasial.
  • ExoPlayer: Ideal untuk memuat konten stereo dan surround sound seperti musik dan video. Juga memungkinkan pemutaran media di latar belakang.
  • MediaPlayer: Menyediakan 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 spasial ke aplikasi Anda

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

Contoh audio spasial

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 (session.scene.spatialCapabilities
    .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 = 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
}

Poin penting tentang kode

  • Langkah pertama adalah memeriksa apakah kemampuan Audio Spasial saat ini tersedia dengan menggunakan spatialCapabilities.
  • 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 pool segera sebelum menggunakannya agar kode tetap bersama untuk mempermudah. 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 Anda

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

Penempatan speaker stereo dan surround sound

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 audionya dispatialisasi secara otomatis oleh Android XR.

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

Jika Anda memiliki beberapa panel dan ingin memilih panel mana yang memancarkan 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 bergerak di sekitar ruang mereka, speaker virtual stereo dan surround sound akan bergerak dan menyesuaikan diri 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 berubah saat aplikasi berada di latar belakang. Karena tidak ada panel atau titik lain di ruang untuk menyematkan suara, audio spasial bergerak bersama pengguna (dengan kata lain, "terkunci di 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 (session.scene.spatialCapabilities.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_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
}

Poin penting tentang kode

Menambahkan medan suara ambisonik ke aplikasi Anda

Cara paling sederhana untuk memutar kembali medan suara ambisonik adalah dengan memuat file menggunakan 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 ambisonik yang sesuai yang menentukan jumlah saluran.

Contoh Ambionics

Contoh berikut memutar medan suara ambisonik menggunakan MediaPlayer.

// Check spatial capabilities before using spatial audio
if (session.scene.spatialCapabilities.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(
        session,
        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 tersedia menggunakan hasCapability().
  • contentType dan penggunaannya hanya untuk informasi.
  • AMBISONICS_ORDER_FIRST_ORDER memberi sinyal ke SceneCore bahwa file bidang suara menentukan empat saluran.