各位同行老师朋友大家好,我是 JYUN ,给大家拜个晚年。

对于部分 3D 游戏类型(如射击、赛车和开放世界等),空间音频属于较为刚需的内容。但由于不同项目的开发环境、开发周期和游戏引擎等有所不同,这些变量造就了不同的空间音频解决方案。即使空间音频遵循的原理是一样的,但实现方式却有不同。

最近梳理了一些关于空间音频的有趣内容,是我在开发一款 PC FPS 游戏的过程中,利用 Wwise 基础功能构建的一套简易空间音频系统。这套解决方案可以给予玩家一定的空间反馈,且这款游戏也在 Steam 取得了一定成绩,其可行性是可验证的。利用这套系统,可以在不购买第三方插件的情况下,在 Wwise 中实现部分空间音频效果。

这套系统中包含空间音频的 3 个基本组成部分,分别是 3D 定位、早期反射和混响 。这 3 个部分是互相解耦的,所以具备一定的可复用性。下面将这 3 个部分分模块进行整理,在总结部分也会讨论这套方案的缺陷和拓展性。

(文本内容基于个人经验和理解,仅供参考)

本文共分为 3 个模块:

  • 基于 RTPC 3D 定位效果( RTPC-Based 3D Positioning
  • 低消耗的早期反射效果( Low-Cost Early Reflection
  • 自适应混响( Adaptive Reverb
  • 模块 1 :基于 RTPC 3D 定位效果( RTPC-Based 3D Positioning

    首先解决疑问:为什么不直接用 Wwise 中间件的 Positioning 功能?为什么要用 RTPC 来营造 3D 定位效果?

    在我参与这个游戏项目的音频开发时,确定了使用 Wwise 2017 作为音频引擎版本。这个项目的音效在制作时是以立体声素材为基础的。立体声素材经过Wwise的Positioning渲染之后,听感会发生微妙的变化,这导致某些“大体积”音效(如BOSS的攻击等)的宽度和临场感会与我们设计师的意图出现细微出入。

    其次, Wwise 自带的 Positioning 功能,在总线为 stereo 总线的情况下,位于 Listener 前后方、上下方的声音不会有差异性。想要获得 binaural-like 3D 定位效果,需要结合 Wwise 自带的 Positioning 功能和多声道总线(如 7.1 等),再通过 Auro-Headphone 之类的双耳效应插件,将多声道的声音渲染成立体声。但就必须要购买三方插件( Auro-Headphone 或同类插件)了。

    基于以上条件,我们希望“ 释放 stereo 素材本身的魅力 ”以及“ 还原人耳对于声音定位的听觉习惯 ”,所以当时的决策是通过 RTPC 构建一个基本的 3D 定位效果,再验证其可行性。

    经过一定调研发现,随着音源和人头的夹角发生变化,声音的音色也会有所变化。比如当音源处于人头的后方时,由于耳廓阻挡了部分频段,声音会变得更“闷”。

    其次,音源和人头的夹角变化,也会使声音到达 2 只耳朵的时间有所不同。比如当音源处于人头的正前 / 正后方,理论上声音可以同时到达双耳;但如果音源偏离,声音到达两只耳朵时就具有了时间差(相位差)。

    并且,音源和人头的夹角变化之后,音源离两只耳朵的距离不一样,也会导致双耳接收到的声音有一定的音量差。

    以上是属于 HRTF 和双耳效应( Binaural Effect )相关的讯息,可以在下列链接中查看详情:

    Head-related transfer function - Wikipedia

    双耳效应_百度百科

    在实践中发现,当音源的空间信息变化时,引入少量的音高( Pitch )变化,所带来的空间感知会更明显更有效。

    结合以上信息,当使用 RTPC 构建 3D 定位时,需要注意实现以下功能:

  • 发声体与监听者的距离产生变化时,会带来音量、频响和音高的变化;
  • 发声体与监听者的水平夹角产生变化时,会带来左右声道的音量、频响、音高和时间差的变化;
  • 发声体与监听者的垂直夹角产生变化时,会带来频响的变化(本文未展示)
  • 基于以上要求,可以推导出所需的调制源为: Distance Azimuth Elevation 结合 Aux Bus 2D panner Wwise Delay Wwise EQ 等,以及容器上的 Filter Makeup Gain 等参数,便可以粗略地还原出双耳效应。

    【操作篇】

    1. 总线设置

    如上图,首先建立 1 3D 音效总线(此处命名为 9_sfx_3dframe ),并将 Channel Configuration 设定为 2.0

    在该音效总线下建立 1 2D 总线和 1 3D 总线(这 2 条总线的 Channel Configuration 跟随父级即可)。

    3D 总线下方建立 4 Aux Bus ,分别用于表现 左直达声、右直达声、左延迟声、右延迟声 (此处的直达和延迟不是指混响或延迟效果器中的参数,而是双耳效应中直达耳朵和延迟到达耳朵的声音)。这 4 条总线的 Channel Configuration 跟随父级即可,并用 Speaker Panning ,将这 4 Aux Bus 分别 pan 到极左、极右、极左、极右(下图以左延迟声为例):

    在左右延迟声通道中,插入 Wwise Delay EQ ,参数如下图所示:

    这里值得一提的是 Delay Time 的设置:根据双耳效应,两只耳朵间的距离所能造成的声音的时间差应该是 1ms 之内;根据哈斯效应, 50ms 以上的时间差又会被感知成 2 个声音。最终根据实测, Delay Time 设置为 20ms 时,双耳时间差的感知效果较为显著。这是根据在实际体验而非物理学所设定的非严谨参数。

    此外,在 EQ 中用高频搁架削减了 2khz 以上的声音,因为 同一个声音中的各个频段绕过头部的能力各不相同,频率越高的能量,被人头衰减就越大。所以高频声音被削掉,中低频保留。

    最后在需要应用 3D 定位的容器上,按下图发送 Output Bus Aux Sends 。如果是同一个游戏单位的音效,也可以在 Actor-Mixer 上做这一步:

    至此,总线设置完毕。

    2. 容器及RTPC设置

    由于这个 Demo 已经在 Actor-Mixer 上设置好路由了,所以无需再设置路由。 Positioning 页面也无需特殊设置,注意不要打开额外的 Positioning 功能即可:

    RTPC 界面,需要设置 11 RTPC 来还原水平面上的 3D 定位效果:

    接下来将单独分析每一条 RTPC 的作用,首先是距离相关的参数:

    1. 距离控制音量( Object 越远,音量越低),这里选择控制 Make Up Gain 。这个选择和 Wwise 的容器通路相关,如果 Make Up Gain 降低了, Output Bus Aux Send 的发送电平也会相应降低

    image013
    2. 距离控制低切( Object 越远,低频保留越少)

    image015
    3. 距离控制高切( Object 越远,高频保留越少)

    image017
    4. 距离控制音高( Object 越远,音高逐渐下降,最多下降 50 音分)

    以上是距离控制的参数。由于不同游戏的视角、视野大小、模型大小、场景大小都不同,所以距离变化所带来的音画感知也不同。举个例子,下图两张灭霸,同样的方向和模型大小,离美队的距离也是一样,但由于镜头大小不同,很可能会造成不一样的声音期待:

    所以需要根据游戏表现来调整上述参数,直到找到最合适的参数。

    接下来分析角度相关的参数。这是一个由立体声总线和 3D 单声道总线组成的系统,先默认:

    1. 当发声体处于监听者的正前 / 正后方时, 应该听到仅立体声总线的信号;

    2. 当发声体处于监听者的正左 / 正右方时,立体声总线的信号消失,仅 听到由一边直达声和另一边延迟声所组成的立体声信号 ,从而增强极左极右的听觉效果;

    3. 当发声体处于监听者的其他方向时,应该听到由 立体声总线、一边直达声和另一边延迟声所组成的立体声信号。 并且通过这 3 种信号的配比和调制,达成 3D 效果。为了达成这个目标,需要以下 RTPC

  • 角度控制 2D Bus 发送量
  • 角度控制直达声的发送量
  • 模块 2 :早期反射( Early Reflection

    【需求篇】

    在空间音频系统中,早反射不仅反馈定位信息,也反馈空间材质信息。在2017年之前,Wwise Reflect还没有推出。实际上 Overwatch于16年的Wwise Tour 就提到,使用RTPC控制Quadra-Delay效果器,可以塑造精确的早反射效果。

    分析 Overwatch 的实现方式,可以发现早反射的基本要求为:

  • 应该给予玩家周围反射体的距离信息,即早反射应随玩家与反射体间的距离变化而变化;
  • 应该给予玩家周围反射体的材质信息,即早反射应随反射体的材质变化而变化。
  • Wwise Delay Wwise Guitar Distortion 这两款插件提供了巨大潜力,尽管 Wwise Delay Delay Time 是无法通过 RTPC 来控制,但靠这两款插件配合,能达到一定的早反射效果。

    基于立体声开发的前提,在游戏引擎端需要以监听者为中心收集两侧反射面的距离和材质信息。可以以监听者为中心,向两侧发射射线,这样做可达到上述要求,尽管结果并不是最精确的。为了结果精度更高,可以多加一条向上的射线,来判断上方反射面的距离和材质。将射线的判断结果发送给 Wwise 即可。

    【原理及操作篇】

    Wwise 端,先建立以下 6 条参数,分别是:左侧反射面距离、右侧反射面距离、上方反射面距离、左侧反射面材质、右侧反射面材质和上方反射面材质。

    在定义材质参数之前,需要先了解吸音系数的概念( Noise reduction coefficient - Wikipedia )。吸音系数是一个 0.0~1.0 之间的数值,来概括某种材质对于某个频段声音的吸收效果,数值为 0 时表示完全不吸收该频段,数值为 1 时表示完全吸收该频段声音。以下是常见材质的吸音系数(数据来源: An introduction to reverberation and absorption | Troldtekt ):

    从上表可看出:硬质材料吸音系数都偏低,所以早反射的音染较少;而软质材料则普遍具有更高的吸音系数(尤其是中频和高频),所以早反射的声音会包含更少的中频和高频。这个结论符合日常生活中的空间感知,可以以此为出发点,设置反射面材质的参数。

    此处选择将材质参数范围设置到 0~10 ,其中 0 为无材质(反射最模糊的声音), 10 为最硬材质(反射最保真的声音),即数值越高,吸音系数越低。但由于这个游戏项目中并没有太多不同类型的材质,所以最终定义如下( 0= 默认材质(无材质或肉体), 1= 水面,沙面 =2 ,树木 =3 ,木块 =4 ,石块 =5 ,金属 =6 ):

    设置好参数后,按如下方式设置效果轨道:

    其中 SA Spatial Audio (空间音频)的效果母线, SA_receive 用于接收需要空间音频渲染的声音讯号,但该 Bus 本身不发声( Output Bus Volume 拉到最低,并且在 Aux Sends 中发送到 SA_reflection ):

    SA_reflection 本身也不发声,但通过 Aux Sends 发送到 SA_reflection_L SA_reflection_R ,并通过反射面距离 RTPC 控制发送量:

    (上图展示左反射面距离 RTPC ,右反射面的曲线一样,只是 Y 轴换成 Aux Send Volume 1 ,如图)

    至此,总线设置完毕。

    接着在 SA_reflection_L SA_reflection_R 上依次插入 Wwise Delay Wwise Guitar Distortion

    Wwise Delay 参数如下,由于 Delay Time 不可控制,所以选择了 60ms

    对于早反射的音色控制,主要来自于 Wwise Guitar Distortion 。通过对增益度( Drive )、音色( Tone )和干湿比( Wet/Dry Mix )的控制达到音色塑形的效果:

    3 RTPC 控制 Wwise Guitar Distortion 的音色,从而控制早反射的音色。其中用反射面距离控制干湿比,达到“距离越远,早反射声越模糊”的效果:

    反射面材质控制增益度和音色,达到“反射面越硬,早反射声越还原;反射面越远,早反射声更失真“的效果:

    最后,在 SA_reflection_L SA_reflection_R 上将 Speaker Panning 设置成 Balance-Fade ,并且配置 RTPC ,用两侧反射面和上方反射面的距离控制 Speaker Paning (下图以 SA_reflection_L 为例。左侧反射面距离越远,声音越偏左,反之亦然;上方反射面距离越近,声音越居中,反之亦然):

    【效果展示】:

    (国内观赏 视频通道

    模块 3 :自适应混响( Adaptive Reverb

    【需求及原理篇】

    Wwise的Unity/Unreal集成中提供了与空间音频实现相关的组件,例如ak room组件可以方便地在引擎中控制发送式混响,使混响和场景空间匹配。但在项目不使用 Audiokinetic 空间音频相关的集成组件,也不愿购买第三方插件和 IR (脉冲响应文件)的情况下,实现良好的户外的混响表现是有一定难度的,尽管利用 Wwise Reverb 实现户内混响还是完全可行的。设计的难点在于游戏的美术风格、视野大小和视野方向等元素都影响着玩家对于混响声的期待和感知:对于某些美术风格而言,更写实的混响声并不一定适合。所以在混响的塑造上,有时候艺术要求是高于拟真要求的。

    James Traer Josh H. McDermott 的论文《 Statistics of natural reverberation enable perceptual separation of sound and space 》中提到,不同的空间由于具有不同的材料和几何形状等,导致混响在各个频段上具有不同的消逝时间,这种特异性构成了空间的 Decay Mode 。人耳主要通过 Decay Mode 来分辨各种不同的空间。在这篇论文中,作者还测量了许多日常生活场景的 Decay Mode ,并提供了部分图示。

    所以在塑造游戏混响时,实际上是塑造空间的差异化 Decay Mode 。如果熟悉 FabFilterPro-R 这款混响器,会知道这款插件的强大在于各个频段都可以设定混响量和消逝时间:

    Wwise 自带的两款混响器都不具备这么细致的参数,所以需要利用 Wwise EQ 进行分频。 Wwise Matrix Reverb 则具有可被 RTPC 控制的 Decay Time ,所需的工具是充分的。

    在游戏引擎中,可以通过配置空间的大小(体积)和材质信息,监听者进入空间时,就将信息传送给 Wwise ,用于控制混响的效果。

    【操作篇】

    Wwise 端,首先建立 5 Aux Bus (如下图):

    SA_reverb :用于接收和发送需要混响渲染的声音信号,本身是不发声的。在本工程中, SA_reverb 的信号来自于 SA_receive 。通过控制 4 Aux Sends 的发送量,来控制不同频段的混响发送:

    至此, 总线设置完毕。

    SArvb1~4 则分别进行 4 个频段的混响处理,分别是: 0-250hz 250-2khz 2khz-6khz 6khz 以上。在这 4 Aux Bus 中都插入 Wwise Matrix Reverb Wwise EQ

    Wwise EQ 中,对应各个轨道名来设置截频点(下图以 0-250hz 为例):

    Wwise Matrix Reverb 中,通过控制 Reverb Time 来控制各个频段的 Decay Time ,从而构成差异化的 Decay Mode

    上文提到的控制方式大部分是选择 RTPC ,因为 RTPC 是连续型的控制方式。但混响的控制不需要连续控制,所以可以用 State ,以步进的方式来控制不同频段的混响发送量。先设置 1 State (包含 3 个小房间、大房间、户外):

    但由于 Wwise Matrix Reverb Reverb Time 只能通过 RTPC 控制,所以也需要建立相应的实时参数(但最终依然可以通过 Event 同时控制 State RTPC ,实现步进式的控制)。这里只建立了空间容积参数( room_volume ),因为在本项目中复用了上文提到的反射面材质参数(但为了功能间解耦合,最好是建立混响功能专用的参数):

    【效果展示】:

    (国内观赏 视频通道

    以上是这套空间音频系统的全部内容,利用这套系统可以较低成本地实现空间音频的 3 个基本要素,但使用中也需要注意这套解决方案的缺陷:

    使用 RTPC 构建 3D 定位是具有一定消耗的,实测 10 个同一音效的消耗会比 Wwise 3D 1%~3% ;并且这个方案是为立体声耳机服务的,如果游戏需要输出给环绕声喇叭或立体声喇叭,这套 RTPC 定位方式就不起作用;

    利用射线实现早反射时,由于单条射线判定的结果存在偏差或模糊的情况,如果需要实现更高精度的反射面判定,需要更好的判定方式,或直接用 Wwise Reflect

    同时使用数个 Wwise Matrix Reverb 会带来较高的性能消耗。

    同时,这套解决方案也具备一定扩展性,根据项目可以进行颗粒度的调整。比如在 3D 定位中,如果对仰角有需求,可以引入 Elevation RTPC ;如果在早反射模块需要实现更高精度,也可以增加专属于各个不同方向的早反射轨道,只要增加控制的 RTPC 即可;如果需要在混响上争取更低的性能消耗,可以把数个 Wwise Matrix Reverb 换成 Wwise RoomVerb ,或直接减少混响的分频数量,通过减少同时存在的混响器从而争取更好的性能表现。

    尽管如此, Wwise 官方提供的有关空间音频的组件及插件依然具有强大竞争力,比如在 3D 定位的实现上,可以兼容立体声喇叭、耳机和环绕声喇叭等设备。

    本文基于个人的项目经验及对声音设计的理解,讨论了空间音频的实现思路。一家之言,姑妄论之,不足为训,旨在抛砖引玉,如果对读者有些许帮助,实属我的荣幸。

    Wwise 的存在使我的很多思路能够落地,未来我也会更深入地学习音频设计的技术和艺术,也希望有更多机会和同行老师朋友多做交流。

    在Mac环境下使用Wwise为VikingVillage 进行声音设计

    近日在完成了 Wwise 301 认证课程的学习之后,我以 Unity 商店中提供的 Viking Village 免费 Project 为基础,对其进行了全面的声音设计,并在 Mac...

    16.3.2020 - 作者:孙宇轩

    Wwise Unreal 音频整合指南

    在此跟大家介绍一下由我们在 Game Audio Resource 的朋友制作的 Wwise 2019.1.4 Unreal 4 音频整合指南。...

    10.9.2020 - 作者:Game Audio Resource

    利用 Wwise 设计基于循环的汽车发动机声音 | 第 1 部分

    在本系列博文中,我们将介绍如何利用 Wwise 设计基于循环的汽车发动机声音(文中配有相关音频示例,及有关汽车的基础知识)。 ...

    26.1.2022 - 作者:阿托•科伊维斯托 (Arto Koivisto)

    在线游戏的迭代式发布管理

    《黎明杀机》是一款制作时间紧迫并定期进行更新的在线游戏。为了避免在缺少提醒的情况下发布在线Wwise SoundBank更新并做到对未来功能的及时支持,我们开发了以下的Wwise工程更新流程。...

    14.4.2022 - 作者:比特里克斯.摩尔什(BEATRIX MOERSCH)

    《寄梦远方(SEASON: A letter to the future)》 | 将现场录音融入到游戏玩法中

    《寄梦远方(SEASON: A letter to the...

    7.1.2025 - 作者:Vibe Avenue

    在 Wwise 中结合使用样本和粒子合成技术构建发动机声音模型

    简介...

    2.7.2025 - 作者:Rakip Galiev