在我的日常音频工作中,经常会遇到需要做大批量语音文件导入、配置的情况,由此产生的批量化处理需求大致可分为三种:
- 第一种,大批量的多性别语音文件的导入及配置需求,例如:游戏中已存在男、女和少女三种性别,需要在Wwise中使用Switch Container来做切换管理,包括新增Switch Container,分配Switch Group及Assign Objects,简单讲:为已有性别进行批量资源导入与Switch配置;
- 第二种,在现有的Switch Container里面重新批量插入一种新增性别的语音文件,简单讲:增添新的性别类别后资源的批量导入与Switch配置;
- 第三种,由于项目语音文件数量庞大,我们采用动态分包加载Soundbank的方式,经常会需要按照地图位面ID(MapID)来批量重新调整音频事件与Soundbank之间的归属。
由于项目的DAU非常高,出于“稳定优先“的考虑,我们让Wwise版本停留在了2016。然而由于此版本的Wwise中还没有WAAPI功能(2017.1才加入),因此当发现每两个月就有两三千句左右的语音需要进行上述三种批量处理的时候,声音设计师心态简直要炸裂了,所以必须要找到办法解决这个问题。以下便是我的处理思路的分享,仅供参考。
注:”位面”在游戏《天涯明月刀》指剧情分支得以展开的地图副本。
需求一的解决思路
针对需求一,可以使用Wwise自带的Template模板功能,将每一句台词三种性别版本的语音文件放到一个文件夹里,再用这个文件夹来新建Switch Container,从而可以批量套用现有的Switch Container的模板。这样做还可以套用模板的Switch Container里的Bus通道设置、流媒体wem设置、Switch Group及Switch的Assign Objects情况等设置,非常实用。如图,两千句语音文件几秒钟便可导入、配置完毕。Template的功能帮我们解决了很多配置的套用,很赞。
封装好的文件夹全选后,选择要套用的模版
开始批量套用模版来新增Switch Containers
然而有一个问题不能忽视:面对两三千的语音文件,将不同性别的语音文件移动到一个文件夹并使文件夹命名与其子项中相同的字段一致,也是个不小的工作量,这时候便需要程序同事帮忙开发一个小工具——AudioGenerateFolder.exe(这里要给同事+鸡腿1)。这个小工具可以批量将不同后缀标记的源文件封装在同一个文件夹,并且新增同名文件夹。
注:
- 小工具的做法很多种,本文只是聊下思路;
- 若使用具备WAAPI的Wwise版本,Bernard Rodrigue提供了用于解决此类需求的Python工具:https://github.com/decasteljau/waapi-python-tools-1/tree/master/auto-rename-container;
- Hou Chenzhong提供了带GUI的该工具的二进制版本,可直接在这里下载使用。
批量新建封装文件夹的小工具
不同后缀文件封装前后的示意图
需求二的解决思路
针对需求二——将新增文件插入到已有Switch Container里,我们可以通过修改Wwise工程中与语音相关的WorkUnit xml文件(下文中统一以项目中采用的Voice.wwu指代)的内容来实现。
已有Switch Container
单个或多个文件的拖拽添加是很容易,但当你有大量的新增的Switch选项需要插入到已有的Switch Container里,数量多到几千个的时候,查找到原有的Switch Container就要耗费大量时间(尽管可以用List View,后来的版本也可以直接在Container Editor里搜索),就更别提一个一个拖拽插入后再做Switch分配设置了。这时候你需要程序同事帮忙开发一个小工具,AudioMoveSwitch.exe(为同事+鸡腿2)。
注:小工具的做法很多种,本文只是聊下思路。
批量修改移动Switch归属的小工具
原理其实就是通过批量修改了Actor-Mixer Hierarchy下的Voice.wwu文件来实现的。
Wwise里面SwitchContainer和待添加的语音
比方说我们现在要把0331_L移动到同名的Switch Container里面,先打开Voice.wwu,搜索关键词0331就会看到SwitchContainer Name="0331",和他的两个“孩子”躺在ChildrenList里。
Voice.wwu里已有的SwitchContainer结构图
这时候”新生儿”0331_L躺在外面,如图:
新增语音文件在Voice.wwu里的结构图
然后我们打开工具里文档,写下”新生儿”0331_L的名字
批处理工具的文档截图
然后再打开Voice.wwu文件就会发现”新生儿”0331_L回到了“妈妈”的怀抱了。
Voice.wwu中三个“孩子”的样子
Wwise工程中三个“孩子”的样子
给几个新生儿找妈妈或许还算容易,给几千个新生儿找到妈妈让他们乖乖躺在摇篮里,通过手动的方式就不容易了。通过截图,大家应该也能明白,把新增语音先导入Wwise中,在Voice.wwu表格中获得ID等信息,然后就是顺着名字做归类,放到同名的SwitchContainer下的ChildrenList里面就好了。
需求三的解决思路
针对需求三,前面也已说到,在我们项目中,语音Soundbank是根据不同的地图位面信息(MapID)进行动态加载的,这要求我们根据MapID来命名Soundbank,从而方便负责程序同事对Soundbank进行查找比对与调用。因此一旦MapID有变更,音频也要做相应调整才能保证正确的调用(反之事件移动到了不同Soundbank亦然)。这种问题若是偶然出现的话还好,但当涉及的事件数量大到一定程度,搜索找到这些音频事件并且移动到正确的Soundbank就变得非常耗时。
为此,我们会首先监测拉取最近的分包比对表格,SoundbanksInfo.xml这时就显得特别有用了。
音频事件在声音引擎和语音配置表格里的Soundbank差异对比
注: 我们的客户端,制定了位面场景ID编号和Soundbank 的命名关键词的一一对应关系,例如:进入一个ID为1000的位面场景,就会自动调用命名中含有关键词1000的Soundbank,例如DIALOG_1000便是依据这样的命名规则设置的。
在我们获取到哪些音频事件需要处理以及它们应该放置的Soundbank归属信息之后,这时候就需要程序同事帮忙开发一个小工具——AudioMoveBank.exe(给同事+鸡腿3)。
注:小工具的做法很多种,本文只是聊下思路。
批量修改移动Soundbank的小工具和读取的信息表格
原理其实就是通过修改了Events路径下的Voice.wwu文件来实现,因为我的操作习惯是每一个Soundbank都会在Events页签下有一个对应的打包放置音频事件的文件夹。
Soundbank的文件夹管理和打开Voice.wwu可以看到的文件夹结构
所以移动音频事件的Soundbank分包,只要在Voice.wwu里面批量修改Folder的归属就好了。
以上就是当我在大批量语音文件管理的思路,感谢Wwise,感谢程序大佬们的技术支持。
评论
黄 耀沛
October 31, 2020 at 12:30 pm
感谢经验!
黄 耀沛
October 31, 2020 at 12:30 pm
感谢经验!