Wwise SDK 2024.1.2
|
External Source 是在 Wwise 里您可以放到声音对象中的一种特殊类型的源(Source)。它表明在运行时将采用真实声音数据。这对于管理大量对白非常有用。如果没有它,则需要为每行对白准备一个声音对象和一个事件,并需要将声音对象和事件打包到 SoundBank 中,并进行适当的分包管理。如果已经在使用别的系统(例如由人工智能驱动的语音生成器)管理对白,则 External Source 也同样非常有用。
在 Wwise 中创建 External Source 的方式与创建其他源插件一样,都是通过Add Source按钮,如果需要,可让它成为复杂结构的一部分。在游戏端,使用 External Source 播放事件与播放其他声音一样都是通过 AK::SoundEngine::PostEvent 和 AK::SoundEngine::DynamicSequence::Playlist::Enqueue 来实现的。当发送事件时,需要提供用来替换 External Source 的波形文件。具体播放哪个文件,完全由程序员决定。这同时意味着源文件的文件管理是在 Wwise 声音引擎外部来完成的。虽然这需要更多的工作量,但同时也提高了灵活性。
声音引擎使用的波形数据采用专用格式;您需要转码您的输入文件,以便在运行时将它们传输给声音引擎。对此,可通过 Wwise 设计工具中的 External Sources List 文件来实现。这个 XML 文件包含转码所需的全部文件以及所要使用的转码设置。要指定 wsources 文件,请访问 External Sources 选项卡中的 Project Settings。以下是此文件的示例:
Root 属性指定源条目的根路径。如果省略此属性,则工程目录将被视为根路径。Root 路径可以是完整路径,也可以是相对于工程目录的相对路径。
Source 条目指定要转码的一个文件:
External Source 的转码是在生成 SoundBank 时与所有其他文件转码一起自动完成的。注意,已经转好码的文件不会再白白重新转码。
![]() | 注意: 为了避免重新转码,Wwise 会将一些数据保存到输出目录下的 Wwise.dat 文件中。此文件对于游戏来说不是必要的,因此不应包含在最终发布的文件中。如果此文件已被删除,在所有波形文件将重新转码。 |
输入目录的目录结构将相对于根目录复制到输出目录下。在上述示例中,输出目录包含“ExternalSources”文件夹和"Lower Tests\Originals\SFX"文件夹。注意,路径中包含的“..”将被去除,而从该路径中第一个真正的文件夹开始。
通过命令行工具,还可只转码工程的 External Source。例如,此命令将为 Xbox One 转码 External Source,不会产生 SoundBank。
有关命令行工具((WwiseConsole)的详情,请参阅 使用命令行 。
要为声音引擎提供音频数据,您可以在 AkExternalSourceInfo 结构中指定文件名,也可指定数据指针。这样会完全覆盖 Wwise 工程中声音对象上的 Streaming 复选框。当使用数据指针时,您将负责内存管理,并确保在整个播放期间数据一直保持在内存中。
当指定文件名时,文件将被打开,并像正常的流播放文件一样从磁盘中流式播放。文件在磁盘中的位置必须在 Low-Level I/O(底层 I/O) 子系统中通过实现 File Location Resolver(文件位置解析器)来解析。请参阅 Low-Level I/O 了解有关 Low-Level I/O 子系统的详情。
默认的文件位置解析器服务位于 CAkFileLocationBase 中,并作为 SDK 中的示例提供给用户(请参阅 默认底层 I/O 实现 )。该实现不支持子文件夹;它假定各个 External Source 流播放文件与“标准”的流播放文件放在同一位置。
Wwise Stream Manager 会将标记传给 AK::StreamMgr::IAkLowLevelIOHook::BatchOpen() 以便用户正确解析文件位置 (AkFileSystemFlags)。在此抽象层次上,通过使用“公司 ID”(AkFileSystemFlags::uCompanyID),您可以将 External Source 与标准流播放文件区分开来。对于 SoundBank 和标准流播放文件,Wwise 传递的是 AKCOMPANYID_AUDIOKINETIC,而对于 External Source,传递的则是 AKCOMPANYID_AUDIOKINETIC_EXTERNAL。因此您可以使用此值来搜索磁盘别的位置上的 External Source。
![]() | 备注: 对于 External Source,AkFileSystemFlags::bIsLanguageSpecific 要始终设为 false,即使 External Source 包含在“Voice”(语音)声音结构中也是如此。事实上,我们建议您在独立于语言的 Sound SFX 对象中使用 External Source 而不要在 Sound Voice 中使用。当在 AkExternalSourceInfo 中指定文件名或 ID 时,必须从一开始就处理本地化。 |
工程必须包括:
![]() | 备注: 外部文件的扩展名必须是“.wem”。在 External Sources List 文件中,您可以重命名目标文件,但不可更改其扩展名。一旦转码,文件的扩展名始终为“.wem”。如果您将转码好的文件打包成 File Package(文件包),则还需要在代码中用其扩展名“.wem”引用它:File Packager(文件打包器)通过哈希算法来为完整名称(包括扩展名)来生成查询 ID。 |
您可以通过一个单一事件替换许多波形文件。例如,您可以设置装有 3 个 External Source 的序列容器。如果事件可触发播放多个 External Source,则这些 External Source 在整个工程中不得重名(因此各自能有独一无二的 cookie),以便在填充 AkExternalSourceInfo 结构时能够区分它们。
工程必须包括:
For more information about how to use external sources in projects integrated with Unreal, see Wwise Unreal 集成documentation: