This mammoth guest contribution comes to us from Sound Designer Chris Lane. Chris is an independent sound designer and audio programmer based in Los Angeles. His recent credits include Black Panther, the Childish Gambino VR Experience: Pharos, and Apple’s Logic/Garageband. For this month’s theme of “Eureka!”, Chris put on his lab coat and did some in depth experimentation comparing a few different spatializer plugins. Below are his findings…
While speaking with a VR developer recently, the topic of 3D audio came up. I told him he should try spatializing his sounds with a proper spatialization plugin. The obvious questions came next:
- “How will I benefit?”
- “Which one should I use?”
This article is one sound designer’s trip (mine) through trying to answer those questions. We’ll take a look at three spatialization plugins and what they each bring to the table. There is no coding or scripting required to use any of the features covered.
This Week’s Contestants
(Come on down, and up, and all around)
To keep us focused, I wanted to test out a few top options that met these requirements:
- Free to use and ship in your app.
- Currently supported by active development.
- Cross-platform compatibility with Unity (my testing platform)
The following spatializer plugins hit all three:
- Oculus Spatializer by Facebook/Oculus
- Resonance Audio by Google
- Steam Audio by Valve
Spoiler Alert: There Is No Winner
(But they’re all pretty good)
The good news is, you can get these plugins up and running easier than you think, and the core sound quality is very good across all three. The differences are mostly in workflow and capabilities.
However, I can’t tell you for sure which one you should use. That will depend on your project’s needs and priorities.
Game Engine or Middleware?
For this review, I’m implementing these plugins directly in Unity. However, the features used and results we hear should still apply if you’re using Unreal or audio middleware like Wwise or FMOD. Not all plugins are compatible with all middleware for deployment across all platforms, though. For more platform compatibility details, check the chart towards the end of the article.
Multiple Levels of Use and Features
(These spatializer plugins are like onions)
One great thing about the current crop of spatializers is that you can choose how far down the rabbit hole you want to go with them. The simplest uses take only seconds to set up. More complex dives could have you tagging every piece of world geometry with custom acoustic materials. As I poked and prodded these plugins to see what they could do, a few levels of complexity emerged.
LEVEL ONE: Basic 3D spatialization
LEVEL TWO: Modeled attenuation and occlusion
LEVEL THREE: Addition of Early Reflections and room setup
LEVEL FOUR: Full Reverberation and advanced geometry tagging.
Today, we’re going to look at Levels One and Two. These are the basics that replace the standard panning + volume used with non-spatialized audio. Unfortunately, this means we won’t get into reflections and reverb. Those can be real power players in excellent spatialization, but we will save that discussion for another day.
And fear not! This review will also not be a technical deep dive on the intricacies of HRTF filtering, binaural audio, ambisonics, or room simulation. It’s also not really a discussion of when to use spatial audio or how it should be creatively deployed differently between games/narratives/AR/VR. This is a “lab coat” kind of day. With that comes all the benefits and caveats of isolated testing.
Download Information and Versions Tested:
You can download each plugin directly from the appropriate developer. For this review, I’m using these specific versions:
LEVEL ONE: Basic 3D Spatialization
Welcome to Level One
Let’s define Level One as the bare minimum addition of the plugin to your project. For some cases, that might be as simple as picking the plugin from a single dropdown menu.
Here’s the good news — any one of these three plugins will provide noticeably improved spatialization. Let’s go through some tests to evaluate.
A Note About The Test Environments And Sounds:These test sounds mostly come from from the Resonance Audio and Oculus Spatializer demos. They are good examples of varied frequency content and common cases. I’m using one of the room environments to help show movement and position, but at no time are any of the room reverbs or reflections enabled. It’s visually a room, but does not impact the sound.
(“We’ll begin, with a spin, trying out spatialization…”)
With non-spatialized audio, spinning the listener around in place would already make a stationary sound shift its balance left or right in your headphones. However, because the whole signal is being panned between your headphones, it sounds very unnatural when an object is completely to one side, and the loudness and closeness feel like they shift as you spin.
To demonstrate, let’s listen to an example of non-spatialized Unity audio, and pay attention to the strangeness of the audio when the cube is fully to your left or right:
Also notice that there is no sonic difference when the sound is completely in front or behind. Using only panning and volume, Unity cannot make a distinction sonically between front and back.
All three plugins will make this a smoother and more natural sound. The goal of spatialization is to realistically reproduce the way we hear a sound’s position in space. Let’s listen to each spatializer performing that same spin test to check if they achieve that.
What to listen for:
– Is the movement smooth and natural?
– Is the volume constant, except for the expected dip when the sound is behind the listener?
– Does the sound quality change strangely at certain angles or when completely to the left or right of the listener?
Oculus Spatializer: Spin test
The circular movement is very smooth with the Oculus Spatializer. The volume is stable, I don’t hear any phasing, and the sound source is clear. I think the Oculus Spatializer performs the best of the three in this basic “where is the sound around me” scenario.
Throughout testing, the Oculus Spatializer was consistently a lower overall volume than the other plugins. If you are switching over an existing project and don’t want your volume to change, you might find that you need to add some gain to make up this difference.
Resonance Audio: 360° Spin Test
Resonance Audio performs well here, too. To me, there is a little bit of an unnatural volume increase when a sound is directly left or right of the listener. I checked this with a recording of plain pink noise, and I heard the same boost. In a larger context (and more natural movement pattern) this might go unnoticed, though.
Steam Audio: 360° Spin Test
With Steam Audio, there are some sudden frequency shifts during the rotation, most evident in the mids and highs. This happens as the spatializing filter is rapidly swapped out at different angles. This will be more or less noticeable depending on your sound. However, when we get to Level Two there is a way to remedy this. So, if you are spatializing an especially constant or noisy source (like an engine or humming machinery), you might want to use some of Steam Audio’s Level Two features.
(Your head is a filter)
Other than sounding really cool, the “acoustic shadow” is a huge part of what makes good spatialized audio work. Acoustic shadowing is basically how a sound that is off to one side is “heard” by the ear on the opposite side. The ear closer to the object will get the most natural, full frequency audio. The opposite ear has to deal with a slight delay of hearing the sound, high frequency filtering from the head sitting inconveniently in the way, and level differences.
As the listener turns around in the spin test, I noticed that low frequency positioning was noticeably different between plugins. This is part of that shadow. I won’t try to guess what each plugin is doing differently under the hood, but this is another opportunity to identify clear differences between plugins and evaluate the naturalness of each.
Here is a little strafing test to isolate this effect. Listen to the lowest rumbles in the noise example, and the bass line in the music.
Oculus Spatializer: Acoustic Shadowing
Resonance Audio: Acoustic Shadowing
Steam Audio: Acoustic Shadowing
Steam Audio’s low frequency content doesn’t seem to move left or right nearly as much as the mid and high frequencies. Listening to the bass line in the music, it sounds more centered between my ears with Steam Audio. The Oculus spatializer sounded like it kept the frequencies together more as they moved. Resonance Audio was somewhere in between.
These kinds of per-ear differences can be the magic in a great binaural rendering, but I sometimes found the effect with Steam Audio a little unnatural, as if the sound was being stretched out over space based on its frequencies. Whether you like this effect or not might be content-specific or personal preference.
(If you want to really impress at a party, call it “Periphony”)
With non-spatialized 3D audio, there is no change in audio based on the height of a sound relative to the listener. All three spatializer plugins, however, will provide a change in sound depending on if the sound is above or below you.
First, let’s check out our baseline, Unity’s native audio engine:
Mostly this ends up just being a volume change as the object gets farther away. There is a little bit of panning when the cube circles overhead, but that’s it. Now, how does this compare to our spatializers:
Oculus Spatializer: Height Test
Compared to the others, the Oculus Spatializer has less low frequency presence when the sound is below you. Oculus Spatializer almost sounds lighter in the low position. The other plugins tend towards the opposite, which is darker and heavier for below and a little lighter when above.
Resonance Audio: Height Test
The lowest position with Resonance Audio sounds the darkest of the three spatializers. It’s a more muffled effect. The movement upwards has the least change from the forward sound. Not having much timbral shift makes the upward position a little less obvious than the other two plugins.
Steam Audio: Height Test
The Steam Audio processing pretty much splits the difference between Oculus and Resonance here. The bottom position is not as dark as Resonance, and loses some low end similar to Oculus. The high position is similar to both Resonance Audio and Oculus Spatializer. In the example with music, I again notice the bass part separating from the rest of the track, as discussed in the Acoustic Shadowing section.
Is there a favorite?
Honestly, all three plugins render a nice vertical effect, especially at the extreme positions where the change is more obvious.
Ultimately I still find height information to be the hardest to reproduce on headphones. It’s one area where I look forward to more improvements on the technical side. Luckily, context will help you here. Even having the cube visually in this demo helps (if you don’t believe me, play them again with your eyes closed). Good overall design will help sell your vertical effect.
Level One Recap:
The most striking thing to me about the results from this Level One test is how little effort is required for such improved realism. You can probably add these plugins in five minutes and have more natural, useful, and believable localization of sound. Because it requires so little effort, you can easily swap them in and out. Find out which plugin might work best with your project’s material.
Now that we have the basics working and are starting to see the light, let’s look at more of the specialized features that really get this spatialization party rockin’.
In most cases this will mean adding one or two components to your workflow. These offer the main tweak-able settings for your spatialization behavior. These behaviors are pretty consistent across engines and middleware. As an example, here are the main control components as presented in Unity and FMOD:
LEVEL TWO: Modeled Attenuation & Occlusion
Here’s a warning upfront. In Level One, we could run a (literally) scripted test of the same sound scenario with each plugin, and compare the results apples-to-apples. In Level Two, the features diverge more. This leads to more evaluation of the capabilities and tweakability of a given plugin. It’s less about “how does plugin A’s occlusion sound versus plugin B’s occlusion”, and is more about “how does plugin A handle occlusion, how does plugin B handle occlusion, and which one is right for my project”.
With that disclaimer out of the way, let’s jump in.
(“Can you hear me now?”)
Attenuation is one part of what makes a sound seem farther away. By default, Unity uses a logarithmic curve for this volume-by-distance processing. However, some spatializer plugins define their own attenuation curves with the goal of sounding more like the natural world.
Oculus Spatializer provides Minimum and Maximum range values for attenuation, and uses its own attenuation curve. Note that this same range and curve will be used for reflections, even if you aren’t using Oculus Attenuation. I think their curve sounds good, and having the Min and Max are a useful customization.
Oculus Spatializer provides another feature: Volumetric Radius. This lets you set a radius around the point source where the sound should feel enveloping and omni-present. If you have a big monster, you might not want their roar to sound like it comes from a single pixel point.
This is more than just loudness, which you might handle my setting a larger Minimum value on your distance attenuation. The positional “enveloping” can make a big difference.
So let’s put all that together. I tested a scene with a few difference scenarios. There is a small fly, a vocalist that should sound natural, and a loud and large boom box. The goal was to have a fly that could only be heard within a few meters range, but a boom box that was audible across the whole scene.
Here’s our example scene using Oculus Spatializer, including the Volumetric Radius feature for the boom box:
Just like Oculus Spatializer, Steam Audio provides its own attenuation model that is designed to simulate more realistic volume falloff over distance. This model, however, doesn’t have settings for Minimum and Maximum audible distances. It sticks to the real-world behavior. This means your initial volume setting is more important than ever. While this is true to scientific accuracy, I wish they included an option to creatively stretch this a bit.
Air Absorption is a subtle but welcome addition. When enabled, high frequencies will be attenuated more than low frequencies as you move further away. It’s a nice, natural effect for distant objects to lose some of their brightness, and I recommend turning this on. Steam Audio is the only plugin to explicitly present this option, but I suppose it’s possible Resonance Audio or Oculus Spatializer could be doing a similar treatment without giving that control to the user.
Here’s a demo of Steam Audio’s attenuation at work:
In Unity, there is no specific Resonance Audio attenuation, and you use the built-in Unity attenuation. In other engines or middleware, though, you’ll find the Min/Max values you might expect.
Directivity gives you the ability to shape how the sound is broadcast out into the world. It can also change the sound based on the angle of the listener to the source. In the real world, standing behind someone while they speak will sound different than standing in front of them. In the same way, standing right in front of them but with your back turned will also muffle the sound. That’s what Directivity is modeling. The HRTF alone will do some of the front/back change for the listener, so I found that less necessary, but having the direction control for the source is very powerful.
You can blend across three shapes that mimic standard microphone patterns. That shape can then be squeezed even more by using the sharpness parameter. I found it very helpful that the shapes are visualized in the component.
Here are two Directivity examples: singing and a big speaker. In the video, we start out with no Directivity. Then, we change those settings so that the sources emit mostly forward, and the listener hears with a forward-bias as well. This results in a darker and quieter sound if the listener goes behind the sound or turns around:
Creatively, this could be very powerful, and you could even layer separate directional sounds for the front and back of something.
This control is not currently provided in Unity, where I’m testing, but is available in the Unreal and FMOD plugins. It is similar to the Volumetric Radius in Oculus Spatializer, and is used to give a sound a footprint larger than a single point-source location.
This is another area with distinctly different approaches between plugins.
Currently, Oculus does not provide any specific occlusion effect. In their features guide, they state “This problem needs to be solved at a higher level than the Oculus Audio SDK due to the requirements of scanning and referencing world geometry.” That doesn’t sound like it’s on their to-do list. So, if you know occlusion is important to you, you’ll either need to work it up yourself on top of Oculus’ spatialization, or choose another spatializer.
Steam Audio’s occlusion is based on tagging geometry in the game engine. It uses the position of the geometry as well as a selectable acoustic material. This allows sound traveling through a wood door to have more bleed than sound trying to travel through a stone wall. This is a very powerful feature. However, it requires additional setup in Unity/Unreal, and it cannot change in realtime.
There are three options for method of occlusion, in increasing order of realism and computational complexity. The most advanced frequency-dependent option allows acoustic materials to separately treat three frequency bands passing through an object. There is significant setup to get this kind of detail, but it can be compelling for realism, and is currently unique to Steam Audio among these three plugins. Listen to how the different modes change the occlusion effect for two different acoustic materials:
By default, Occlusion Method will be set to Raycast. A raycast is like a single line from the sound object to the listener. If that line hits any audio geometry, the full degree of occlusion for that material is triggered.
The second option, however, is a killer feature: Partial. Partial creates a sort of column of lines, so that occlusion can be gradually applied based on how many lines get through and how many are obstructed. Source Radius determines the size of that column. Set the Source Radius to match your object’s radius, and the amount of occlusion will smoothly increase as it is eclipsed by audio geometry. Listen to the difference here between Raycast and Partial modes on an object five meters wide:
Resonance Audio also uses a simple raycast approach to occlusion. This means no gradual transition from clear to occluded. You can choose an Intensity, which changes how much dampening of the sound should happen while occluded, but there is no material-based system like with Steam Audio. Here’s an example:
One nice thing about their solution is that you do not need to do any additional room setup or tagging. Resonance Audio’s occlusion finds objects in realtime.
Occlusion of moving objects:
The fact that you don’t have to pre-export tagged room geometry with Resonance Audio exposes a key difference between Resonance Audio and Steam Audio. Steam Audio cannot update it’s geometry model during gameplay to handle moving objects. That means a wall crumbling or door opening cannot update the occlusion map, so your visually open door would still sound “blocked”.
Resonance Audio can handle moving objects and opening doors without any issue or extra work. Here’s an example of a moving wall, with both Steam Audio and Resonance Audio.
Steam Audio: Moving Occlusion
Resonance Audio: Moving Occlusion
So we end up with two plugins that each do one thing really well.
– Steam Audio handles gradual shifts in occlusion and realistic frequency-dependent acoustic materials, but requires significant setup that can’t change in realtime.
– Resonance Audio uses a less realistic on/off occlusion state, but it requires almost no setup and can respond to realtime changes in the environment.
For now, if one of those features is more important to your project, you’ll have to choose your plugin based on it.
Level Two Odds and Ends
Improving Steam Audio’s jumping frequencies:
As you might remember from our spin tests in Level One, Steam Audio had some issues with sudden frequency shifts. The HRTF was being constantly swapped. I promised that later there would be a solution, and here it is. You want to change your object’s HRTF Interpolation from “Nearest” to “Bilinear”. This option will be in slightly difference places, depending on which engine or middleware you are using.
By default, Steam Audio uses the more efficient “Nearest”, which does the sudden switching to the nearest appropriate HRTF. “Bilinear” interpolates between those jumps, so you will hear a nice smooth transition as you spin around. Compare the difference here with an extreme example of pink noise:
If you have a sound with pretty constant output or broadband content, I strongly recommend using Bilinear interpolation. Valve states that Bilinear interpolation can take up to twice as much CPU, though, so keep that in mind when deciding when to use this.
Sounds that get reaaaally close:
Both Oculus and Resonance Audio specify that they use special rendering for sounds that are closer than roughly arms-length away. Oculus handles this switching automatically and by default. For Resonance Audio, you must enable “Near-Field Effect” in your Resonance Audio Source’s settings. They warn, however, that some sounds can get dangerously loud with this processing, so they provide a gain control.
Evaluating the Oculus near-field effect is difficult since it is always on, but I do find the very close objects to sound realistic. For Resonance Audio, enabling the near-field effect definitely improved the sound of a fly buzzing close to my head. Listen to all three plugins rendering this very close-by fly:
Resonance Audio: Near-field effect
Oculus Spatializer: Near-field effect
Steam Audio: (Has no specific near-field effect)
To my ears, Resonance Audio sounds the best at close range. Oculus is in 2nd place, then Steam.
CONCLUSIONS (For Levels 1+2)
So, can we now better answer our original questions:
– “How will I benefit?”
– “Which one should I use?”
Ease of use
All three plugins have different strengths in terms of ease of use and documentation.
Oculus probably wins the documentation game here. There is well-written documentation for implementation steps, and you’ll also find great design guides, best practices, and deeply detailed technical blogs. There is a specific and active Audio Development forum hosted by Oculus, and free packs of Ambisonics to experiment with.
The Oculus components themselves were pretty approachable, and among the easiest to use. There isn’t really that much you can screw up with them. Just picking the plugin as your spatializer already gets you an immediate benefit. Everything sounds good with little effort.
Overall, I found implementing and using Oculus Spatializer the easiest.
Steam Audio has the most work to do on ease of use and documentation, in my opinion. The room setup of tagging geometry and materials is actually good given the complex results. However, the need to constantly pre-bake your geometry settings from a separate window was a frequent point of frustration, and it slows down experimentation because you can’t change the settings in realtime. That tagging can also only be done in the game engine, so if you’re working in middleware like FMOD then you’ll need to coordinate with your engine team to iterate on occlusion/reflections.
On the documentation side, the online documentation is not the prettiest but does have most of the information you need.
When using Steam Audio, you will sometimes see references to Phonon (Valve bought the company Impulsonic, which created Phonon). I wish they would consolidate their naming/branding here as either Steam Audio or Phonon to reduce confusion.
The component integration here is often the best of the bunch. The Directivity controls are a great example. While changing values in Unity, you get a live-updating graphic in the Inspector and you get the shapes drawn as an overlay in your scene view. There are excellent hover-over tooltips for every control on each component. These are much-appreciated examples of attention to detail.
The online documentation and guides are similar to the Oculus ones. They are helpful and detailed, including general design tips.
Features and Sound Quality
(“How will I benefit?”)
Pros: The Oculus Spatializer was solid throughout. The directionality of objects is clear, I don’t hear jumps or unnatural transitions, and I thought it had the best effects when it came to Acoustic Shadowing. The Volumetric Radius option is handy. The near-field effect for very close sounds is effective and automatic.
Cons: Oculus is the only spatializer here that doesn’t provide some form of occlusion. I hope they add that because it feels like a missing piece compared to the competition.
Pros: Steam Audio’s geometry and acoustic material system is very interesting and opens some creatively exciting doors. Steam Audio has the best sounding occlusion system by far, allowing gradual amounts of occlusion and frequency-dependent transmission through objects.
Cons: Geometry system requires game engine integration. No realtime update possible, so occlusion can get weird with opening doors or moving objects. Not quite as good at rendering really close objects. Default “Nearest” mode for HRTF Interpolation has noticeable filter switching with some sounds.
Pros: Consistently good spatialization, and the near-field effects are very effective. Directivity of sound sources is a big feature and is excellently implemented. Claims to be very mobile-friendly and efficient. Occlusion is calculated in realtime so can handle moving objects/doors. Extensive cross-platform and middleware integrations are supported.
Cons: Occlusion is a pretty basic on/off (with a single settable intensity) which can be unrealistic.
What is sometimes frustrating about these plugins is that they are each so good at certain things, but none of them pulls it all together just yet. My ideal Frankenplugin would probably be the Oculus Spatializer plus Resonance Audio’s directivity and a realtime version of Steam Audio’s occlusion. Bonus points would include Resonance Audio’s attention to UI design.
Seriously, Is There A Winner?
(“Which one should I use?”)
Sorry, I warned you at the beginning there wouldn’t be a winner. But now you’ve seen how these products are different and what they do. While I can’t pick which one is best for your project, maybe now you can.
So, what’s left?
(Even after all that, there’s *more*?)
This review covers one part of full 3D spatialization: the directionality and loudness of the sound. That’s the part that replaces what native Unity 3D sound gives you.
Early reflections (the first sounds we hear bouncing off of walls and floors) and reverb can play an equally important role in properly spatializing a sound. They are also much more complex, specific to your situation, and resource demanding. Reflections and reverberation are deserving of their own article to address how they work and how to approach them.
Ambisonics are another separate but related part of this puzzle. For now, I’ll just add that Oculus Spatializer and Resonance Audio both support AmbiX format ambisonic files with no coding required. Steam Audio supports ambisonic decoding, but right now you’ll need to code it yourself using their low-level C API.
Spatialization can use significantly more computing power than standard non-spatialized panning + volume. In a complex scene you may not be able to spatialize every sound (and you probably shouldn’t creatively, anyway). A mobile device will only play a fraction of the sounds a high-end VR-ready PC can. Performance impact of these plugins scales with the number of spatialized sounds.
However, as an individual with limited testing devices and time, I believe it would be unfair to these developers for me to post specific performance numbers from my test cases. Your target platform, operating system, and scene will almost certainly not match my “lab coat” test scenario.
I did try loading up a larger scene with 20+ simultaneous spatialized sounds. I ran that scene as a standalone Unity app with each spatializer plugin. Watching overall CPU and Memory performance, my general impression is that Resonance Audio was the most efficient, followed by Oculus Spatializer, then Steam Audio.
By design, Resonance Audio should have an advantage here, because they put all their sources into an ambisonic field and then run the spatialization convolution once on that whole field. Most plugins run a unique convolution for every source. The big win here is that it means Resonance Audio has a more fixed performance cost, while most plugins will scale in cost with the number of voices. Resonance Audio has been used in some high-profile mobile VR experiences, which I would suspect is due to this performance efficiency.
Thankfully, some parts of these plugins also offer specific quality options, and you can always manage your performance impact with which features you choose to use at all.
(Does it play well with others)
An objective piece of the puzzle. If you are aiming for a specific platform, you might be limited in your choice. I haven’t tried each of these scenarios personally, so I wouldn’t consider this a definitive chart. It is put together from what the developers claim to support.
That said, Resonance Audio clearly wins the compatibility battle here. With Steam Audio and Oculus Spatializer, there are some cases where additional integration is possible but just not officially supported. Those two also provide lower-level code, so a skilled programmer could wire some things up, too. For example, there isn’t yet a specific off-the-shelf Unreal plugin for Oculus Spatializer, but you could integrate it natively using C++ (if that’s your thing).
Here are simplified compatibility charts for each plugin, based on what I’ve been able to gather from the various developers’ stated compatibility:
Google recently open-sourced Resonance Audio’s source code and DSP, which could be very helpful if you need to customize your spatializer to handle specific features.
Go Forth, and Spatialize!
My hope is that this guide will help you listen for the differences between these (and other) spatialization plugins. I hope it gets you started on a path to experimenting with them. You don’t need to be a programmer to add these. If you’re working in VR you should try them, since headphones are so common and the effects can be so powerful for selling realism and (everyone’s favorite term) immersion. If you’re working on narrative VR and need to direct someone’s attention to a story point, excellent spatialization could be the difference-maker. Spatialization isn’t a magic bullet, and having great fundamental sounds will always be more important, but it’s another technology tool that can add that little bit of magic in the right situation.