# 口播 BGM 与音效

只在用户要求配乐或音效时读取本页。先根据剪后逐字稿和成片时间轴产出
`output/audio_plan.json`，再调用 `scripts/mix_bgm_sfx.py`。不要即兴写 ffmpeg 命令。

## 计划格式

```json
{
  "voice_volume": 1.0,
  "bgm": {
    "file": "/绝对路径/bgm.mp3",
    "volume": 0.05,
    "start": 0,
    "fade_in": 0.8,
    "fade_out": 1.2
  },
  "sfx": [
    {
      "name": "开头标题",
      "file": "/绝对路径/唰.mp3",
      "at": 0.08,
      "volume": 0.16
    }
  ]
}
```

音量为线性倍率，不是百分贝：`0.05≈-26dB`、`0.1=-20dB`、`0.2≈-14dB`。

## 通用口播默认原则

- **先过语义适配门槛，再决定是否加 BGM**：判断议题情绪、表达力度、节奏和音乐风格是否
  同向。严肃、争议、警示、沉重或信息密度高的话题，不得因为“成片应该有音乐”而套轻快
  音乐；找不到明确匹配的音乐或拿不准时，默认不加 BGM。音效与 BGM 分开裁决，没有 BGM
  仍可保留少量结构提示音。
- 人声保持 `1.0`，BGM 从 `0.04–0.06` 起步，以“隐约听得见”为目标。
- 开头淡入 `0.6–1.0s`，结尾淡出 `1.0–1.5s`。
- 30–60 秒口播一般只放 3–5 个音效：开头主题、关键结果、产品首次出现、CTA。
- 音效从 `0.12–0.22` 起步；有冲击力的 hit/whoosh 更低，可爱提示音可略高。
- 不给每条字幕配音效；不连续堆同类“叮”；不让音效峰值遮住品牌名和关键动词。
- `at` 使用最终成片时间，不是原素材时间。根据 `render_offsets.json` 与逐字稿换算。
- 每次输出新文件，禁止覆盖无音效版成片。

### BGM 适配检查

写 `bgm` 字段前必须能回答：

1. 视频主要情绪是什么（轻快、温暖、理性、紧张、警示、沉重）？
2. 音乐的速度、配器和情绪是否与该情绪同向？
3. 音乐是否会削弱观点的严肃性或让态度显得轻佻？
4. 音乐是否只是为了盖底噪？若是，应改做人声降噪，不能用 BGM 遮盖。

任一关键项不确定，就不写 `bgm` 字段。

## 执行

```bash
python scripts/mix_bgm_sfx.py \
  output/preview_字幕包装.mp4 output/audio_plan.json --out output/
```

默认产出 `preview_字幕包装_音效版.mp4`。先用 `--dry-run` 验证所有素材、点位和参数，
再正式渲染。完成后用 ffprobe 核对时长、视频流和音频流。
