- 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条(全为设计内部冲突按承诺清单/归因真话律取优)
12 KiB
12 KiB
批次 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。
文档内矛盾检查(未停下项,均登记不阻塞管线):
- 17b 头注「双性别组……126 句」与文末合计「双性别 127 句(30+97)」不符——逐行表实数 127(30 DIVER + 97 DECK,脚本与文档逐行一致),头注笔误,建议策划改 126→127(不影响任何资产)。
- 17 号文档 §7.3 写 key 变体落
voice/<gender>/<id>_k.*,与引擎实现(voice/<gender>/key/<id>,audio.js L365-366)及批次 1 先例/任务书口径不一致——按引擎约定落盘(零代码改动铁律),17 号文档该句待策划改写。 - 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.m4aAAC 过冲实测 -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. 缺失清单与遗留
- 无缺失:SA3 token 就绪,本批 SYN+SA3 全量直产,无批次 1 式补产轮。
- 人工试听项(建议开发联调前抽检):
- 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 认罪三段(情绪靠省略号/破折号引导,试听确认)。
- 文档笔误待策划改:17b 头注「126 句」→ 127(§1 矛盾检查第 1 条);17 号 §7.3 key 路径表述与引擎实现不一致(第 2 条)。
- 签名 earcon 时长超指引:detective sig_* 实测 0.78-1.28s vs 文档 0.3-0.5s(「两下」类签名的内容下限;若导航节奏测试发现拖沓,可回 WIN 事件窗收紧重出)。
- 红线遵守: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}-*/ |