简化 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

留下回复

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

更多文章

Wwise 2018.1 正式发布了!彩色外观和更多…

Wwise 2018.1 发布了,您可以从 Wwise Launcher 中下载。 全新的彩色 UI 选项自透露以来已经出了不少风头!所以,虽然我们原本想写篇博客来讲讲 UI...

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

在Wwise中进行大批量音频管理的思路分享

在我的日常音频工作中,经常会遇到需要做大批量语音文件导入、配置的情况,由此产生的批量化处理需求大致可分为三种:...

11.5.2020 - 作者:葛鑫

Wwise 2021.1 新增功能 

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

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

关于Wwise插件开发流程

前言...

24.3.2021 - 作者:李昱宸

WAQL 2.0

自 Wwise Authoring Query Language (WAQL) 的第一个版本发布以来已经有几年了。在此之后,几乎没什么改动。最大的改动就是把 WAQL 集成到了 Wwise...

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

Wwise Spatial Audio 2023.1 新增功能 | Reverb Zone

Reverb Zone 简介 在 Wwise 23.1 中,我们为 Wwise Spatial Audio 增添了一个名为 Reverb Zone 的工具。Reverb Zone 本质上来说是...

10.1.2024 - 作者:托马斯•汉森 (Thomas Hansen)

更多文章

Wwise 2018.1 正式发布了!彩色外观和更多…

Wwise 2018.1 发布了,您可以从 Wwise Launcher 中下载。 全新的彩色 UI 选项自透露以来已经出了不少风头!所以,虽然我们原本想写篇博客来讲讲 UI...

在Wwise中进行大批量音频管理的思路分享

在我的日常音频工作中,经常会遇到需要做大批量语音文件导入、配置的情况,由此产生的批量化处理需求大致可分为三种:...

Wwise 2021.1 新增功能 

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