XR uygulamanıza üç boyutlu ses ekleme

Jetpack SceneCore'daki üç boyutlu ses özellikleri, Android XR uygulamalarınızda etkileyici ses deneyimleri oluşturmanıza olanak tanır.

Üç boyutlu ses, kullanıcıların 3D ortamda sesi nasıl algıladığını simüle eder. Kullanıcının üstünden ve altından da dahil olmak üzere her yönden gelen ses hissi oluşturur. Sistem bunu, 3D alanda belirli konumlarda bir veya daha fazla "sanal hoparlör" simüle ederek yapar.

Android XR için tasarlanmamış veya Android XR için değiştirilmemiş mevcut uygulamaların sesleri Android XR'de otomatik olarak uzamsallaştırılır. Kullanıcı alanında dolaşırken tüm uygulama sesleri, uygulamanın kullanıcı arayüzünün oluşturulduğu panelden çıkar. Örneğin, bir saat uygulamasındaki zamanlayıcı çaldığında ses, uygulama paneli konumundan geliyormuş gibi duyulur. Android XR, konumsal gerçekçilik için sesi otomatik olarak değiştirir. Örneğin, uygulama paneli ile kullanıcı arasındaki algılanan mesafe, daha gerçekçi bir deneyim için ses hacmini hafifçe etkiler.

Mevcut uygulamaların uzamsal sesi nasıl oluşturduğu hakkında daha fazla bilgi için bu sayfadaki Uygulamanıza stereo ve surround ses ekleme başlıklı makaleyi okuyun.

Uygulamanızı XR için optimize ediyorsanız Jetpack SceneCore, gelişmiş üç boyutlu ses özelleştirmesi için araçlar sağlar. Sesleri 3D ortamda hassas bir şekilde konumlandırabilir, gerçekçi ses alanları için ambisonal ses kullanabilir ve yerleşik surround ses entegrasyonundan yararlanabilirsiniz.

Android XR'de kullanılabilen üç boyutlu ses türleri

Android XR; konumsal, stereo, surround ses ve ambisonal sesi destekler.

Konumsal ses

Konumsal ses, 3D alandaki belirli bir noktadan çalınacak şekilde konumlandırılabilir. Örneğin, sanal ortamınızın köşesinde havlayan bir köpeğin 3D modelini kullanabilirsiniz. Her biri kendi konumundan ses çıkaran birden fazla öğeniz olabilir. Konumsal ses oluşturmak için dosyaların mono veya stereo olması gerekir.

Üç boyutlu stereo ve surround ses

Konumsal, stereo ve surround ses için tüm Android medya biçimleri desteklenir.

Stereo ses, iki kanallı ses biçimlerini ifade eder. Surround ses ise 5.1 surround ses veya 7.1 surround ses yapılandırmaları gibi ikiden fazla kanala sahip ses biçimlerini ifade eder. Her kanalın ses verileri bir hoparlörle ilişkilendirilir. Örneğin, stereo sesle müzik çalarken sol hoparlör kanalı sağdakinden farklı enstrüman parçaları yayınlayabilir.

Çevre sesi, birden fazla hoparlör kanalı kullanılarak gerçekçiliği ve sürükleyiciliği artırmak için genellikle filmlerde ve televizyon programlarında kullanılır. Örneğin, diyalog genellikle merkez hoparlör kanalından çalınır. Uçan bir helikopterin sesi ise helikopterin 3D alanınızda uçtuğunu hissettirmek için sırayla farklı kanallar kullanabilir.

Ambisoni ses

Ambisonic ses (veya ambisonics), ses için bir gökyüzü kutusu gibidir ve kullanıcılarınıza etkileyici bir ses ortamı sunar. Arka planda çevre sesleri veya dinleyiciyi çevreleyen tam küresel bir ses alanını taklit etmek istediğiniz diğer senaryolar için ambisonikleri kullanın. Android XR, birinci, ikinci ve üçüncü derece ambisonics'te AmbiX ambisonic ses biçimini destekler. Opus (.ogg) ve PCM/Wave (.wav) dosya türlerini öneririz.

Jetpack SceneCore ile üç boyutlu ses kullanma

Jetpack SceneCore ile üç boyutlu ses uygulamak, üç boyutlu ses özelliklerini kontrol etmeyi ve üç boyutlu ses yüklemek için bir API seçmeyi içerir.

Mekansal özellikleri kontrol etme

Üç boyutlu ses özelliklerini kullanmadan önce Session cihazınızın üç boyutlu sesi destekleyip desteklemediğini kontrol edin. Aşağıdaki bölümlerdeki tüm kod snippet'lerinde, uzamsal ses oynatılmaya çalışılmadan önce özellikler kontrol edilir.

Üç boyutlu sesi yükleme

Jetpack SceneCore'da kullanmak üzere üç boyutlu ses yüklemek için aşağıdaki API'lerden herhangi birini kullanabilirsiniz.

  • SoundPool: Boyutu 1 MB'tan küçük kısa ses efektleri için idealdir. Bu sesler önceden yüklenir ve tekrar tekrar kullanılabilir. Bu, konumsal ses için ses yüklemenin mükemmel bir yoludur.
  • ExoPlayer: Müzik ve video gibi stereo ve surround ses içeriklerini yüklemek için idealdir. Ayrıca arka planda medya oynatmaya da izin verir.
  • MediaPlayer: Ambisoni ses yüklemenin en basit yolunu sağlar.
  • AudioTrack: Ses verilerinin nasıl yükleneceği konusunda en fazla kontrolü sağlar. Doğrudan ses tamponları yazmanıza veya kendi ses dosyalarınızı sentezlemenize ya da kod çözmenize olanak tanır.

