feat(new8/batch1): 两款新 RPG《不眠频率》radio +《回声地窟》dungeon 全套(多agent流水线:策划→资产→开发→测试→玩家R1→修复→R2)

- 程序章程 research/new8/00-program.md(8款概念/回合协议/验收门/进度账)
- 设计:docs/design/15-radio.md+voice-ids(132句,6状态9抉择4结局,电话滤波资产侧带通)/16-dungeon.md+voice-ids(125句,脉冲回声/7层seed生成/三档战斗/元进度遗产)
- 资产:TTS 970文件(GPU flock串行)+ Mureka BGM 8首 $0.24(台账 mureka_log.md)+ 程序合成 sfx(含预pan侧墙/开口、phone_ring铃声、amb_cave呼吸层、turn_tick)+ 终检 check_all_assets 8游戏全绿
- radio:game.js+playtest 221断言(4结局矩阵/pendingChoice盲玩公平/RING两级看门狗/菜单循环/存档schema)
- dungeon:game.js+playtest 1610断言(seed全网格回声一致性/学期零死/格挡80%/死亡归因真话/元进度/菜单冻结/上滑5段状态链)
- 引擎修复:audio.js _playVoice 加载竞态补杀 token(R1真机71分钟语音风暴根因)+ 同id 3s窗口≥5次熔断保险丝 + gesture.js 长按boost事件门(+66行,9套件回归全绿)
- 大厅:新增 radio/dungeon 卡片 + GAMES 数组
- harness:sessions/radio.mjs+dungeon.mjs(主线+压力双剧本)+ transcribe 注册 + voice_text.json 刷新(8游戏704句)+ 13号文档 §20 登记
- R1 存档:4人设评审×2游戏 + 真机试玩报告×2(radio 5/5愿意玩;dungeon 0/4→确诊风暴)+ synthesis×2 + 转写8份
- R2 修复:radio F1-F5(看门狗补挂/rep_low改词重录/真铃声/ASK续玩语义/链末跳过保护)+ dungeon D0-1..D1-6(风暴根治/回声真实性/密度下限+呼吸层/导航最短路/菜单关闭反馈/金币档同账本)+ 实现核对登记
This commit is contained in:
xsl
2026-09-02 18:52:37 +08:00
parent 3537610130
commit d870a75a26
1143 changed files with 24335 additions and 17 deletions
+84
View File
@@ -0,0 +1,84 @@
# 批次 1 资产报告:radio《不眠频率》+ dungeon《回声地窟》
> 音频资产管线 agent 产出 · 2026-09-02 · 覆盖任务书 A(语音)/ B(BGM)/ C(音效)/ D(收尾)。
> 总耗时 ≈ **35 分钟**(00:47–01:21,含 2 轮 GPU TTS 串行、8 个 Mureka 任务、全部 QC 与文档)。
## 1. 语音(TTS,GPU flock 串行)
| 项 | radio | dungeon |
|---|---|---|
| 台词句数 | 132(双性别 103 + NPC 平铺 29) | 125(×2 性别,无 NPC) |
| 生成文件 | 103×2 + 29 = 235 条 ×2 格式 = 470 文件 | 250 条 ×2 格式 = 500 文件 |
| speaker | HOST=Uncle_Fu/Serena,PROD=Dylan/Vivian(VOICE_SPK 逐句覆盖,同性别双音色) | 全表 Uncle_Fu/Serena,单一 instruct 常量 |
| `--check` | ALL OK(无时长离群/短句) | ALL OK |
- 台词表进入 `tools/gen_voice_dual.py`(新增 radio/dungeon),**由一次性提取脚本直接解析两份 voice-ids 设计文档生成**,并做了二次闭环校验(重解析文档 vs 脚本内表格逐字 diff)——台词全文与文档一字不差。
- NPC 平铺按 rpg 先例写入 `NPCS["radio"]`(id, speaker, instruct, 台词),staging 走 `<game>/npc/`,convert 落 `web/radio/audio/voice/<id>.*`。
- `extract_voice_text.py` 已刷新 `web/harness/voice_text.json`:games=8,radio 132 条、dungeon 125 条。
- **文档内矛盾检查**:无重复 id、无超 40 字(汉字口径,与文档自查注记一致;p7/p9 含标点 41/43 字,走章程 §3.4 自动拆句机制,0.12s 句间停顿)。发现一处**文档头部账目笔误**(不影响管线,未改文档):15-radio-voice-ids.md 头注「HOST 21 + PROD 82」与逐行表不符,逐行表实数 HOST 29 + PROD 74(总数 103 一致)。
- **radio 电话音质感(资产侧带通,15-radio.md §6.2)**:convert 转码时按来电者逐档 `highpass+lowpass+轻压缩`(老周 500-2800 / 小鹿 400-3400 / 糖糖 450-3000 / 陈姐 420-3100 / 老韩 300-3400 Hz,均 acompressor threshold=-20dB ratio=3 attack=10 release=150);已验证滤波生效(NPC 高频带能量 ≈ 未滤波 HOST 的 1/4,时长与 staging 完全一致);ogg+m4a 双格式均从同一滤波链转出。未滤波原声保留在 `tools/gen_voice_dual_wav/radio/npc/`(不入库)。
## 2. BGM(Mureka API)
8 首全部一次成功,无重试;**总花费 $0.24(预算 $0.30 内,台账见 `tools/mureka_log.md` 2026-09-01 节,项目累计 $0.87/$2.00)**。
| 曲目 | task id | 选用 choice | 候选时长 | 响度目标 |
|---|---|---|---|---|
| radio onair | 158551062544386 | 158551165370369 | 135.5/201.2s | -20 LUFS |
| radio bridge | 158551207313409 | 158551341465604 | 211.2/225.1s | -20 LUFS |
| radio menu | 158551383277574 | 158551500914690 | 188.6/222.0s | **-24 LUFS**(menu pad,10 文档 §1.2) |
| radio ending | 158551538401281 | 158551630872578 | 202.0/189.2s | -20 LUFS |
| dungeon menu | 158551678976001 | 158551817322499 | 162.8/177.8s | -20 LUFS(16-dungeon.md §9.1) |
| dungeon explore | 158551855333377 | 158551978868739 | 177.0/209.8s | -20 LUFS |
| dungeon battle | 158552010457089 | 158552169709569 | 186.4/225.9s | -20 LUFS |
| dungeon boss | 158552209555457 | 158552331321345 | 149.5/202.3s | -20 LUFS |
- 选用原则:拿不准选时长更接近 90s 的候选(仅 radio ending 选候选 1)。
- 后处理(脚本入库 `web/{radio,dungeon}/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.4~-24.7dB,循环接缝差值与在库 BGM 同量级。
- 无节奏关键曲目,未跑 bpm_precise(dungeon battle/boss 的 bpm 仅为 prompt 特征词)。
## 3. 音效(SYN 程序合成;SA3 全部跳过)
- `web/radio/gen/gen_sfx.py`:`ui_confirm ui_menu`(storyline 全局先例同款),2 文件 ×2 格式。
- `web/dungeon/gen/gen_sfx.py`:19 文件 ×2 格式 = 17 id(`pulse`、材质尾音 4、**预 pan 立体声 `side_wall_l/r side_open_l/r`**(mono 源 + ffmpeg `pan` 派生,脚本断言极性:能量只在目标声道)、`step_own step_turn bump coin potion gear atk_swing parry hurt levelup`)。
- **QC(解码回读法,全部通过)**:逐声道真峰值 ≤ -3dBFS(修复:硬 pan 立体声不能按声道均值测,否则漏检超限;AAC/MDCT 过冲按实测迭代补 volume);|直流| ≤ 0.001(与在库 91 件 sfx 基线一致;修复:源去直流 + 8ms cos² 淡入淡出 + 前后垫 60/120ms 静音 + highpass=f=30 抑制编解码直流再生);无首尾爆豆。最终 42 文件全绿。
- 可复现:两个 gen 脚本入库,一键重出全部 ogg+m4a;staging(`web/<game>/gen/staging/`、`tools/bgm_post_wav/`)已加入 .gitignore 不入库。
## 4. 缺失资产清单(SA3 待 HF token,本轮全部跳过、未尝试生成)
**radio(13 件)**:`onair_sting phone_ring line_connect line_drop amb_studio amb_rain_city amb_station amb_kid_room arg_muffled amb_street_rain amb_cab brake_screech tape_static`(15-radio.md §5.2;prompt 草稿在表内,token 就绪后按 gen_rpg_sfx.sh 工艺补产)。
**dungeon(24 文件 = 13 个 SA3 源 + 11 个 pan 派生)**:`echo_1 echo_2 echo_3 echo_4 stairs_down atk_hit enemy_die mob_step_small mob_step_bug mob_step_heavy`(+各 l/c/r 三份派生)`tel_small tel_bug tel_heavy`(+各 l/r 派生)(16-dungeon.md §9.2;mono 源 → `stereotools`/`pan` 派生工艺同表注)。
**SA3 缺失影响评估**:radio 的 amb/线索音缺失时游戏层按「资产缺失回退路径」静默降级(设计 §9 断言已有屏蔽资产的兜底断言);dungeon 回声/脚步是核心动词,**开发联调前建议先补产 dungeon 的 SA3 条目**(或临时用 SYN 兜底:side_* 已有 SYN 版,echo/mat 可参考 §9.2 降级条款程序合成)。
## 5. check_all_assets 结果(radio/dungeon 已入 GAMES 列表)
```
| 游戏 | ogg | m4a | 0字节 | 解码失败 | voice male/female id 一致 |
| radio | 241 | 241 | 0 | 0 | ✅ 各 103(平铺 29 个角色/NPC 句,豁免) |
| dungeon | 273 | 273 | 0 | 0 | ✅ 各 125 |
结论:全部通过(8 游戏全绿,exit=0)
```
radio ogg 构成 = 103+103 双性别 + 29 平铺 NPC + 2 sfx + 4 bgm;dungeon = 125+125 + 19 sfx + 4 bgm。
## 6. 遗留问题 / 待办
1. **SA3 token**:环境未配置(env.d/sfx.sh 无有效 HF token),radio 13 + dungeon 24 件 sfx 待补产(清单见 §4,prompt 均已在设计文档定稿)。
2. **人工试听两处**:① radio NPC 带通句可读性抽检(不可读回退未滤波原声,staging 重转即可,管线已支持);② 多音字风险句(15-radio-voice-ids.md 文末注记:h1_dango「嘶」、k1_lullo、d9_face 等;16b:btl_bat「蝠」、unlock_potion「行囊」)。
3. **文档笔误待策划改**:15-radio-voice-ids.md 头注「HOST 21 + PROD 82」应为「HOST 29 + PROD 74」(总数 103 不变,不影响任何资产)。
4. radio 无「大姐/姑娘」自称合规、gd_* 两级不同句等台词侧设计约束均已在表内落实,开发接线时按 §7.2 看门狗表取用即可。
5. 红线遵守:GPU 全程 flock 串行(radio → dungeon 两轮,无并行);Mureka $0.24 ≤ $0.30 且每笔记账;未改 web/engine/、未写任何 game.js/index.html/test;key 未入任何入库文件(mureka.sh 本就被 gitignore)。
## 7. 产出物索引
| 类型 | 路径 |
|---|---|
| 台词表(入库) | `tools/gen_voice_dual.py`(radio/dungeon 表 + SPEAKERS + VOICE_SPK + NPC_BANDPASS) |
| voice 成品 | `web/{radio,dungeon}/audio/voice/{male,female}/`(+ radio 平铺 `voice/<id>.*`) |
| bgm 成品 + 脚本 | `web/{radio,dungeon}/audio/bgm/`;`web/{radio,dungeon}/gen/gen_bgm.sh` |
| sfx 成品 + 脚本 | `web/{radio,dungeon}/audio/sfx/`;`web/{radio,dungeon}/gen/gen_sfx.py` |
| 期望文本映射 | `web/harness/voice_text.json`(games=8) |
| 台账/总账 | `tools/mureka_log.md`(2026-09-01 节);`docs/audio/asset-manifest.md`(radio/dungeon 章节) |
| staging(不入库) | `tools/gen_voice_dual_wav/{radio,dungeon}/`、`web/<game>/gen/staging/`、`tools/bgm_post_wav/`、`tools/mureka_out/` |