想象一下你正在开发一款具有音频监控系统的“秘密间谍”游戏:这个玩法系统能让你在世界中安插一个隐藏的麦克风。声音在窃听器或者虚拟麦克风的位置捕获并被无线传送到一辆监视车上。车里的玩家会实时听到被窃听房间内的动向。被麦克风捕获的声音会通过车内的“虚拟扬声器”播放。这个扬声器本身是一个虚拟世界中的空间化发声体—该音频的声音恰巧是关卡另一处发出声音的混音。我们甚至会将futz效果应用于这个混音,以便通过扬声器来模仿信号的低保真传输和失真。
Wwise 2017.1引入了这样的能力:在音频信号上对任意数目3D声源的输入进行混音,然后3D空间化。我们把这种“空间化子混音”叫做3D-Bus。本文将展示如何利用Wwise 2017.1中的3D总线来模拟游戏中的特定音频行为。我们选择了这个场景,因为它凸显了Wwise 2017.1设计工具和声音引擎中的几个新的特性和变更。在阅读后,您就能将这些概念应用于其他音频通路的场景,包括在文末要提到的那些。
游戏对象
在示例中,我们至少会注册4个游戏对象,在Wwise 2017.1中,听者也是游戏对象,而游戏对象可以既是听者也是发声体。
- 玩家听者(player listener):这一游戏对象代表角色的耳朵,角色在聆听游戏中的音频。在示例中,这就是在车里听着实时监控的角色。
- 环境声发声体(environmental sound emitter):在游戏中发出声音的对象。也许是一个敌人角色,或者其它对于我们秘密监听小队有用的发声对象。实际上,您的游戏中会有很多这样的对象一起组成一个丰富的环境,但在我们的示例中,简便起见只有一个对象。
- 麦克风(microphone):这一对象代表放置的隐藏麦克风,也就是那个“窃听器”。这一对象的放置很重要,因为只有在听觉范围内(由它们在Actor-Mixer Hierarchy中的衰减曲线决定)的发声对象才能被“收录”,并对麦克风来说是有声音的。
- 扬声器(loudspeaker):发出音频(由麦克风捕获)的空间化混音的发声游戏对象。扬声器的位置代表着声音被转接传输的点。在我们的示例中,扬声器是在一个离原始声源很远的监视车里。但是,如果它离原始声源足够近,则玩家听者能同时听到扬声器和原始声源的混音。
听者-发声体关联
听者发声体关联是通过使用SetListener和SetGameObjectAuxSendValues API 在代码中定义的。它们定义了游戏对象间的关系;也就是,哪个游戏对象会监听其它哪个游戏对象。在Wwise 中,区分发声体和听者游戏对象的唯一方法就是用听者-发声体关联,这个关联是用API在它们之间定义的。
在我们的示例中,我们定义以下的关联:
- 环境声发声体和扬声器的听者是玩家听者。
- 麦克风的听者是扬声器
- 环境声发声体 的听者是麦克风, 这个指派是使用SetGameObjectAuxSendValues API进行的。我们把它设置为一个“辅助发送”听者,这样我们就能在 Wwise 工程中专门指定一条总线来在Wwise Authoring工具中为麦克风的行为建模了。
您可以通过检查Advanced Profiler中的Emitter-Listener 选项卡,来确认您的发声体听者关联设置正确。 请注意,Environmetal_Sound_Emitter 的条目(听者为麦克风)表明了它是向麦克风总线发送的,并且通路类型为“游戏定义”。“游戏定义”的通路类型是指发声体-听者关联和输出总线是使用游戏定义的发送API来确定的。而另一方面,“用户定义”的通路类型指的是输出总线是由Wwise工程(在Master-Mixer Hierarchy中,输出总线是父级总线,而在Actor Mixer Hierarchy中,输出总线在General Setting选项卡里) 定义的。如果通路类型是“用户定义”,则Bus栏将会是空的,因为一个已知名称的对象有可能有任意数量的声部或总线,其中每一个都有工程(换句话说,就是用户)定义的独特输出总线。与“用户定义”通路类型相关联的听者游戏对象是由SetListeners API建立的——Wwise工程中无法建立发声体-听者关联。
设置Wwise 工程
在Wwise工程中的Actor-Mixer Hierarchy和Master-Mixer Hierarchy作为运行时创建的声部管线的模板。在Wwise 2017.1中, 声音引擎中的总线实例始终关联着游戏对象;但是,工程中定义的通路也依然遵守。我们会特别注意Enable Positioning复选框——这决定了父级或者输出总线是在同一游戏对象上还是在不同的游戏对象上生成,由被指派的听者确定。
- 首先,我们为扬声器创建一条总线,并将其设置为Enable Positioning。这会让Loudspeaker总线的实例在3D空间中拥有独特的位置,该位置由扬声器游戏对象定义。此外,勾选Enable Positioning会让声音引擎将总线连接到每个关联听者的父级总线的一个独特实例上。在我们的示例中,扬声器游戏对象有一个听者,也就是玩家听者, Loudspeaker总线的父级总线就是Master Audio Bus。在运行时,Loudspeaker总线的一个实例在扬声器游戏对象上生成时,会连接到玩家听者游戏对象上Master Audio Bus的一个实例上去。
- 在Loudspeaker总线上,我们要将定位类型设为3D。这会让Wwise相对于下游游戏对象(玩家听者)对 Loudspeaker总线的输出进行空间化。我们要创建并指派一个“扬声器”衰减来定义用扬声器传播声音能传多远 。Loudspeaker总线上的定位选项卡应该最终看起来是这样:
- 为了让街道效果更逼真,我们可以在Loudspeaker总线上添加一个Wwise Guitar Distortion Effect来模拟由麦克风和扬声器引起的信号丢失和失真。该Effect的具体设置就作为练习留给读者,或者是读者的天才声音设计师朋友吧。
- 为了模拟麦克风,我们创建了一条 Auxiliary Bus,它是Loudspeaker总线的子级总线。我们使用辅助总线,这样我们就能将其指派为一个游戏定义的发送的目标,这个发送是在所有麦克风能接收到的游戏对象上的,包括之前提到过的环境声发声体。总线的层级应该看起来是这样:
- 对Microphone辅助总线,我们也必须勾选Enable Positioning复选框;但是我们会把定位设为2D。我们勾选Enable Positioning是因为我们想让Microphone总线实例在一个特定游戏对象(也叫麦克风)上生成,这个游戏对象在3D空间中的位置和下游游戏对象扬声器是不一样的。Enable Positioning这个小小的复选框非常重要!它会告诉Wwise下游总线Loudspeaker应该生成在另一个游戏对象(也叫扬声器)上。
- 我们把定位类型设为2D是因为我们不想让Microphone 总线相对于扬声器进行空间化。在示例中,我们在模拟麦克风和扬声器之间的电信号而不是物理振动——我们不希望麦克风和扬声器间的距离和相对位置影响到声音的声像摆位和衰减。该总线不使用衰减。
- 在Actor-Mixer Hierarchy中,我们需要至少一个能被麦克风收录并被扬声器重新发出的声音。我们创建了一个Actor-Mixer对象,这样它所有的子对象都能共享一样的属性:
- 这里唯一要注意的事就是我们必须勾选‘Use game-defined auxiliary sends(使用游戏定义的辅助发送)’复选框。这让我们能使用辅助发送API在游戏代码中定义对麦克风游戏对象的通路和辅助总线。
- 在‘环境声’对象的 Positioning 选项卡中,我们要确保Enable Positioning已勾选并且定位类型设置为3D。 这样将声音放置在世界中时就会使用游戏对象的位置,并且能确保输出相对于听者的位置进行了空间化。在我们的示例中, 该Event会从环境声发声体游戏对象上发送,该对象的听者是通过辅助发送的麦克风,以及通过输出总线的玩家听者。
A在设置Events、建立SoundBanks并在游戏中发布Event之后,我们可以通过检查Voice Graph(声部图)来确认我们的通路是正确的:
在Wwise 2017.1中,Voice Graph是排除通路故障的强大工具。为了强调关联,游戏对象现在由包含声音和总线对象的大方框表示。可以看到,在示例中,我们有一个 ‘Environmental_Sound’在“Environmental_Sound_Emitter”游戏对象上进行播放。我们有一条辅助总线“Microphone”正在一个同名对象上播放,还有一个 “Loudspeaker”总线也正在同名游戏对象上播放。在链图末尾,有一个“Player_Listener”游戏对象,它有一条Master Audio Bus的实例。
最终在游戏中的音频效果取决于4个游戏对象的位置,以及在这些游戏对象上播放声音或混音时,为这些声音所定义的衰减。而且结果的确是契合我们对于这个场景的直觉期望的——如果玩家听者离扬声器很近,它们就会听到被混音进麦克风的声音;如果玩家听者离环境声发声体很近,它们会直接听到这个声音;最后麦克风 必须足够接近环境声发声体才能将发声体的声音收录进来。
总的来说,我在结尾会再留给大家Wwise 2017.1中新3D总线的几个可能的用法。我也想挑战一下大家,让大家应用在这篇文章中学到的知识来在自己的游戏中创建这些场景。
声学门户
您正在制作虚拟现实游戏,这种游戏非常强调空间化音频。其中非常重要的一点就是真实可信地模拟声学现象,以便维持住玩家的幻想。您可能希望听者能听见相邻房间传来的带有混响的声音。所有房间内的声音需要被混音在一起,进入一个混响单元,然后该特效的输出将进行空间化,并且它的位置就像是从门廊中传出一样。Wwise中新的3D Bus架构让这成为了可能。
早期反射和其他特效
有时候,为每个声部分别应用一个Effect工作量太大,但是将其作为共享总线上的一个发送Effect却又过于宽泛,没有什么用。您真正想要做的其实是为每个发声体游戏对象创建一个总线的实例,然后在实例上应用Effect。空间化可以在子混音的下游做,但如果您有意用插件来做空间化的话,也可以不这样进行。Wwise Reflect就是采用后一策略,利用Wwise中的3D总线架构来为每个发声体生成一组独特的早期反射。这些早期反射是在Reflect插件内相对于听者的位置进行空间化的。.
聚集声音以减少开销
您有这么一个车辆声, 它是由很多种零部件的声音构成,并由一个复杂的RTPC系统驱动。这些部件位于车辆的不同位置,所以您就会为每个发声体使用独立的游戏对象。但是,为每个发声体应用Effects并进行空间化的性能开销太大,所以最好是在听者足够接近的时候才这么做。如果听者足够远,以至于分辨不出微妙的角度差别,您就最好先将所有声音混音,然后再对整个声音组进行处理和空间化。Wwise中的3D总线架构让这种灵活处理成为了可能。
评论