Files
SoundGame/research/new8/batch2-assets-report.md
T
xsl 31372615b2 feat(new8/batch2): 《深海回音》abyss +《雨夜专案》detective 全套交付(多agent流水线:策划→资产→开发→测试→真资产复跑)
- abyss:game.js 242 断言全绿(剧本A-F六路径/氧气门三形态/sonarGate仲裁/结算死窗/双轨看门狗/radio 8项修复继承);资产 148句+11key变体(电台滤波带内能量47-62%→69-80%)
- detective:game.js 265 断言真资产下全绿(矩阵不变式独立重算/指证全路径/评级12组注入/VERDICT死窗/二周目变体);真资产复跑回炉3处实现修复(无进展轨墙钟化/菜单暂停记账/停止播报真停声——mock时长掩盖的正确性bug)
- 资产:TTS 539条×2格式、Mureka 7首 $0.21(累计$1.08/$2.00)、SYN12+SA3 19件(QC抓出1例AAC过冲并修复)、封面×2、check_all_assets 10游戏全绿(abyss 298/298、detective 279/279)
- 平台接线:大厅双卡片、BUCKETS 增 abyss/detective 桶(H4 断言更新 10 游戏)、voice_text.json 10游戏991句
- 回归:14 套件全绿(10 playtest+guide+engine-voice+engine-input+api-smoke 12/12)
- 设计偏差登记:abyss 7条/detective 9条(全为设计内部冲突按承诺清单/归因真话律取优)
2026-09-10 01:40:31 +08:00

