中文互联网上关于技术音频的资料还是比较匮乏,在此我更新根据Wwise SDK官方文档(https://www.audiokinetic.com/zh/library/edge/?source=SDK&id=index.html)所编写的开发文档的相关内容。此文档面向程序员,帮助非音频程序员理解并使用Wwise所提供的接口。目前只完成了部分,待后续部分编写完成后会另行更新。文中不当之处欢迎指出。允许转载,须标明出处。
6.5 第三方音频中间件 – Wwise
6.5.1 音频知识预备
6.5.1.1 模拟信号与数字信号
模拟信号是连续变化的信号,数字信号是自变量因变量均离散的信号。音频领域中,可以简单理解为跟硬件有关的大多是模拟信号,跟软件有关的大多是数字信号。两种不同的信号须通过模拟/数字转化器 (Analog-to-Digital and Digital-to-Analog converters, AD/DA) 实现。
6.5.1.2 数字音频工作站 DAW
数字音频工作站 (Digital Audio Workstation, DAW),俗称编曲软件,是乐手和作曲家的得力助手。有创建音轨,录音或编写MIDI音符,加载音源和效果器插件,导出音频文件等丰富的功能。
6.5.1.3 乐器数字接口 MIDI
数字乐器接口 (Musical Instrument Digital Interface, MIDI) 可以简单理解为一种协议,最早用来解决数字乐器的兼容问题。MIDI信号可以记录音符的音高、时长、力度等参数以及多达128个 (Control Change, CC) 通道。可在DAW中编写MIDI音符通过VST音源发声。
6.5.1.4 虚拟工作室技术 VST
虚拟工作室技术 (Virtual Studio Technology, VST) 是一个软件接口,由Steinberg公司开发。目前市面上绝大多数的软件音色和效果器都以此接口编写或有VST版本,主流DAW均支持VST格式的插件。
VST的两个常见用途是软件音色和效果器。软件音源根据MIDI音符播放采样,现在甚至可以以假乱真。效果器顾名思义,为音频添加均衡(Equalizer, EQ)、压缩(Compress)、延迟(Delay)、混响(Reverb)等效果。发源于硬件,后衍生出软件建模。相比于动辄数百上千甚至上万的硬件效果器,软件版本更为经济,但一些特定的色彩还是非硬件的模拟电路不可。
6.5.1.5 音频总线 Audio Bus
假设我们正在编写有弦乐四重奏的J-Rock,发现弦乐组的低频和电贝斯打成一片。我们可以为第一小提、第二小提、中提、大提以及可能的倍大提琴各自挂一个高频通过滤波器 (High-pass Filter, HPF),但倘若真这么做,CPU占用率一定会非常好看。不如为弦乐编组,即把这几个音轨的输出路由到一个次级总线 (Sub-Bus) 内,再为这个次级总线添加效果。所有的音轨和编组/次级总线输出至 Master 轨道,即音频总线 (Audio Bus) 。
6.5.1.5 响度与电平
响度 (Loudness) 是量度声音大小的知觉量,受主观知觉影响。在同等声强下,不同频率的声音会造成不同的听觉感知。相同听觉感知下自变量频率和因变量声强所构成的曲线称为等响曲线 (Equal-loudness Curves) 。数字音频领域中常用 LUFS 和 LKFS 两种单位,它们在数值上相等。
电平 (Electrical Level) 是指两功率或电压之比的对数,采用 dB 的计数方法。电平表将经 DA(Digital-Analog) 转换后硬件所能输出的最大电压定为 0 dB,因此其他所有更小的电平均为负值。响度表类似,最大值为 0 LUFS 或 0 LKFS。虽然数字电路理论上可以表示无穷大的电平,但超出 0 dB 的部分在模拟电路的输出中会因削波失真而产生爆音。请注意总是让响度和电平保持在 0 以下。
6.5.2 Wwise 简介
Wwise 是由 Audiokinetic (AK) 开发的互动音频解决方案。游戏程序员不一定懂音频,音效师配乐师不一定懂编程。“开枪时随机播放枪声的若干音频并且不重复播放最近播放的两个”这一需求若纯靠代码实现会不难看到音效师和程序员打成一片。Wwise音频引擎可以很好地解耦,游戏程序员只需在角色开枪时向Wwise发送相应音频事件(Event),音效师只需点几下Wwise设置相应事件的播放动作。Wwise使得通过简单代码实现复杂音效变为可能。
6.5.3 Wwise 概念概述
6.5.3.1 事件 Events
事件 (Events) 由 Wwise 用户创建,在 Wwise 对象中指定要执行的动作,如播放音频、设置Wwise对象的参数。
6.5.3.2 声库 SoundBank
声库 (SoundBank) 是包含游戏音频数据的文件。它们可由 Wwise 用户在 SoundBank Manager(SoundBank 管理器)的帮助下生成,也可通过自动化过程定义并生成。
SoundBank 分为初始化Bank和SoundBank两种,前者唯一且包含工程的所有通用信息,后者不唯一且包含Events和事件所需的所有对象和音频数据。游戏须首先加载初始化Bank,再根据需要加载、卸载SoundBank。
6.5.3.3 游戏对象 Game Object
一个 Game Object 通常代表一个游戏元素。对于可以发出声音的各个游戏内元素,需要通过 AK::SoundEngine::RegisterGameObj() 来给它们注册 Game Object。可以为不同角色、发射物等分别注册,也可以为一个角色的不同骨骼注册多个Game Object。
6.5.3.4 切换开关 Switch
角色踩在沙地上与踩在混凝土上有不同的脚步声。涉及根据实时状态切换不同音频时便应使用Switch。
通过使用 Switch 和 Switch Container (切换容器),Wwise 用户可定义每种情境中播放的声音。在 Wwise 中可创建多个 Switch Group(切换开关组)来匹配您可能在多种声音之间进行选择的情形。每组可以包含多个 Swtich。于是 Switch Container 可以使用这些 Switch Group 并将声音与各个 Switch 关联起来。
6.5.3.5 状态 State
角色落入水下时,背景音乐以外的任何音效都应缺少高频变得模糊。要使音频与当前游戏情境匹配起来,应该使用 State。
通过使用 State,Wwise 用户可以高效地根据当前游戏状态,为所要使用的总线、Actor-Mixer(角色混音器)、容器和声音创建不同的属性集合。State 可影响的属性包括Volume(音量)、Pitch(音高)和 Low-pass Filter(低通滤波器)。
6.5.3.6 实时参数控制 RTPC
实时参数控制 (Real-time Parameter Controls, RTPC) 用于根据游戏中发生的实时参数变化,实时控制各种 Wwise 对象(包括音效对象、容器、总线、效果器等)的特定属性。如根据汽车速度改变引擎的响度与音高,根据滑板与雪接触的角度调整摩擦声。Wwise 用户可通过 RTPC 曲线自定义 Real-time Parameter 到实际取值的映射。
6.5.3.7 听者 Listener
Listener(听者)代表游戏中的话筒位置,可用来模拟真实的3D环境声,由Game Object(游戏对象)的位置信息映射到 Listener 的坐标系统中而实现的。须即时更新 Listener 的位置信息,否则声音会出现在错误的位置。
6.5.3.8 环境和 Game-defined Auxiliary Sends
游戏定义的辅助发送 (Game-defined Auxiliary Sends, GDAS) 将音频发送至辅助总线 (Auxiliary Bus),后者被应用若干效果器以模拟特定的环境。狭长隧道的混响具有较小的空间 (Size) 和较长的衰减时间 (Decay Time),而回音山壁的反射声具有较长的预延迟 (Pre-Delay)。我们可以为这两个场景分别建立辅助总线,选择合适的效果器与参数模拟特定环境下的声音特性。
注意,“发送”两字表明将原音频原封不动地额外输出到了另一个总线。以最简单的总线和单个辅助总线的结构为例,辅助总线上的音频经过串联在其上的效果器,再输出至总线,与总线上的原音频叠加。如果需要串联效果器的效果,须将音频到总线的输出调为0(注意并非将音量调为0)。
6.5.3.9 播放限制和优先级
复杂的声学环境下需要播放的声音可能会超出硬件的处理能力。目前大多数游戏都更注重视觉部分,留给音频的性能十分有限。游戏内的音频规模未必会造成大型软件音源般的高内存硬盘占用,过多的效果器却能轻轻松松将CPU占用拉满。
为优化性能,Wwise 引入了播放限制 (Playback Limit) 和播放优先级 (Playback Priority) 两个属性。前者决定可以同时播放的最大声音数,后者决定超出播放限制时哪些声音被保留哪些被省略。例如与角色语音和背景音乐 (Background Music, BGM) 相比,细微的风声和两百米外的鸟叫相对而言没有那么重要。
6.5.3.10 虚声部 Virtual Voice
从优化性能的角度触发,低于特定音量电平的声音不应占用宝贵的处理器机能和内存。声音引擎可以不播放这些无法听到的声音,而将它们放到虚声部列表中排队。当音量电平上升至阈值以上时,声音将移回实声部 (Physical Voice),再次由声音引擎处理。
6.5.3.11 触发器 Trigger
触发器 (Trigger) 是让您启动被称为 插播乐句 (Stringer) 的游戏同步器,Stringer 是根据具体情况自发出现的乐句。这些乐句响应游戏中发生的事件,叠加在当前正在播放的音乐上,并与之混合。触发器的同步机制可以利用已有音乐的节奏使 Stinger 的集成变得天衣无缝。