简化 WAAPI

音频编程 / Wwise 技巧和工具

假如你之前从来没用过 Wwise Authoring API (WAAPI),我觉得不妨接着往下读,说不定对你有帮助呢。

我也知道,对于非编程人员,WAAPI 好像有点超纲了,而且不那么容易理解。别着急,听我慢慢说。咱们来看看它会为现有工作方式带来怎样的巨大变化。

虽然会占用你一点时间,但我相信是值得的。

Wwise Authoring API 是什么?

你可能会好奇,为什么我那么推许 WAAPI,它究竟会带来怎样的便利。这个暂且不说,我们先来了解一下它是什么。

在 Wwise 2017.1 版本更新时,Audiokinetic 一同发布了 Wwise Authoring API。从名称不难看出,它是一种 API(译注:API 全称 Application Programming Interface,即应用程序编程接口),也就是用来影响另一程序的代码。对我们而言,这个程序就是 Wwise 设计工具。

WAAPI 的作用是通过网络与 Wwise 进行通信,在程序之间收发信息包。为此,它采用了支持多语言编程的 WAMP 通信方式(译注:WAMP 全称 Web Application Messaging Protocol,即 Web 应用程序消息传输协议)。说白了,就是让你可以使用不同的语言编写 WAAPI 代码,自由地选择以本地方式或通过网络与 Wwise 进行通信。

利用 WAAPI,你可以自动导入音频文件、创建 Event(事件)、大规模修改属性、生成 SoundBank(音频包),甚至创建自定义 GUI(比如打造个性化调音台)。如果你觉得这还不够,可以试试在多个 Wwise 程序之间进行通信(比如以此来对比新旧版本的工程)。没错,我自己就试过。

听起来很神奇,对吧?

对是对,不过它也并非完美无缺。

准入门槛

在 Audiokinetic 首次面向 Wwise 用户推出 WAAPI 时,我都有点不敢相信。这款 API 的潜在用途之广简直让我大开眼界,现在想来都是如此!只消稍微发挥一下想象,就会意识到它将可以用于各种各样的应用,而且会对工作流程带来巨大改进。

但是,我很快发现其他人有点…没闹明白。

Audiokinetic 详尽地阐述了 WAAPI 的各种用途 – 它可以用来完成好多操作!可是,我发现不少非编程人员对于它究竟是什么不甚了解。你可能以为它只是一项普通的 Wwise 新增功能,实际上它允许你根据自身需要灵活地创建自定义功能。

在你带着疑问查阅 API 文档时,可能会发生以下两种情况:

  • 你会为它所提供的众多可能性感到惊叹。
  • 如果你是一位编程新手,可能会望而却步,觉得它没法使用。

第二种情况让我很是担忧。

试想一下:

刚开始,你了解了 WAAPI 是什么,也知道它可以用来干嘛。然后,满心欢喜地想用它创建全新的实用功能。比如,设计一个可以按照计划自动生成 SoundBank 的工具。

接着,你开始仔细查阅 API 文档。开头的内容简单明了,至少各种函数的名称并不难理解。但是,看到 WAMP 示例代码部分的时候,立马就蒙了。

然后,你觉得有点招架不住了,心想“这工作应该交给程序员才对啊”!于是,就让程序员帮你实现自己的创新想法。

哎,等等…可能你们公司压根儿就没程序员这个物种。岂不完了…

就算有程序员,人家可能正忙着修复重大引擎漏洞,或者在设计面向游戏用户的新功能。

然后,就尴尬了…很快你会对 WAAPI 失去信心,懒得再费心研究下去。最后,跟很多人一样,虽然需要这项功能,也的确想用,但是觉得准入门槛太高了点。

这正是我当时要解决的问题。

降低门槛

在专业人士的帮助下,我开始着手简化 WAAPI,让它在 C# 环境下用起来更加简单。

下面就是我们所做的改进:

  • 从公式中移除 WAMP 和 JSON,让最终用户不用直接面对这些难懂的东西。
  • 降低 WAAPI 的使用难度,让音频设计师或音频实现人员可以轻松使用,而无需频频求助于专业程序员。
  • 让它尽量与现有 WAAPI 语法保持一致。这样用户就可以直接参考 WAAPI 文档查阅对象属性等概念(文档中有详尽的列表)。

为了实现上述所有构想,我花几周时间创建了 WaapiCS 封装器(可直接与 WAAPI 进行交互的代码层)。现在通过 MIT 许可证就可免费使用 WaapiCS(也就是说,你可以把它用于商业用途、发布并进行更改 – 只要别忘了我这个原创作者就行)。如需下载源码,请单击文末链接。

