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

留下回复

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

更多文章

动态早期反射的声源成像法

在我们的博客《在Unreal 中使用 Wwise Reflect模拟基于几何信息的动态早期反射》中,大家了解了如何用Unreal Integration和Wwise Audio...

9.1.2018 - 作者:塔丽•凯克里基安(THALIE KEKLIKIAN)

十条你得知道的 Wwise Launcher 用法(2019 版)

注:本文基于 2018 年初在 Audiokinetic 公众号上发表的文章《十一条你可能不知道的 Wwise Launcher 用法》,由作者针对软件更新做了改动,不影响操作的截图沿用旧版本。...

15.7.2019 - 作者:李北南

Wwise 2019.2 现已上线!

Wwise 2019.2 现已上线并可以在 Wwise Launcher 的 Wwise 标签页进行下载!以下是关于此版本的新功能摘要。 ...

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

简化 Wwise 音频插件构建管线

就音频插件开发来说,Wwise 与数字音频工作站 (DAW) 有很大的不同。Wwise...

23.3.2020 - 作者:乔尔·罗比哈德(Joel Robichard)

Wwise Authoring Query Language 简介

“Wwise 不过是张电子表格”。作为用户体验团队成员,我们经常会听到有人这样说。事实上,Wwise 不仅是款声音设计工具,Wwise...

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

Wwise+GME游戏语音方案:解锁更多语音玩法,让玩家“声临其境”

导语:...

4.11.2021 - 作者:腾讯云

更多文章

动态早期反射的声源成像法

在我们的博客《在Unreal 中使用 Wwise Reflect模拟基于几何信息的动态早期反射》中,大家了解了如何用Unreal Integration和Wwise Audio...

十条你得知道的 Wwise Launcher 用法(2019 版)

注:本文基于 2018 年初在 Audiokinetic 公众号上发表的文章《十一条你可能不知道的 Wwise Launcher 用法》,由作者针对软件更新做了改动,不影响操作的截图沿用旧版本。...

Wwise 2019.2 现已上线!

Wwise 2019.2 现已上线并可以在 Wwise Launcher 的 Wwise 标签页进行下载!以下是关于此版本的新功能摘要。 ...