122 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 批次 2 资产报告:abyss《深海回音》+ detective《雨夜专案》
> 音频资产管线 agent 产出 · 2026-09-10 · 覆盖任务书 A(语音)/ B(BGM)/ C(音效)/ D(封面)/ E(登记)。
> 总耗时 ≈ **55 分钟**(00:25–01:20,含 3 轮 GPU flock 串行生成、7 个 Mureka 任务、全部 QC 与文档;
> Mureka 与 GPU TTS 并行推进,互不占锁——前者纯 API)。
## 1. 语音(TTS,GPU flock 串行)
| 项 | abyss | detective |
|---|---|---|
| 台词句数 | 148(双性别 127 含 key 11 对 + NPC 平铺 21) | 158(旁白 106 含 key 10 对 + NPC 平铺 52) |
| 生成文件 | (116 主 + 11 key)×2 + 21 NPC = **275 条** ×2 格式 = 550 文件 | (96 主 + 10 key)×2 + 52 NPC = **264 条** ×2 格式 = 528 文件 |
| speaker | DIVER 玩家=Uncle_Fu/Serena + DECK 调度=Dylan/Vivian(VOICE_SPK 逐句覆盖,同性别双音色,radio HOST/PROD 同型:同场景对话两者永不同 speaker) | 旁白全表 Uncle_Fu/Serena,单一 instruct 常量 |
| NPC 平铺 | 小舟 Serena / 老白 Uncle_Fu / 陈医官 Vivian / 高船长 Eric(4 音色,电台滤波见下) | 老葛 Eric / 小顺 Dylan / 周先生 Uncle_Fu / 温太太 Vivian / 秦法医 Serena(5 音色满配,**不加滤波**——18b 头注) |
| `--check` | ALL OK(无时长离群/短句) | ALL OK |
- 台词表进入 `tools/gen_voice_dual.py`(新增 abyss/detective + SPEAKERS/VOICE_SPK["abyss"]/NPCS/NPC_BANDPASS["abyss"]/KEY_LINES 各 11/10 对),**两表一致闭环校验**:一次性脚本(/tmp/verify_batch2.py,未入库)重解析 17b/18b 两份 voice-ids 文档,与脚本内三张表(主表/key/NPC)**逐字 diff PASS**——148/158 句、key 11/10 对、NPC 21/52 全对齐,账目核对(音频条数 275/264)与文档合计一致。
- key 变体落 `voice/<gender>/key/<id>.*`(radio 批次 1 既有引擎约定:`web/engine/audio.js` 候选链前置 `voice/<gender>/key/<id>`;文档中 `<id>_k` 是逻辑 id,落盘无后缀进 key/ 子目录)。
- **abyss 电台滤波(17-abyss.md §5.3)**:convert 转码按船员逐档 `highpass+lowpass+轻压缩`(小舟 420-3200 / 老白 350-3000 / 陈医官 400-3100 / 高船长 300-2800 Hz,均 acompressor threshold=-20dB ratio=3);**已验证生效**:带内能量 47-62%→69-80%,>3.4kHz 高频占比 7.1%(最窄档 gao_a)vs 未滤波 DECK 44.8%,时长与 staging 完全一致;未滤波原声保留在 `tools/gen_voice_dual_wav/abyss/npc/`(不入库)可重滤/回退。DIVER/DECK 不滤波(母船级音质)。
- `extract_voice_text.py` 已刷新 `web/harness/voice_text.json`:**games=10,lines=991,key_variants=185**。
**文档内矛盾检查**(未停下项,均登记不阻塞管线):
1. 17b 头注「双性别组……126 句」与文末合计「双性别 127 句(30+97)」不符——逐行表实数 **127**(30 DIVER + 97 DECK,脚本与文档逐行一致),头注笔误,建议策划改 126→127(不影响任何资产)。
2. 17 号文档 §7.3 写 key 变体落 `voice/<gender>/<id>_k.*`,与引擎实现(`voice/<gender>/key/<id>`,audio.js L365-366)及批次 1 先例/任务书口径不一致——**按引擎约定落盘**(零代码改动铁律),17 号文档该句待策划改写。
3. abyss key 措辞用「左箭头/右箭头/上箭头/下箭头」(17b 原文),dungeon 用「左方向键」——两文档各自定稿措辞,照抄不改写。
## 2. BGM(Mureka API)
7 首全部一次成功,无重试;**总花费 $0.21 ≤ $0.30(预算线),项目累计 $1.08/$2.00**;台账见 `tools/mureka_log.md` 2026-09-09「批次 2」节。
| 曲目 | task id | 选用 choice | 候选时长 | 响度 |
|---|---|---|---|---|
| abyss deck | 160001236664321 | 候选 0(160001381367809) | 192.1 / 201.1s | I=-20 |
| abyss dive | 160001429798913 | 候选 0(160001536622595) | 179.8 / 210.6s | I=-20 |
| abyss comms | 160001576402945 | 候选 1(160001689714693) | 213.7 / 168.7s | I=-20 |
| abyss ending | 160001717043203 | 候选 0(160001815478273) | 191.4 / 211.1s | I=-20 |
| detective menu | 160001918435329 | 候选 1 | 232.3 / 219.8s | I=-20(18 号 §8.1 明确) |
| detective board | 160002065039361 | 候选 0 | 216.8 / 233.6s | I=-20 |
| detective verdict | 160002209873922 | 候选 1 | 240.0 / 223.7s | I=-20 |
- 英文 prompt 从 17 号 §5.1 / 18 号 §8.1 表格**逐字照抄**;选用原则同批次 1(拿不准选时长更接近 90s 的候选)。
- 后处理(脚本入库 `web/{abyss,detective}/gen/gen_bgm.sh`):首个强 onset(silenceremove -35dB)→ 93s 裁剪 → 首尾 3s acrossfade(tri) 无缝循环 → loudnorm(TP=-2/LRA=11)→ 44.1kHz → ogg q3 + m4a 128k。**成品全部 90.00s**,mean -20.2 ~ -21.9dB(与在库 BGM 同量级)。
- 响度裁定:abyss 4 首全部 I=-20——MENU 复用 deck 曲、低响度淡入由游戏层 gain 控制(§2.1),无独立 menu pad 曲,radio menu -24 先例不适用;detective 3 首按 18 号 §8.1 明确 -20。雨声底按设计烤进 detective 曲目(省第三声流)。无节奏关键曲目,未跑 bpm_precise。
- flac 原件存 `tools/mureka_out/{abyss,detective}-*/`(不入库)。
## 3. 音效(SYN 程序合成 + SA3 直生成——本批 SA3 token 就绪,无缺失清单)
### 3a. SYN(`web/<game>/gen/gen_sfx.py`,入库可复现)
- abyss 6 件:`sonar_ping`(1.4→0.9kHz chirp 220ms,**-6dBFS 设计指定电平**,回波家族统一音头)、`pipe_knock`(三短三长三短固定节拍金属敲击,节拍精确可复现/断言可数)、`link_beep`(双音上行 0.3s)、`ascent_chime`(上行三音琶音 0.4s)、`ui_confirm ui_menu`(全局先例同款)。
- detective 6 件:签名 `sig_shun`(布掸子两拍)/`sig_wen`(门环二连击)/`sig_fore`(翻页+钢笔划线)、`contra_hit`(小二度金属相击+盖章尾,全游戏最强确认音 -4dBFS)、`contra_miss`(钝木鱼,非 error 音色 -8dBFS)、`turn_tick`(880Hz 木鱼族,dungeon 配方自存一份)。
- **QC(解码回读法,全部通过)**:逐声道真峰值 ≤ -3dBFS、|直流| ≤ 0.001。**铁律首轮即抓出一例真超标**:abyss `link_beep.m4a` AAC 过冲实测 -2.82dBFS(纯弦 MDCT 过冲坑,asset-pipeline.md 有案)——两脚本 encode() 升级为迭代补偿工艺(超限按实测补 volume + 直流预减,dungeon 先例),修复后 -3.67dBFS。
### 3b. SA3(`web/<game>/gen/gen_sfx_sa3.py`,--emit 生成 + 后处理入库)
seed 20260909,steps 8,模型已缓存走 `HF_HUB_OFFLINE=1`;raw 为定长 latent 床(abyss 18.02s / detective 15.05s),one-shot 按活动窗自然修剪(maxs 帽),amb 床整段保留。
| abyss id | 时长s | ogg峰 | RMS | 结论 |
|---|---|---|---|---|
| echo_metal_l / _r | 2.76 | -4.93 | -24.5 | **预 pan 立体声**:mono 下混 + ffmpeg pan 派生,能量只在目标声道(极性断言),dungeon side_* 工艺复用(引擎无运行时 pan) |
| echo_debris | 2.78 | -7.05 | -24.5 | 碎石回波(D2) |
| echo_groan | 4.42 | -5.82 | -25.3 | 船体呻吟(D3 预警/D4,≈设计 4s) |
| static_burst | 2.58 | -8.41 | -24.5 | 通讯静电(z1_a 垫) |
| amb_deep / amb_deck / breath_loop | 18.02 | -12.1/-7.3/-8.2 | -26.8/-29.7/-28.8 | **amb 床只去直流不淡化**(游戏层 buffer.loop,radio/escape 先例),RMS -26 + 峰值帽 -8 |
| spark_flash | 2.24 | -4.13 | -23.7 | D2 危机拍(danger 同窗) |
| valve_close | 2.35 | -5.80 | -25.4 | p4 左 payoff |
| landslide | 5.37 | -5.00 | -22.9 | D4 危机拍(前置渐强) |
| surf_splash | 2.33 | -7.40 | -27.1 | 每潜出水 |
| bell_toll | 2.79 | -4.72 | -26.4 | p9 左 payoff |
| detective id | 时长s | ogg峰 | RMS | 结论 |
|---|---|---|---|---|
| paper_turn | 1.08 | -7.20 | -31.7 | 条目切换内容反馈 |
| sig_ge / sig_zhou / sig_scene | 0.78 / 1.08 / 1.28 | -5.8~-6.8 | -29.8~-35.1 | 证人签名 earcon;**0.78-1.28s 超出文档 0.3-0.5s 指引**(两步+伞抖水类内容下限,见 §6 遗留) |
| gavel | 1.35 | -3.69 | -33.6 | 裁决仪式拍 |
| rain_swell | 7.18 | -10.77 | -26.7 | 认罪链垫(≈设计 6s + 垫音;-10dBFS 压在 bgm/verdict 下) |
- m4a 峰值全部同过(-3.05 ~ -10.25dBFS),SA3 侧超限自动补偿未触发;|直流| 全部 ≤ 0.0001。
## 4. 封面(D)
`web/{abyss,detective}/gen/gen_cover.py`(PIL,入库可复现,系统 python3 与 .venv-tts 均有 PIL 12.3.0)→ `web/<game>/cover.png` 1080x1920,批次 1 风格(深色底 + 极简主题图形 + 居中大标题 + 手势图例两行 + 底部标语),固定 seed。
- abyss:深海近黑蓝渐变(下潜方向)+ 声呐同心圆脉冲光点 + 右下暗色回波环(「回音」具象)+ 水雪微粒;视觉审查通过(标题/图例/构图无缺陷)。
- detective:墨蓝夜雨渐变 + 左上路灯暖光晕 + 双景深斜雨丝 + 中央翻开卷宗剪影(右页一条对不上的红线 = 矛盾具象);CDN 缓存碰撞无法二次人工目测,已用像素级断言验证(暖光 +36.7 / 红线 155px / 雨丝竖向性 1.64 / 标题亮区 50595px)。
## 5. check_all_assets 结果(abyss/detective 已入 GAMES + FLAT_OK + key 规则)
```
| 游戏 | ogg | m4a | 0字节 | 解码失败 | voice male/female id 一致 | key 一致且 ⊆ 主集 |
| abyss | 298 | 298 | 0 | 0 | ✅ 各 116(平铺 21 个 NPC 句,豁免) | ✅ 各 11 ⊆ 主集 |
| detective| 279 | 279 | 0 | 0 | ✅ 各 96(平铺 52 个 NPC 句,豁免) | ✅ 各 10 ⊆ 主集 |
结论:10 游戏全绿,exit=0(其余 8 游戏无回归)
```
构成:abyss = voice 275(双性别 232 + key 22 + NPC 21)+ sfx 19 + bgm 4;detective = voice 264(192+20+52)+ sfx 12 + bgm 3。两游戏合计 **1154 文件(ogg+m4a)**。
## 6. 缺失清单与遗留
1. **无缺失**:SA3 token 就绪,本批 SYN+SA3 全量直产,无批次 1 式补产轮。
2. **人工试听项**(建议开发联调前抽检):
- abyss 电台滤波可读性(17b 标注**中风险**两组:小舟 vs female 玩家、老白 vs male 玩家同 speaker——不可读句回退未滤波原声,staging 重转即可);
- abyss NPC 多音字(17b 文末注记:「脏」zāng、「闷」mèn、d3_zheng_e「都没敢出声」等);
- detective 同 speaker 风险(18b 标注**中风险**两组:周先生 vs male 旁白、秦法医 vs female 旁白——sig 前缀兜底)与低风险三处(「得」de/「背」bèi/「处」chù);
- 声音演技段:z_react_1..4 递进与 z_break_1..3 认罪三段(情绪靠省略号/破折号引导,试听确认)。
3. **文档笔误待策划改**:17b 头注「126 句」→ 127(§1 矛盾检查第 1 条);17 号 §7.3 key 路径表述与引擎实现不一致(第 2 条)。
4. **签名 earcon 时长超指引**:detective sig_* 实测 0.78-1.28s vs 文档 0.3-0.5s(「两下」类签名的内容下限;若导航节奏测试发现拖沓,可回 WIN 事件窗收紧重出)。
5. 红线遵守:GPU 全程 flock 串行(TTS abyss→detective 两轮 + SA3 一轮,无并行;Mureka 为纯 API 不占 GPU 锁);Mureka $0.21 ≤ $0.30 且逐笔记账;token/key 未入任何入库文件(env.d/{mureka,sfx}.sh 均被 .gitignore 覆盖,已验证);未改 web/engine/**、未写任何 game.js/index.html/test;`web/{abyss,detective}/gen/staging/` 已补进 .gitignore(此前规则只列了 radio/dungeon,会误入库)。
## 7. 产出物索引
| 类型 | 路径 |
|---|---|
| 台词表(入库) | `tools/gen_voice_dual.py`(abyss/detective 表 + SPEAKERS + VOICE_SPK + NPCS + NPC_BANDPASS + KEY_LINES) |
| 两表一致校验 | `/tmp/verify_batch2.py`(一次性,未入库;重跑即再验) |
| voice 成品 | `web/{abyss,detective}/audio/voice/{male,female}/`(+ key/ 子目录)与平铺 `voice/<id>.*`(abyss 21 句带滤波) |
| bgm 成品 + 脚本 | `web/{abyss,detective}/audio/bgm/`;`web/{abyss,detective}/gen/gen_bgm.sh` |
| sfx 成品 + 脚本 | `web/{abyss,detective}/audio/sfx/`;`gen_sfx.py`(SYN)+ `gen_sfx_sa3.py`(SA3) |
| 封面 | `web/{abyss,detective}/cover.png` + `gen/gen_cover.py` |
| 期望文本映射 | `web/harness/voice_text.json`(games=10) |
| 台账/总账 | `tools/mureka_log.md`(2026-09-09 批次 2 节);`docs/audio/asset-manifest.md`(abyss/detective 章节 + 批次 2 资产账) |
| staging(不入库) | `tools/gen_voice_dual_wav/{abyss,detective}/`、`web/<game>/gen/staging/`、`tools/bgm_post_wav/{abyss,detective}/`、`tools/mureka_out/{abyss,detective}-*/` |