那么,它到底好在哪儿呢?下面,我们来对比一下部分代码。

调用ak.wwise.core.getInfo

我们来看下 ak.wwise.core.getInfo 函数调用。在将此函数调用发送给 Wwise 后,将返回有关 Wwise 的常规数据。比如,当前运行的版本以及 Wwise.exe 的路径。

文档中最初提供的示例工程代码是这样的:

2

3

在使用 WaapiCS 时,代码是这样的:

Dictionary<string, object> results = ak.wwise.core.GetInfo();

就这么简单!在调用 ak.wwise.core.GetInfo 时,会返回 Dictionary,以供循环访问。只要你对 C# 编程有点了解,这都不是什么难事儿。

编程术语

在你准备大展拳脚之前,容我先解释一下我到底做了什么,又是怎么办到的。假如你想做一些远程扩展,可能仍需程序员提供一点帮助。要是根本不打算编辑框架,基本上就可以跳过这段了。

两个代码层

WaapiCS 在构建过程中整合了两个代码层。底层为 WaapiCS.Communication,用来通过 WAMP/JSON 与 Wwise 进行通信。它构建有一些简单对象:

  • Connection – 在使用一次性调用时,与 Wwise 建立连接。
  • Subscription – 调用特定 Wwise 函数,然后等待回调。
  • Packet – 该对象包含用户提供的所有参数。在 WAMP 进程中,将发送并转换为 JSON。
  • Results – 该通用 C# 对象包含所有回调的结果。Wwise 可能会返回多种类型的 JSON。在回调后从 JSON 转译时,可利用此对象将 JSON 强制转换为某一特定类型。

顶层(包含在命名空间 ak 内)提供了实际面向用户的 API 调用。为了尽量与 WAAPI 语法保持一致,我统一采用了静态调用方式(这样在 WaapiCS 构建完成后可以剥离或修改顶层)。底层的 Packet 对象通过用户提供的参数构建。假如 Wwise 返回结果,在函数调用结束后就会返回给用户。来看看下面的例子:

4

上面显示的是 ak.wwise.core.remote.Connect 调用。它首先使用了一个字符串参数,也就是想要远程连接的游戏主机 IP。然后,通过其余代码清理 Packet 对象的结果(用过之后要马上清理),设置 WAAPI 所要使用的过程,将主机 IP 添加至 Packet,声明 Wwise 要回调哪个函数,最后通过 connection.Execute 将 Packet 发送至 Wwise。在完成上述所有流程后,将再次清理 Packet 对象以供下次使用。API 中的每个函数都会采用类似方式重复这一模式。

当然,这套面向用户的静态调用可能并不适用于所有团队。正是考虑到这一点,我在构建 WaapiCS 时才采用了两个代码层。其中,底层用来通过 WAMP/JSON 与 WAAPI 进行通信,一般不需要编辑。倘若所在团队想以不同方式来编写面向用户的代码,则可完全剥离并重写顶层,而不会影响 WAMP 通信层。

用途

一般来说,你可以使用 WAAPI 和 WaapiCS 自动处理、批处理或重新构建 Wwise 设计工具相关功能。比如:

  • 批量导入音频文件或创建 Event 和 SoundBank
  • 对工程所用参数、总线等进行大规模修改
  • 按照计划自动生成 SoundBank
  • 在 Wwise 和各个程序之间进行通信
  • 为 Wwise 设计工具创建自定义控制界面
  • 批量创建 TTS VO,并自动导入到 Wwise 中

…诸如此类,不胜枚举。

为了展示 WaapiCS 的具体应用效果,我创建了一个简单的自定义混音界面。

5

以上所示 GUI 采用 C# 编写,可控制 Wwise 内各种总线或对象节点的音量。试想一下类似最新数字调音台的“页面”功能,在 Wwise 与游戏相连时,只需随便单击几下,就可深入整个 Wwise 层级结构,单独微调各个对象或上层混音总线。你将可以轻松保存自定义调音台快照,快速返回一组特定的推子、滑杆,进而调整相应属性或辅助发送。真可谓只有想不到,没有做不到啊!

上图虽未包含太多功能(它只是个原型),但很有条理不是吗?如果需要,你可以在 Wwise 之外轻松构建自定义调音台 GUI,把它设置成自己想要的样子。

