音频 ID 与内容:历史版本实测
研究日期:2026-09-21。样本覆盖七个版本、三个英雄,共 42 个 WAD。
不能仅凭音频 ID 判断是不是同一份音频。 内容完全相同,ID 可以改变;ID 不变,内容也可能改变。
两种容易误判的情况
- 换号,内容不变:安妮中文 10.15 → 11.15,48 个旧 ID 全部换掉,47 份唯一 WEM 内容逐字节一致;其中一份对应两个 ID。
- ID 不变,内容改变:安妮中文 14.15 → 15.15,48 个同 ID 的 WEM 原始字节全部改变。
这里的“相同”指 原始 WEM 逐字节相同。没有做试听或转码后的波形比较,不判断重编码前后的声音是否相同。
样本与来源
- 选取 10.15 至 16.15 的七个年度样本,每个补丁选择清单仓库的最高数字构建;这些不是年末最后补丁。
- 英雄为安妮、龙女、乌迪尔,分别读取基础 WAD 和中文 WAD。
- 中文资源按 NA1 Windows GAME 清单中的
zh_CN文件筛选;NA1 是区域,不能当作语音语言。 - 基础 WAD 含多个皮肤及非音频资源,不能解释为仅基础皮肤或纯 SFX;本次未还原 BIN 的皮肤和事件语义。
| 版本 | 构建 | RMAN ID | WAD 数 |
|---|---|---|---|
| 10.15 | 10.15.3300344 | 298E1ED7403A5216 | 6 |
| 11.15 | 11.15.3892308 | 2E5687C51025EE54 | 6 |
| 12.15 | 12.15.4581416 | E495735ABBC9DEE1 | 6 |
| 13.15 | 13.15.5241760 | 12FDF3B9F3B1F941 | 6 |
| 14.15 | 14.15.6070022 | E99F7E660E01A9B9 | 6 |
| 15.15 | 15.15.7016241 | D0073A3FE727D3D5 | 6 |
| 16.15 | 16.15.8024387 | 288A4937B5E53E58 | 6 |
清单来源:Morilli/riot-manifests 的固定提交。 乌迪尔和龙女的样本覆盖重做前后;补丁公告只用于选样,文件是否相同以实际字节比较为准。
中文 WAD 相邻采样对比
“换 ID”按唯一内容计:旧 ID 必须从整个该英雄中文 WAD 的媒体集合消失,同时出现此前没有的新 ID,且两份文件已逐字节比较相等。单纯增加皮肤复用、旧 ID 仍存在,不计入此列。
| 英雄 | 版本区间 | ID 数 | 唯一内容数 | 共有内容 | 严格换 ID | 同 ID 换内容 |
|---|---|---|---|---|---|---|
| 安妮 | 10.15 → 11.15 | 48 → 48 | 47 → 47 | 47 | 47 | 0 |
| 安妮 | 11.15 → 12.15 | 48 → 48 | 47 → 47 | 47 | 0 | 0 |
| 安妮 | 12.15 → 13.15 | 48 → 48 | 47 → 47 | 47 | 0 | 0 |
| 安妮 | 13.15 → 14.15 | 48 → 48 | 47 → 47 | 17 | 0 | 31 |
| 安妮 | 14.15 → 15.15 | 48 → 48 | 47 → 47 | 0 | 0 | 48 |
| 安妮 | 15.15 → 16.15 | 48 → 48 | 47 → 48 | 0 | 0 | 48 |
| 龙女 | 10.15 → 11.15 | 70 → 140 | 70 → 140 | 70 | 1 | 0 |
| 龙女 | 11.15 → 12.15 | 140 → 140 | 140 → 140 | 140 | 140 | 0 |
| 龙女 | 12.15 → 13.15 | 140 → 140 | 140 → 140 | 140 | 0 | 0 |
| 龙女 | 13.15 → 14.15 | 140 → 140 | 140 → 140 | 140 | 0 | 0 |
| 龙女 | 14.15 → 15.15 | 140 → 140 | 140 → 140 | 48 | 8 | 92 |
| 龙女 | 15.15 → 16.15 | 140 → 346 | 140 → 346 | 0 | 0 | 0 |
| 乌迪尔 | 10.15 → 11.15 | 155 → 154 | 155 → 154 | 154 | 122 | 0 |
| 乌迪尔 | 11.15 → 12.15 | 154 → 154 | 154 → 154 | 154 | 0 | 0 |
| 乌迪尔 | 12.15 → 13.15 | 154 → 525 | 154 → 525 | 0 | 0 | 0 |
| 乌迪尔 | 13.15 → 14.15 | 525 → 525 | 525 → 525 | 525 | 1 | 0 |
| 乌迪尔 | 14.15 → 15.15 | 525 → 525 | 525 → 525 | 525 | 0 | 0 |
| 乌迪尔 | 15.15 → 16.15 | 525 → 525 | 525 → 525 | 525 | 0 | 0 |
“严格换 ID”按唯一内容数计;“同 ID 换内容”按 ID 数计。
上表列出 18 组中文 WAD 相邻对比。原研究另保留基础 WAD 对比,共 36 组相邻对比、126 组全部版本对比。 跨版本重复证据不能相加当作独立历史修改次数。
换号证据
以下文件路径以原研究资料目录为根。原始客户端资源留在研究资料中,不随文档发布。
安妮 10.15 → 11.15
378059956 → 1690580653;42,065 字节;容器路径键相同,逐字节一致。
SHA-256: 000d9b6e9604daab47f2669a1edf6378022c9b0985e70c5ae0d6b0c916ac9ffd
旧: extracted/10.15/Annie/zh_CN/media/08ea52f59a09c354/378059956.wem
新: extracted/11.15/Annie/zh_CN/media/08ea52f59a09c354/1690580653.wem龙女 11.15 → 12.15
1034549623 → 2086897524;56,475 字节;容器路径键相同,逐字节一致。
SHA-256: 0237801be2a1de52fcddcfa5bbf981311a3989e7b8a8f68885ee2224b9202a02
旧: extracted/11.15/Shyvana/zh_CN/media/433641a6c0e5289f/1034549623.wem
新: extracted/12.15/Shyvana/zh_CN/media/433641a6c0e5289f/2086897524.wem乌迪尔 13.15 → 14.15
1258231494 → 1258231495;31,058 字节;容器路径键不同,逐字节一致。
SHA-256: 8ae2cc997dc3ae977c2807973f82816584eb6bf4656fe43691a3113b9ca7c610
旧: extracted/13.15/Udyr/zh_CN/media/c2a420152b97d671/1258231494.wem
新: extracted/14.15/Udyr/zh_CN/media/843e514f23b86e8b/1258231495.wemWEM 结构与比较范围
实际样本以 RIFF ... WAVE 开头,含 fmt 、data 等区块;vgmstream 的 Wwise 解析器也按该结构解析。原始 WEM 可以无损复用,但不能假设它没有可变头部。
- 安妮中文 13.15 → 14.15:31 个同 ID 文件字节变化;其中 0 个
data区块字节相同。 - 安妮中文 14.15 → 15.15:48 个同 ID 文件字节变化;其中 0 个
data区块字节相同。 - 安妮中文 15.15 → 16.15:48 个同 ID 文件字节变化;其中 0 个
data区块字节相同。
data 改变仍不能证明听感改变,可能涉及编码或封装。完整 WEM 摘要适用于原始字节复用,不能用来识别所有重编码后听起来相同的声音。
存储复用的实际规模
| 统计项 | 本次样本 |
|---|---|
| 媒体引用次数 | 11,858 |
| 唯一原始内容 | 4,315 |
| 每次引用分别保存 | 301,022,199 字节 |
| 内容只存一份 | 107,091,159 字节 |
| 相比逐次保存减少 | 64.42% |
| 仅在各版本内部去重 | 289,929,090 字节 |
| 再跨版本去重减少 | 63.06% |
这是本次原始媒体样本的字节统计,不是 WAD 压缩率,也不能外推全部客户端或 WAV 的节省率。
当前仓库如何保存
实际 WEM 内容是复用依据,音频 ID 是引用信息。 资源库将内容与索引分开保存,按内容摘要定位对象; 每个版本的 ID 关联到实际内容,不能把关系压扁为全局 ID → 唯一文件。
| 层次 | 保存内容 | 位置或规则 |
|---|---|---|
| 内容对象 | 原始 WEM 完整字节 | audios/_data/<摘要前两位>/<SHA-256>.wem |
| 内容索引 | 版本、语言、实体、皮肤、WEM ID 与摘要的对应关系 | audios/_index/<版本>/<语言>.msgpack |
| 可见目录 | 供浏览与处理的 WEM 路径 | 通过硬链接指向内容对象,不额外复制媒体 |
| 派生结果 | WAV 与手动导出的文件 | 按转换或导出规则保存,与原始 WEM 库分开 |
在同一个资源库里,字节完全相同的 WEM 只存一份数据。不同版本、皮肤或 ID 可以引用同一对象, 不会因多个可见路径重复占用音频内容的磁盘空间;索引和目录项仍有少量开销。
- 同 ID 获得新内容时,记录新的摘要;不同版本分别保留实际对应关系。
- 解包仍须读取实际源文件。BIN 或 ID 没变,不能证明 WEM 内容没变。
- 共享只按完整原始字节判断,不做听感去重;独立导出的 WAV 或 WEM 副本仍会占用空间。
- 硬链接路径共享底层内容;编辑前先导出独立副本。库内链接必须位于支持硬链接的同一卷。
索引结构、写入与恢复接口见 资源库 API;用户查找结果目录见 音频文件与输出目录。
验证与适用范围
- 42 个 WAD 均通过 PyManifest 清单块校验;再次核对 WAD SHA-256。扫描 32,129 个条目,未解决错误为 0。
- 独立读取 WPK 原始偏移表,复核 4,015 个媒体文件名、ID、边界及实际字节;所有严格换号候选均逐字节复核。BNK 使用 DIDX/DATA 边界检查。
- 清单校验使用 PyManifest(riotmanifest 2.10.0,提交
a8cd28d2fc72649669ef24fa7e14cea7264ca0a4,Python 3.10);提取使用 Python 3.13、league-tools 1.2.1、zstd 1.5.7.2。 - 7,615 个类型 4 条目用研究适配的 zstandard 0.25.0 读取连续帧并核对输出长度,全部为 TEX 纹理。此适配没有修改产品依赖或业务代码。
- 七个年度样本能证明期间发生过换号,不能定位发生在哪个具体补丁,也不能从这些 WAD 单独证明英雄全部玩法、事件逻辑或皮肤均未改动。
- 结果是 WEM 文件字节层面的证据,不以 WAD/BNK 大小或哈希变化推断音频更新;未扫描全部英雄,未验证所有未知非标准封装。
- 本次研究的清单校验不进入产品预检;产品仍仅检查资源文件存在。没有修改应用业务代码或执行产品回归测试。
原研究另保留清单、原始 WAD/WEM、完整比较 JSON、相邻版本 CSV 与执行日志。本页从研究报告整理,保留结论、统计口径与可定位的证据,不收录原始客户端文件。