Uygulamanıza konumsal ses ekleme

Konumsal ses kaynakları, PointSourceAttributes ve ilişkili bir Entity ile tanımlanır. Entity öğesinin konumu ve yönü, PointSourceAttribute öğesinin 3D uzayda nerede oluşturulacağını belirler.

Konumsal ses örneği

Aşağıdaki örnekte, bir ses efekti ses dosyası ses havuzuna yüklenir ve Entity konumunda oynatılır.

// 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
}

Kodla ilgili önemli noktalar

  • İlk adım, getSpatialCapabilities() simgesini kullanarak Üç Boyutlu Ses özelliklerinin şu anda kullanılıp kullanılamadığını kontrol etmektir.
  • contentType değerini CONTENT_TYPE_SONIFICATION, usage değerini ise USAGE_ASSISTANCE_SONIFICATION olarak ayarlamak, sistemin bu ses dosyasını ses efekti olarak işlemesine olanak tanır.
  • Önceki örnekte, kodun basit olması için ses dosyası, kullanılmadan hemen önce havuza yüklenir. İdeal olarak, tüm ses efektlerinizi uygulamanızı yüklerken eşzamansız olarak yüklemeniz gerekir. Böylece, ihtiyaç duyduğunuzda tüm ses dosyaları havuzda kullanılabilir.

Uygulamanıza stereo ve surround ses ekleme

Uygulamanıza stereo ve surround ses eklemenin önerilen yolu Exoplayer kullanmaktır. Üç boyutlu ses özelliğini Exoplayer ile kullanma hakkında daha fazla bilgi için Üç Boyutlu Ses kılavuzuna göz atın.

Stereo ve surround ses hoparlörlerinin konumlandırılması

Surround ses hoparlörü yerleşiminde, sanal surround ses hoparlörleri standart bir ITU yapılandırmasında kullanıcının etrafında, bir merkez hoparlöre göre konumlandırılır ve yönlendirilir.

Merkez kanal hoparlörü varsayılan olarak uygulamanın mainPanelEntity bölümüne yerleştirilir. Buna, sesleri Android XR tarafından otomatik olarak uzamsallaştırılan mobil uygulamalar dahildir.

Stereo hoparlör yerleşimi, surround sese benzer. Tek fark, sol ve sağ kanalların sırasıyla panelin sol ve sağ tarafına yerleştirilmesidir.

Birden fazla paneliniz varsa ve sesin hangi panelden çıkacağını seçmek istiyorsanız ya da stereo veya surround sesin başka bir Entity'ye göre oluşturulmasını istiyorsanız merkez kanalın konumunu tanımlamak için PointSourceAttributes öğesini kullanabilirsiniz. Kalan kanallar daha önce belirtildiği gibi yerleştirilir. Bu durumlarda MediaPlayer öğesini de kullanmanız gerekir.

Kullanıcı odasında hareket ettikçe stereo ve surround sesli sanal hoparlörler, hoparlörlerin her zaman en uygun konumda olmasını sağlamak için hareket eder ve ayarlanır.

MediaPlayer veya ExoPlayer'i arka planda stereo veya surround ses oynatmaya devam edecek şekilde yapılandırdıysanız uygulama arka plana geçtiğinde sanal hoparlör konumlandırması değişir. Sesleri sabitleyecek bir panel veya başka bir nokta olmadığından, uzamsal ses kullanıcıyla birlikte hareket eder (yani "kafa kilitli"dir).

Surround ses örneği

Aşağıdaki örnekte, MediaPlayer kullanılarak 5.1 ses dosyası yüklenir ve dosyanın merkez kanalı Entity olarak ayarlanır.

// 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
}

Kodla ilgili önemli noktalar

Uygulamanıza ambisonal ses alanları ekleme

Ambisoni ses alanlarını oynatmanın en kolay yolu, dosyayı MediaPlayer ile yüklemektir. Ambisoni ses, ses ortamının tamamı için geçerli olduğundan konum belirtmek üzere bir Entity belirtmeniz gerekmez. Bunun yerine, kanal sayısını belirten uygun ambisoni sırasıyla SoundFieldAttributes örneği oluşturursunuz.

Ambionics örneği

Aşağıdaki örnekte, MediaPlayer kullanılarak ambisoni bir ses alanı çalınır.

// 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
}

Kodla ilgili önemli noktalar

  • Önceki snippet'lerde olduğu gibi ilk adım, getSpatialCapabilities() kullanarak Üç Boyutlu Ses özelliklerinin şu anda kullanılıp kullanılamadığını kontrol etmektir.
  • contentType ve usage yalnızca bilgilendirme amaçlıdır.
  • AMBISONICS_ORDER_FIRST_ORDER, ses alanı dosyasının dört kanal tanımladığını SceneCore'a bildirir.