Files
SoundGame/research/new8/batch1-assets-report.md
T
xsl d870a75a26 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(风暴根治/回声真实性/密度下限+呼吸层/导航最短路/菜单关闭反馈/金币档同账本)+ 实现核对登记
2026-09-02 18:52:37 +08:00

85 lines
8.1 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.
# 批次 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/` |