6.1 KiB
6.1 KiB
M76 · 音频第一切片(ElevenLabs 重做 + 接线)
Owner 指示(2026-09-14):按"先音频、后战斗"推进;并确认现有音频若不是 AI 服务(ElevenLabs)生成的, 就重新考虑——已查明:现有 28 个 WAV 全部是
deterministic_local_synthesis(本地合成占位音), 不是 ElevenLabs 产物,效果差,需整体替换。
Player-visible stopping point
玩家实际听到:每个可达页面的音乐床(标题/公会/市场/准备/结算胜/结算负/远征收束)+ 命令与交易音效 (按钮、翻页、确认、招募、解雇、装备、编队、风险确认、奖励、胜败),全部来自 ElevenLabs 生成并已接线到新运行时; 旧合成占位音标注为历史候选、不再播放。
权威与边界
- 事件目录:
docs/04_ART_ANIMATION_AUDIO.md§8 SFX 事件总账(204 条:UI 24 / SHP 24 / EQP 20 / ORD 20 / RES 28 / RUN 28 / BAT 60) 与 §5 音乐计划(32 套件 / 150 stems)。本项目只按该目录生成,不自创事件。 - 付费授权:Owner 于 2026-09-14 授予 常设授权(
06_DEVELOPMENT_AND_REVIEW.md)——音频生成不再逐批等待批准;仍保留 清单→sidecar/报告→校验→接线→运行时证据→人工听感 的链路与花费登记。 - 计费(官方 API 价目):音乐 $0.15/分钟、音效 $0.12/分钟。整切片预估 ≲ $2。
- 生成安全:skill
elevenlabs-game-audio的 dry-run 默认 + 双 flag 才付费;本项目音乐脚本同规 (tools/audio/generate_music.py,密钥只读环境变量、永不落盘、每个文件带 sidecar 记录)。
Ordered steps
- M76-A(IN_PROGRESS,候选已生成待听)试听批:12 条代表性 SFX(over 6 个家族)+ 1 条
MUS-G01-GUILD音乐床。 Owner 先听方向;不通过则改 prompt 重跑(成本可忽略)。 - M76-B(COMPLETE)全切片生成:SFX UI 24 + SHP 24 + EQP 20 + ORD 20 + RES 28 + RUN 28 = 144 条; 音乐 7 个家族 base 床(TITLE/GUILD/SHOP/PREP/RUN/RESULT-WIN/RESULT-LOSS)各 60-92 BPM、60-90s、可循环。 (BAT 60 与区域 ROUTE/BATTLE/BOSS 套件随战斗里程碑走。)
- M76-C(COMPLETE)接线:Godot 音频总线 Master/Music/Ambience/SFX/Voice(合同 §8)、事件→音效映射、 音乐状态切换(不重启整曲,按小节交叉)、音量/静音设置项接入设置页;替换 fg2/fg4 资产播放路径。
- M76-D 门:机器检查(
validate_audio.py:格式/时长/静音/削波/循环缝)+ 运行时证据 (各页面首次动作/失败/奖励/结算捕获)+ 人工听感(音箱与耳机分开记)——三者不可互替。
M76-A 产出(2026-09-14)
- 试听批已生成:SFX 23 个候选(12 事件 × 1-2 变体)+ 音乐 7 床(TITLE/GUILD/SHOP/PREP/RUN/RESULT-WIN/RESULT-LOSS,各 75s,
docs/audio/music/candidates/)。 - 生成 → 原始档(
raw/)→ 处理(SFX:裁静音 + 峰值归一 -1.5 dBFS;音乐:不裁静音,loudnorm I=-18 TP=-1.5) → 机器校验(validate_audio.py:SFX 23 文件 0 错误;音乐 7 文件 0 错误 0 警告)→ 待 Owner 人工听感。 - 一个变体(focus_move v02)因几乎全静音被校验拦下并弃用;已记录。
- 事件↔文件映射、sidecar、花费与请求 id 在
docs/audio/{sfx,music}/audition_report.json。
M76-B 产出(2026-09-14)
- SFX 全切片:合同 §8 的 144 个事件全部覆盖,共 158 条(关键事件 2 变体)。
- 生成 → 处理(裁静音 + 峰值归一)→ 校验:158 文件 0 错误,2 条"尾巴偏长"提示(有意留尾)。
- 首轮 8 条被模型生成为近乎静音(提示词太轻)→ 按"空/无效文件=失败件"规则重写提示词重生成并通过。
- 文件名统一为
SFX-<家族>-<编号>-<事件名>.v<NN>.mp3(与合同事件名一一对应); 失败件已删除,raw 原始档与.meta.jsonsidecar 同步。 - 音乐:7 个非战斗家族床已在 M76-A 生成并通过响度归一(-18 LUFS / TP -1.5)。
- 花费累计 ≈ $1.7(音乐 $1.31 + 音效 ≈ $0.4)。
M76-C 产出(2026-09-14)
- 总线:按合同 §8 铺满 Master→Music(MusicBed/MusicLayer)、Ambience(3 子)、SFX(SFXCritical/SFXPlayerCommit/SFXCombat/SFXWorld/SFXUI)、Voice、Accessibility(16 条总线)。
- 音频服务
runtime/presentation/audio_service.gd:144 事件映射(bus/优先级/冷却)、音乐族交叉淡化(同族不重启)、静音时语义事件仍入账(供字幕/日志)、日志与计数器供测试。 - 接线:53 处——每页
_audio_enter(page, family)(page_open + 音乐族)+ 22 个玩家提交动作_audio_sfx(...)+ 战斗结算按胜负选族与胜利/失败音。 - 机器门:
audio_service_test(144 事件/9 总线/冷却/优先级/静音/同族不重启)、DEV-2 入口音频断言ABG_M76_AUDIO_ENTRY_OK、全流程驱动ABG_M76_AUDIO_CYCLE_OK(34 步 0 阻断;families=10 page_open=35 events=55)。 - 接线暴露并修复真缺陷:市场招募卡的
IdentityModule等模块根节点默认MOUSE_FILTER_STOP,吃掉卡片点击 → 新开局无法选卡/招募(全流程驱动此前在 hire 步骤阻断)。已修并写入共享 UI 规则。 - BAT 60 条与区域/BOSS 音乐仍随战斗里程碑(清单里显式列为 deferred)。
Acceptance checks
- 试听批:Owner 听过并认可方向(或给出反例修订)
- 全切片:每个事件 ID 有一条候选、格式统一(44.1kHz)、无削波、无缝/静音异常;音乐 10-15 分钟重复听无疲劳/无突兀循环
- 接线:设置页音量/静音生效;切页不重启整曲;静音时语义事件仍走字幕/日志(合同 §8)
- 运行时证据:非战斗全页面触发一次对应事件;旧占位音不再被引用
Frozen scope
- 不改玩法/经济/存档语义;BAT 事件与战斗音乐随战斗里程碑;不做语音(Voice 总线保留但本轮不产 voice_id 内容)。
- 旧 fg2/fg4 WAV 保留出处、不再扩展、不再播放(与像素资产同策)。