№ · 专题 CH.07.23
主页 · 🏮 专题 · 月 1 精品 Demo Sound Bible v1

月 1 精品 Demo Sound Bible v1

📅 2026-07-23 · 📦 13.0 KB · 🏮 专题 · 📝 MD 文档 🏷️ Buff🏷️ 剧情

状态:audit-complete / unauthorized-bgm-disconnected / cue-integration-pending 范围:Year 1 月 1 四个高光节点;不扩剧情 schema,不改主控制器,不引入新音频文件。 机器可读真值:outputs/audio/year1/month01/manifest.json

1. 声音目标

月 1 的声音只服务一个记忆:一家客栈从开门、做第一笔生意,到把人情写进账本。

声音优先级为:剧情记忆点 > 选择反馈 > 客栈环境 > BGM。声音不能把玩家注意力从对白和选择上抢走。

  • 每个高光节点只保留 1 个主声音动作,最多再叠 1 个短反馈。
  • 铜钱只表达真实的正向入账,不表达扣款、赊账或所有泛奖励。
  • 风险提示只在冲突第一次明确出现时播放,不跟随每个红色数值重复播放。
  • 没有通过来源和授权验收的录音,fallback 必须是程序化 cue 或静音。
  • 不使用影视原声、演员对白、可识别台词、剧集配乐切片或来源不明的“古风素材”。
  • 程序化 cue 是可用 fallback,不冒充最终拟真录音。

2. 当前音频真值

2.1 现有 BGM