当然,也不一定非得是 C# 原型 GUI 设计。您可以把它灵活地嵌入到 Unity、Unreal 或是自研游戏引擎中。甚至,还可映射至 OSC,然后直接在 iPad 或控制器上进行 Wwise 混音。

使用

如果你或所在团队还没想过使用 WAAPI,我希望此刻你能意识到它的必要性。我已经把 WaapiCS 发布到了网站上,虽然仍在不断完善,但不妨先下载下来试用。反正没有商用限制,也不会产生任何费用。

假如你也遇到了上面所说的情况,虽然很想创建一些实用工具,但是苦于没有时间或资源,不妨发邮件给我。我目前承接各种客户委托业务,非常乐意帮您把 Wwise 平台打造得更加易于使用。

Subscribe

亚当·克罗夫特(ADAM T. CROFT)

亚当·克罗夫特(ADAM T. CROFT)

亚当·克罗夫特 (Adam T. Croft) 是一名专业音频软件开发人员,目前居住于美国西雅图。他曾帮助 343 Industries、Turn 10 Studios 和 Bungie 实现了各种创意。亚当善于把天马星空的想法变为现实。另外,他还是个吃货,BBQ 是他的最爱。如需查看他的日志、电子书和软件产品,请登录 https://adamtcroft.com/

 @adamtcroft

评论

新兴 赵

August 29, 2018 at 04:46 am

这简直就是音频设计师的福音啊

新兴 赵

August 29, 2018 at 04:59 am

WaapiCS 已经不能下载了。可以再更新下下载地址吗?

新兴 赵

August 29, 2018 at 04:59 am

WaapiCS 已经不能下载了。可以再更新下下载地址吗?

新兴 赵

August 29, 2018 at 04:59 am

WaapiCS 已经不能下载了。可以再更新下下载地址吗?

Hou Chen Zhong

April 25, 2019 at 12:33 pm

https://github.com/adamtcroft/WaapiCS

留下回复

您的电子邮件地址将不会被公布。

更多文章

人人都能用 WAAPI(二)wwise.core 分支

大家好,我是溪夜。 在《人人都能用 WAAPI(一)概述》中,我们用思维导图对 WAAPI 进行了重新归纳,并在配置好开发环境后,一起用 Python 写了几个简单的小程序,体验了 WAAPI...

29.10.2020 - 作者:汪洋

Wwise Unity 速查表

今天我们来说说 Wwise Unity Integration。这些年来,相关学习资源越来越丰富,随时都可以拿来参考。就拿 Audiokinetic 官方资源来说,YouTube...

19.1.2021 - 作者:麦斯·麦雷蒂·桑德鲁普 (Mads Maretty Sønderup)

Wwise 2021.1 新增功能 

基于对象的音频管线 Wwise 2021.1 现已推出并可通过 Wwise Launcher 下载。下面来简要介绍一下该版本中都有哪些新增功能。...

17.3.2021 - 作者:Audiokinetic (音频动能)

为 Wwise 2021.1 构建插件 | 第 1 部分:背景和目标

大家可能不知道,Wwise 生态系统其实具有很强的可扩展性。有时,各公司要为其项目构建定制的插件,供应商会将自研插件迁移到 Wwise。对此,我们必然要提供相应的支持。新的 Wwise...

27.9.2021 - 作者:米歇尔•多奈斯 (Michel Donais)

开发ReaWwise | 第一部分 - 预生产

10.11.2022 - 作者:伯纳德 罗德里格 (Bernard Rodrigue)

浅谈最近在 Heavy 中对 Wwise 支持所做的更新

目录 简介 安装和使用 新增功能概要 添加了对更多声道配置的支持 随意发送 Event 并设置 RTPC 打包插件以便通过 Audiokinetic Launcher 安装 结语 ...

5.12.2024 - 作者:尤金•乔尔内 (Eugene Cherny)

更多文章

人人都能用 WAAPI(二)wwise.core 分支

大家好,我是溪夜。 在《人人都能用 WAAPI(一)概述》中,我们用思维导图对 WAAPI 进行了重新归纳,并在配置好开发环境后,一起用 Python 写了几个简单的小程序,体验了 WAAPI...

Wwise Unity 速查表

今天我们来说说 Wwise Unity Integration。这些年来,相关学习资源越来越丰富,随时都可以拿来参考。就拿 Audiokinetic 官方资源来说,YouTube...

Wwise 2021.1 新增功能 

基于对象的音频管线 Wwise 2021.1 现已推出并可通过 Wwise Launcher 下载。下面来简要介绍一下该版本中都有哪些新增功能。...