| 项目 | 审计结果 | | --- | --- | | 路径 | music/bgm/武林外传 茉莉花(2020 8.8 凌晨)(翻自 武林外传配_爱给网_aigei_com.mp3 | | Git | tracked;由 bff328b23932856d59d65eda5fadee3add350949 于 2026-06-22 加入 | | SHA-256 | 007087265A151737422040507BF4018C55ED993AE36F8F916FF9EF7DF0C83CCA | | 技术参数 | MP3,44.1 kHz,stereo,128 kbps,123.344 s,1,975,615 bytes | | 响度 | 源文件实测 -24.5 LUFS-I,LRA 8.4 LU,true peak -6.9 dBTP | | 历史运行时 | 曾使用 HTMLAudioElement.loop = true 和固定音量 0.28 * master volume;该播放链现已移除 | | 当前运行时 | requestBackgroundMusic() 保持 API 兼容并稳定返回 false;构建不再引用该文件 | | ID3 | album=武林外传,artist=Jeremy,title 含“翻自 武林外传配乐”,comment=酷我音乐 | | 授权材料 | 仓库内未发现 license、购买凭证、授权邮件或作者声明 | | 结论 | quarantine / forbidden-for-public-demo;不得进入公开 Demo 录屏、发布包或宣传视频 |

文件名里的“爱给网”、ID3 的“酷我音乐”以及“翻自 武林外传配乐”只证明来源链复杂,不证明录音权、作曲权、改编权、游戏内同步权、公开传播权或循环编辑权。除非权利人提供覆盖上述用途的书面授权,否则不能转为发布资产。

公共 Demo 的 BGM 方案只有两种:

  1. 使用有逐项凭证的原创、委托或 CC0 替代曲,并保留原始下载页/合同、作者、版本、哈希和授权快照。
  2. 在替代曲验收前保持当前 BGM 播放链断开;程序化 SFX 可独立用于 Demo,不需要全静音。

2.2 现有程序化 cue

| 函数 | 源码时长 | 合成方式 | 当前语义 | 月 1 复用判断 | | --- | ---: | --- | --- | --- | | playCoinSound() | 0.40 s | sine + triangle 双音衰减 | 铜钱/奖励 | 可直接复用,但仅正向入账 | | playSweepSound() | 0.20 s 主体,0.25 s stop | 随机白噪声 + bandpass | 扫帚/落叶 | 不直接冒充落笔;可复用合成方法另做纸笔 cue | | playAccupressureSound() | 0.35 s | sawtooth 下滑 + lowpass | 点穴/武术 | 不复用为风险提示,语义冲突 | | playAbacusSound() | 0.07 s | triangle + sine 瞬态 | 算盘珠/木梆 | 可直接复用算盘;招牌只能临时借用一次木质瞬态 | | playClickFeedback() | 0.07 s | sine 下滑 | 通用点击 | 可直接复用选择确认 |

这些 cue 全部由浏览器 Web Audio 在运行时生成,不使用采样文件。源码带 Apache-2.0 标记。实际 LUFS 会受设备采样率、浏览器和总音量影响;当前只有 gain envelope,没有离线响度基线,因此 manifest 如实标记为 not-measured

2.3 当前调用与架构风险

  • playClickFeedbackplayCoinSound 已被大量 UI/奖励动作共用,声音语义过载;不能再把所有剧情反馈压到铜钱声上。
  • 剧情选择结算当前统一播放 click;只有 coins > 0 时再延迟 200 ms 播放 coin。这条链可保留,但需要节点级剧情 cue 接口,不能靠数值推断开门、风险或月末语义。
  • 未授权 BGM 的 URL、HTMLAudioElement 和自动播放链已从 src/utils/audio.ts 移除;程序化 cue 初始化不再触发 BGM 请求。
  • setAudioMuted()setAudioVolume() 现在只控制 Web Audio 程序化 SFX;requestBackgroundMusic() 稳定返回 false,保留调用方 API 兼容。
  • 当前仍没有 BGM/环境/UI/剧情四条 bus;这是未来接入合法 BGM 和环境层时的 P0,不阻塞无 BGM 的程序化 SFX Demo。
  • 当前没有 ducking、fade、crossfade、并发限制、瞬态防叠、独立环境循环或对白模式。
  • 本轮不为补 bus/ducking 越界修改 App.tsxsrc/components/app/** 或 story UI。以下参数是下一轮最小接线契约,不代表已实现。

3. 九类 cue 语言

| Cue key | 语义与听感 | 目标时长 | 层级 | 触发时机 | 当前 fallback | 优先级 | | --- | --- | ---: | --- | --- | --- | --- | | m1.story.open-sign | 木匾轻碰、红绸掠过;不是锣鼓或影视鞭炮 | 0.70-1.10 s | 剧情 | storyline_y1_m01_n01 开场首次出现,整节点一次 | playAbacusSound() 单次木质瞬态;或静音 | P1 | | m1.story.ledger-write | 毛笔在粗纸上的短划,末尾轻收笔 | 0.35-0.70 s | 剧情 | 选择结果确定并写入账本时,一次 | 静音;后续复用 playSweepSound() 的噪声合成方法,不能直接调用扫帚 cue | P0 | | m1.story.abacus | 1-3 颗算盘珠清脆归位,不做老虎机连响 | 0.07-0.22 s | 剧情/UI | 三日盘账、月末报账的数字落定后 | playAbacusSound() | P0-ready | | m1.ui.coin | 两枚铜钱轻碰,明确表达“正向入账” | 0.30-0.45 s | UI | coinsEffect > 0 且结算成功;整次选择一次 | playCoinSound() | P0-ready | | m1.story.service-dishes | 瓷碗落木桌、筷子轻碰;不出现摔碎声 | 0.25-0.55 s | 剧情/环境 | 开业第一桌上菜或节点转入经营反馈时,一次 | 静音;后续使用有授权拟音或原创程序化瞬态 | P1 | | m1.ui.choice-confirm | 轻、短、确定;不带奖励含义 | 0.06-0.10 s | UI | 选择被 runtime 接受后立即一次;失败选择不能用相同成功音 | playClickFeedback() | P0-ready | | m1.story.risk | 两下低沉木响,第二下略高;表达“要做取舍”而非战斗警报 | 0.22-0.45 s | 剧情 | storyline_y1_m01_n04 冲突首次完整揭示时,一次 | 静音;禁止拿 playAccupressureSound() 代替 | P0 | | m1.story.month-close | 收笔、账本合拢、单颗算盘珠归位;温暖但克制 | 1.20-1.80 s | 剧情 | storyline_y1_m01_n08 结果对白结束后、退出节点前,一次 | playAbacusSound();可在 180 ms 后接 playCoinSound(),仅作临时 Demo 组合且需听审 | P0 | | m1.ambience.inn-hall-day | 极低客栈底噪:远处不可辨人声、炉火、偶发碗碟;不含可识别台词 | 30-90 s loop | 环境 | 主厅经营时淡入;剧情弹窗继续但降低 3 dB | 静音;后续使用可追溯原创/CC0 分层 loop | P1 |

4. 四个高光节点的 cue map

Day 1 storyline_y1_m01_n01 开业大吉

  1. 节点打开:环境底噪从静音淡入 350-600 ms。
  2. 招牌/红绸成为画面主动作:m1.story.open-sign 一次。
  3. 第一桌上菜:m1.story.service-dishes 一次。
  4. 玩家选择成功:m1.ui.choice-confirm;只有实际正向入账再接 m1.ui.coin
  5. 不使用影视鞭炮、锣鼓或当前隔离 BGM制造“热闹”。

Day 3 storyline_y1_m01_n02 三日小结

  1. 数字读完:m1.story.abacus,最多三颗珠,不循环。
  2. 问题清单写定:m1.story.ledger-write
  3. 选择成功:m1.ui.choice-confirm
  4. 结果写回账本时只播一次落笔;不要再叠铜钱,除非该选择真实增加铜钱。

Day 10 storyline_y1_m01_n04 邢捕头赊账

  1. “四文面钱和衙门照应”冲突完整揭示:m1.story.risk 一次。
  2. 选择成功:m1.ui.choice-confirm
  3. 赊账/情报路径:m1.story.ledger-write,不播放 reward coin。
  4. 现金路径:落笔后可播放 m1.ui.coin,每次选择最多一次。

Day 30 storyline_y1_m01_n08 满月小结

  1. 进入总结后 BGM 再降低 3 dB,环境再降低 3 dB,留出阅读空间。
  2. 月度数字落定:m1.story.abacus 一次。
  3. 玩家真实选择被引用后:m1.story.ledger-write 一次。
  4. 最后一行结束:m1.story.month-close;此后 600 ms 内不再叠 UI click 或 coin。

5. 四层混音契约

| 层 | 基础建议 | 剧情弹窗 | 约束 | | --- | --- | --- | --- | | BGM | 独立 bus,基准 -12 dB | 150-250 ms 内 duck -6 dB;月末额外 -3 dB | 同时只允许一首;替代曲必须有授权和无缝 loop 验收 | | 环境 | 独立 bus,基准 -18 dB | duck -3 dB | 不可辨台词;循环接缝不得可听;每 8-12 s 才允许一个前景细节 | | UI | 独立 bus,基准 -10 dB | 不 duck,但 250 ms 内最多一个确认瞬态 | 禁止把 click、coin、abacus 同时当通用成功音 | | 剧情 | 独立 bus,基准 -8 dB | 最高优先级 | 每个语义点一次;同一节点需用 event/phase key 去重 |

录制输出建议:整体 -18 +/- 2 LUFS-I,true peak 不高于 -1 dBTP。当前浏览器程序化 cue 尚无离线响度基线,首次接线必须录制一次完整 Day 1/3/10/30 路径再测,不能只看 gain 数值。

当未来加入配音时,配音应成为最高优先级;BGM 再 duck 6-9 dB,环境再 duck 3-6 dB。当前只有文字对白,不以高音量“补存在感”。

6. 最小接线契约(待主 owner 吸收)

不新增剧情 schema 字段。下一轮只需一个稳定入口,例如 playMonth1Cue(cueKey, dedupeKey),由 UI/控制器在现有事件阶段调用:

  • dedupeKey = eventId + phase + cueKey,防止 React 重渲染重复播放。
  • 选择失败与选择成功使用不同结果;没有失败 cue 时保持静音。
  • 音频初始化或资源失败一律静音失败,不回退到隔离 BGM。
  • 先接 choice-confirm / abacus / coin 三个已有程序化 cue,再补 ledger-write / risk / month-close
  • 开门与端菜只能在有明确画面动作时触发;如果 UI 没有动作锚点,本轮不播。
  • BGM/环境/UI/剧情 bus 和 ducking 由主控制器 owner 单独实现,本 lane 不越界。

7. P0 / P1 / P2 缺口

P0:公开 Demo 前必须关闭

  • AUD-RIGHTS-01runtime-disconnected。当前 MP3 保持 quarantine / forbidden-for-public-demo,且已从运行时和构建入口断开;只有取得完整书面授权或换成可追溯替代曲后才能恢复 BGM。
  • AUD-CUE-01:为 ledger-writeriskmonth-close 建立程序化实现或有授权替代文件,并完成听审。
  • AUD-WIRE-01:按四个 event ID 接入 cue,加入 phase 去重,防止重渲染重复播放。
  • AUD-MIX-01:当前无 BGM 的程序化 SFX Demo 不受阻塞;合法 BGM 或环境层接入前必须实现最小四层 bus/ducking,不能恢复旧的单轨直连。
  • AUD-QA-01:完整录制 Day 1/3/10/30,检查漏播、重复、叠音和循环接缝;测量最终输出响度。

P1:精品感增强

  • 原创/有授权的开门招牌、端菜碗碟和主厅环境 loop。
  • 为铜钱、算盘分别提供 2-3 个轻微变体,避免机械重复。
  • 选择失败和资源不足增加一个低强度否定 cue,不复用成功 click。
  • BGM 替代曲准备正常经营与月末收束两个状态,优先 stem/动态混音,不堆曲目数量。

P2:不阻塞月 1

  • 昼夜/天气环境变体、空间声像、后厨/门口独立 room tone。
  • 配音、角色口头禅或影视化提示音。
  • 月 2-12 专属音乐、联机语音、装备稀有度音效扩容。

8. 授权准入清单

每个未来录音必须在 manifest 中同时回答:作者/供应方、原始页面或合同、录音权、作曲权、游戏同步权、公开传播/宣传视频权、是否允许编辑/循环、署名要求、文件哈希、取得日期。任何一项未知都只能标记 quarantine

“免费下载”“已购买”“AI 生成”“在素材站找到”都不自动等于可商用、可嵌入游戏或可用于公开视频。

9. 本轮边界与证据

  • 已审计:src/utils/audio.ts、全仓 play*Sound/BGM 调用面、music/**、月 1 四个事件。
  • 已测:ffprobe 技术参数;FFmpeg ebur128 响度;SHA-256;Git 引入提交。
  • 已断开未授权 BGM 的运行时/构建入口;未新增音频二进制,未修改 App.tsxsrc/components/app/**、story UI/data、music/**docs/handoff/**
  • 定向回归 2/2 通过;npm run lintnpm run build 通过。
  • dist 检查:音频文件 0,隔离 MP3 的 SHA-256 命中 0,爱给网/酷我/曲名/哈希文本引用命中 0
  • 构建仍报告 5 个既有 UI slice 运行时解析提示和单 chunk 体积提示;均不涉及音频改动。