# Qiaomu Mtv Creator

> AI MTV/MV 制作工具。将 Suno 生成的歌曲自动转换为传统 MTV 或 HyperFrames/GSAP kinetic MV。触发词包括"制作MTV"、"生成MV"、"歌曲转视频"、"/mtv"。支持 Suno SRT/LRC、qiaomu-suno-master 下载、storyboard、Codex 生图计划、HyperFrames 动态歌词、GSAP 动效和 FFmpeg 合成。

- Skill: `joeseesun/qiaomu-mtv-creator` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add joeseesun/qiaomu-mtv-creator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/joeseesun/qiaomu-mtv-creator/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: joeseesun (https://skillmd.com/u/joeseesun)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/joeseesun/qiaomu-mtv-creator

---


# Qiaomu MTV Creator - AI 音乐视频制作

将 Suno 生成的歌曲自动转换为两类 MV：稳定快速的传统配图字幕版，以及更像音乐视频的 HyperFrames/GSAP 动态歌词版。

## V2.4 升级要点

- **MTV 审美规则沉淀**：新增“画面、字幕、转场、字体、验收”的设计原则。未来不要把 Hyper MV 做成固定底部字幕的幻灯片；每首歌都要有和歌词意象一致的 motion grammar。
- **字幕系统升级**：默认 Hyper 模板要使用多安全区 anchor、轻微倾斜、词级 stagger、回声/描边/玻璃质感等可控变化。字幕可以不规则，但必须服务歌曲气质；避免逐帧抖动、过度缩放、粗糙旋转和一直居中。
- **转场系统升级**：图片之间不只做淡入淡出。默认组合柔和溶解、玻璃擦拭、光扫、纹理遮罩、轻微场景分层，让镜头推进保留，同时让 scene change 有记忆点。
- **字体本地化**：Hyper 模板默认打包 `Anton` + `Space Grotesk` 本地 woff2，避免渲染时回退到系统字体导致质感变差或不同机器表现不一致。
- **去模板痕迹**：片头必须使用真实歌曲标题，优先从 LRC `[ti:]`、项目元数据或字幕文件名读取，并清理 clip/hash 后缀；motion profile、debug label、URL slug、占位文字不能出现在成片里。
- **固定作者署名**：所有歌曲作者/artist/author 默认写 `向阳乔木`。不要从 Suno、文件名、URL、LRC `[by:]` 或模型输出里猜作者；片头需要署名时也使用 `向阳乔木`。
- **音频 UI 默认关闭**：波形、频谱、进度条、节拍脉冲不再作为默认装饰。只有当歌曲概念明确需要“播放器/电台/信号/电子可视化”时才打开；冷感、叙事、梦幻歌曲默认不出现这些界面化元素。
- **渲染脚本稳定化**：`render_hyper_mtv.py` 默认使用本机 Puppeteer headless shell、streaming encode、长超时、缓存限制和 SDR 输出，并按可回收内存选择 worker，减少手动拼环境变量和系统 Chrome 崩溃概率。

## V2.3 升级要点

- **新名字**：主 skill 名为 `qiaomu-mtv-creator`；旧名 `mtv-creator` 不再保留，避免别名误触发。
- **单源目录**：skill 实体只放在 `/Users/joe/.agents/skills/qiaomu-mtv-creator`；不要再创建 `.claude` 兼容软链或 `mtv-creator` 旧名入口。
- **双模式**：`classic` 保留传统 FFmpeg 配图字幕工作流；`hyper` 用 HyperFrames + GSAP 制作动态歌词、场景内排版、音频响应和更丰富转场。
- **GSAP 官方技能吸收**：已吸收 `greensock/gsap-skills` 的 core/timeline/plugins/utils/performance 规则，落到 `references/gsap-mtv-motion.md`，并由 `scripts/create_hyper_mtv.py` 自动生成更丰富的 HyperFrames/GSAP MTV 工程。
- **动效谱系**：Hyper 模式新增 `cinematic`、`poster`、`glitch`、`dream`、`minimal` 五个 motion profile，用 GSAP timeline labels、position parameter、stagger、transform aliases、`autoAlpha`、`gsap.utils.wrap()` 等模式组织场景、歌词、粒子、光扫和节拍脉冲。
- **渲染加速策略**：新增 `scripts/render_hyper_mtv.py`，根据可用内存选择 HyperFrames `quality/fps/workers`；低内存时先提示清理，不再默认硬开 auto workers。
- **SRT/LRC 统一**：自动识别 Suno 同版本 `.srt` / `.lrc`，LRC 会转换为项目内可烧录 SRT。
- **项目化输出**：每次生成 `project.json`、`timeline.json`、`preflight_report.json`、`storyboard.html`。
- **可恢复阶段**：通过 `--stage preflight|prepare|storyboard|images|compose|hyper|all` 分步运行。
- **Codex 生图优先**：`--image-provider auto` 在 Codex 环境中解析为 `codex-plan`，优先让 Codex 内置生图接管关键帧；只有 Codex 生图不可用或非 Codex 运行时才回退即梦。
- **字幕 fallback**：如果本机 FFmpeg 没有 `subtitles` / `drawtext` filter，会自动用 Pillow 渲染透明字幕层再 overlay。

## 核心流程

```
Suno 歌曲（含 .srt / .lrc 精准歌词）
    ↓
解析为统一 timeline.json → preflight 检查 → storyboard.html
    ↓
Claude/Codex 读歌词 → 分析歌曲结构 → 生成 visual_config.json
    ↓
生图：优先 Codex 内置生图计划；失败或不可用时才用即梦批量落盘 fallback
    ↓
合成 MV：classic 用 FFmpeg；hyper 用 HyperFrames + GSAP kinetic timeline
    ↓
输出: MTV 视频 (MP4)
```

## ⚠️ 重要原则

1. **用 Suno SRT，不用 Whisper**：Suno 生成歌曲时已自动生成精准 SRT，路径与 mp3 同目录，优先使用
2. **Claude 直接生成描述**：Claude Code 本身就是大模型，读 SRT 后直接生成视觉描述，不调第三方 API
3. **音频选版本**：Suno 会生成两个版本（.mp3 和 -1.mp3），选时长更长、覆盖所有 SRT 时间戳的版本
4. **skill 单源在 .agents**：所有新增和修改都落在 `/Users/joe/.agents/skills/qiaomu-mtv-creator`；不要恢复 `.claude` 兼容软链或旧 `mtv-creator` 别名
5. **Codex 生图优先，不先跑即梦**：Codex 内置生图质量通常更适合关键帧；脚本生成 `codex_image_requests.md` 供 Codex 接管。只有 Codex 生图不可用、用户明确要求 fallback、或非 Codex 自动运行时，才使用即梦。
6. **Suno 资料先走 qiaomu-suno-master**：遇到 Suno URL、clip ID、下载音频、导出 LRC/SRT，先使用 `/Users/joe/.agents/skills/qiaomu-suno-master`，不要先手写抓页面。
7. **Hyper 渲染先看内存**：`hyperframes render --workers auto` 在可用内存很低时会同时启动多个浏览器并失败；最终渲染前先跑 `render_hyper_mtv.py --dry-run`，低于阈值时请用户清理内存，除非用户接受慢速 `--allow-low-memory`。
8. **GSAP 只用可渲染时间线**：HyperFrames 里 GSAP 必须同步创建 paused timeline，注册到 `window.__timelines.main`；不要 `tl.play()`、不要 `Date.now()` / `Math.random()` / 网络 fetch / 无限 repeat。
9. **MV 不是歌词 PPT**：默认避免“整首歌固定底部居中字幕 + 每张图同一种淡入淡出”。字幕、转场、镜头和氛围层都要有歌曲自己的节奏，但不能抢歌词。
10. **字幕稳定优先**：字幕动效可以丰富，但不能抖。优先使用 `autoAlpha`、`y`、低幅度 `rotation`、词级 `stagger` 和长一点的 `sine/power` ease；少用大幅 `scale`、`rotationX`、短促抖动和频繁 filter 切换。
11. **从歌词意象生成 motion grammar**：玻璃、雨、盐、霓虹、纸张、广播、海、风等意象要变成对应的视觉动效语言，例如 glass wipe、rain streak、salt grain、signal scan、paper slip，而不是套同一套模板。
12. **不要让模板身份露出**：片头可以有设计标题，但不能出现 `Poster Motion`、`cinematic motion`、`placeholder`、URL slug、clip id/hash、脚本调试名。真实歌名优先从 LRC `[ti:]` 获取，例如 `Salt On Glass`，不要显示 `salt-on-glass-ba258447`。
13. **不要把 MV 做成播放器界面**：波形、频谱、进度条、均衡器、底部节拍线默认关闭。除非歌曲主题是广播、电台、信号、俱乐部、电子设备或用户明确要求，否则这些元素会破坏沉浸感。
14. **作者固定为向阳乔木**：项目元数据、HyperFrames `mtv-data.json`、片头署名、发布说明中的歌曲作者统一写 `向阳乔木`，不要使用 Suno AI、下载账号、文件名、URL slug 或 LRC `[by:]` 作为作者。

## MTV 设计原则与风格原则

做 Hyper MTV 时先定一个 4 层视觉系统，而不是直接套模板：

1. **画面层**：关键帧要有统一摄影/插画风格、稳定色彩、重复母题。镜头推进可以慢，但每个段落的推进方向、焦点和速度要略有差别。
2. **字幕层**：字幕是 MV 的表演者，不是外挂字幕。每行歌词可以在 4-7 个安全 anchor 中切换：左下、右上、右中、左墙、低位桌面、居中宽屏等。位置变化要和画面负空间匹配，不能遮住主要主体。
3. **字体层**：每支 MV 至少有明确字体气质。优先选择凝练、有音乐感的 display sans / condensed sans；不要默认系统粗体一直居中。温柔歌用窄体、细腻阴影、低对比回声；强烈歌再用红色描边、glitch、切片。
4. **转场层**：每个 scene change 至少叠加两种转场语言，例如 cross-dissolve + glass sweep、soft bloom + texture wipe、rain scan + parallax drift。避免所有图片之间同一种 xfade。
5. **氛围层**：粒子、波形、光扫、噪声、进度条要低调服务节奏。不要为了“动”而动；能表达歌词母题的动效优先。
6. **片头层**：片头是作品的一部分，不是模板封面。只显示真实歌名或经过设计的短标题；作者署名统一写 `向阳乔木`。不要显示 motion profile、工程名、哈希后缀、下载文件名、调试标签。

字幕风格要按歌曲气质调节：

- **梦幻/怀旧/冷感**：位置有轻微漂移但不跳；文字可偏左/偏右，带玻璃回声、柔和描边、低透明度重复影；转场用长溶解、光扫、雾化遮罩。
- **摇滚/脏感/强节拍**：可使用更大字号、upper-case、红色/暖色强调词、切片、扫描线和短促冲击，但要控制在副歌或强拍。
- **民谣/叙事/安静**：减少字词拆分，使用低位、侧边或画面负空间的排版；用纸张、影子、窗光、慢变焦表达段落。
- **电子/赛博/不稳定**：允许 glitch、scanline、短促位移和硬切，但要避免全程抖动造成阅读疲劳。

质量门槛：

- 抽帧时不能整首歌都像同一个字幕位置的重复截图。
- 相邻两三帧字幕边缘不应出现肉眼可见抖动。
- 转场不能黑屏，不能只有硬淡出；至少几处 scene change 要能看出歌曲母题。
- 标题/水印式模板文字默认只用于片头，不能整首歌常驻左上角干扰歌词；片头也不能出现 profile label、slug 或 hash。
- 波形、频谱、进度条、节拍线这类播放器 UI 默认不出现；抽帧看到它们时，需要能说清楚它们为什么属于这首歌。

## 标准工作流（Claude Code 操作）

### Step 1：准备项目与 Storyboard

```bash
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/create_mtv.py \
    --audio "/path/to/song-1.mp3" \
    --style ink-painting \
    --ratio 16:9 \
    --stage prepare
```

检查输出：

```
project.json
timeline.json
preflight_report.json
storyboard.html
visual_config.json
codex_image_requests.md
```

### Step 2A：Codex 内置生图接管关键帧（默认优先）

```bash
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/create_mtv.py \
    --audio "/path/to/song-1.mp3" \
    --style ink-painting \
    --ratio 16:9 \
    --stage prepare
```

然后由 Codex 读取 `codex_image_requests.md` 逐张生成 `images/scene_XX.png`。完成后：

```bash
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/create_mtv.py \
    --audio "/path/to/song-1.mp3" \
    --visual-config "/path/to/project/visual_config.json" \
    --stage compose
```

### Step 2B：即梦 fallback（仅 Codex 生图不可用时）

```bash
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/create_mtv.py \
    --audio "/path/to/song-1.mp3" \
    --style ink-painting \
    --ratio 16:9 \
    --output ~/Videos/MTV/项目名/ \
    --skip-transcribe \
    --subtitle "/path/to/song.srt" \
    --visual-config "/path/to/project/visual_config.json" \
    --stage images \
    --image-provider jimeng \
    --workers 5
```

### Step 2C：HyperFrames / GSAP 动态歌词 MV（推荐模式）

适合用户明确要求“不像幻灯片”“歌词更酷”“画面随音乐动”“参考 HyperFrames”的任务。传统 `classic` 模式仍然保留；`hyper` 是更高表现力、更慢但更像 MV 的模式。

工作流：

1. 先用本 skill 的 `prepare` 生成 `timeline.json`、`visual_config.json`、关键帧生图计划。
2. 用 Codex 内置生图生成 `images/scene_XX.png`。
3. 运行 `--stage hyper` 自动生成 `hyper-mv/`：复制音频/关键帧，写入 `assets/mtv-data.js`，创建本地 `assets/gsap.min.js` 和 GSAP-rich `index.html`。
4. 先运行 `npm run check` 和 `npx hyperframes inspect --samples 24`，确认没有 console error、对比度问题、歌词越界。
5. 快速预览用 draft profile，最终版用 final profile。

生成 HyperFrames 工程：

```bash
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/create_mtv.py \
    --audio "/path/to/song-1.mp3" \
    --subtitle "/path/to/song.srt" \
    --visual-config "/path/to/project/visual_config.json" \
    --stage hyper \
    --motion-profile cinematic
```

动效谱系：

| Profile | 适用 | 特点 |
|---------|------|------|
| `cinematic` | 流行、摇滚、叙事歌 | 慢推拉、稳重歌词入场、克制节拍脉冲 |
| `poster` | 复古、民谣、插画风 | 海报纸感、轻微错位、块面化歌词 |
| `glitch` | 电子、愤怒、赛博 | 扫描线、短促抖动、锐利切换 |
| `dream` | 氛围、怀旧、柔和歌曲 | 长溶解、漂浮粒子、柔和 blur-in |
| `minimal` | 细腻歌词、spoken 段落 | 少动效、安静淡入淡出 |

快速预览：

```bash
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/render_hyper_mtv.py \
    --project "/path/to/project/hyper-mv" \
    --profile review
```

最终渲染：

```bash
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/render_hyper_mtv.py \
    --project "/path/to/project/hyper-mv" \
    --profile final \
    --check
```

优先使用 `render_hyper_mtv.py` 而不是手写 `npx hyperframes render`。脚本会自动：

- 选择本机 Puppeteer `chrome-headless-shell`，避免系统 Chrome 版本/权限导致渲染不稳。
- 开启 streaming encode，长视频不先堆满帧缓存。
- 设置 Puppeteer 启动/协议超时、帧缓存上限和 `--sdr`。
- 按内存自动选择 worker；需要更快时先看 `--dry-run` 输出，再决定是否显式 `--workers 2/3`。

如果脚本提示 `LOW MEMORY`，先请用户清理内存或关闭重型应用，再重新渲染。只有用户明确接受“慢一点也行”时，才使用：

```bash
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/render_hyper_mtv.py \
    --project "/path/to/project/hyper-mv" \
    --profile final \
    --allow-low-memory
```

刚才实测教训：`hyperframes render --workers auto` 在 0.3GB immediate free memory 时会校准后尝试多 worker，随后多个浏览器进程同时启动失败；`--workers 1` 可以完成，但 220 秒 1080p 视频耗时约 7 分 39 秒。因此默认策略是：内存足够时多 worker 换速度，内存低时先问用户清理，而不是静默退到慢速。

## 参数说明

| 参数 | 短参数 | 默认值 | 说明 |
|------|--------|--------|------|
| `--audio` | `-a` | (必填) | 音频文件路径 |
| `--lyrics` | `-l` | 自动查找 | 歌词文件路径（.lyrics.json） |
| `--style` | `-s` | newyorker | 配图风格（见风格列表） |
| `--ratio` | `-r` | 9:16 | 视频比例（9:16/16:9/1:1） |
| `--output` | `-o` | ~/Videos/MTV/ | 输出目录 |
| `--workers` | `-w` | 3 | 并发生成配图数（推荐 5） |
| `--stage` | | all | 分阶段运行：preflight/prepare/storyboard/images/compose/hyper/all |
| `--image-provider` | | auto | 生图后端：auto/codex-plan/jimeng/none；auto 在 Codex 中优先 codex-plan，非 Codex 才回退 jimeng |
| `--motion-profile` | | cinematic | HyperFrames/GSAP 动效谱系：cinematic/poster/glitch/dream/minimal |
| `--hyper-dir` | | 项目目录/hyper-mv | HyperFrames 工程输出目录 |
| `--preflight-only` | | false | 只检查输入和时间轴 |
| `--storyboard-only` | | false | 只生成 storyboard 预览 |
| `--no-subtitle` | | false | 不烧录字幕 |
| `--skip-transcribe` | | false | 跳过转录（现在会自动优先使用 Suno SRT/LRC，通常不必手动指定） |
| `--skip-images` | | false | 跳过生图（已有图片时使用） |
| `--subtitle` | | 自动查找 | 指定 SRT/LRC 文件路径 |
| `--images-dir` | | 自动 | 指定已有图片目录 |
| `--visual-config` | | - | 指定配图配置文件 |

## 风格推荐

| 歌曲类型 | 推荐风格 |
|----------|----------|
| 摇滚/硬核 | `newyorker`, `pen-sketch`, `woodcut` |
| 民谣/抒情 | `watercolor`, `ink-painting`, `morandi` |
| 电子/流行 | `flat-illustration`, `isometric`, `low-poly` |
| 古风/中国风 | `ink-painting`, `woodcut`, `retro-poster` |
| 儿歌/轻松 | `children-book`, `cartoon`, `paper-cut` |

完整风格列表见 `qiaomu-image-generator` skill。

## 工作流详解

### Step 1: 字幕与时间轴

优先使用 Suno 同目录字幕：
- 精确匹配 `歌名.mp3` → `歌名.srt` / `歌名.lrc`
- 精确匹配 `歌名-1.mp3` → `歌名-1.srt` / `歌名-1.lrc`
- LRC 自动转换为项目内 SRT
- 只有找不到 Suno 字幕时才调用 `whisper-transcribe`
- 输出 `timeline.json` 和 `preflight_report.json`

### Step 2: 分析歌词生成配图描述

Claude 分析歌词，为每个段落生成视觉描述：
- 提取核心意象和情感
- 转换为纯视觉语言（无文字）
- 生成 `visual_config.json`

**示例**：
```
歌词: "午夜的终端闪烁着光，键盘就是我的战场"
描述: "深夜办公室，一个人影坐在发光的屏幕前，手指悬停在键盘上，周围是代码的光影"
```

### Step 3: 生成配图

默认优先 Codex 内置生图：
- `--image-provider auto` 在 Codex 环境中生成 `codex_image_requests.md`
- 审阅 `codex_image_requests.md`
- 用 Codex 内置生图生成 `images/scene_XX.png`

即梦只作为 fallback：
- Codex 生图不可用、用户明确接受 fallback，或非 Codex 环境中 `auto` 运行时，才调用 `qiaomu-image-generator`
- fallback 时显式使用 `--image-provider jimeng`

### Step 4: 合成视频

classic 模式调用内置 FFmpeg 合成：
- 音频 + 图片 + 字幕 → MP4
- 平滑转场效果
- 专业字幕烧录
- 自动修正 `xfade` 重叠造成的时长缩短

hyper 模式调用 `scripts/create_hyper_mtv.py`：
- 读取 `project.json`、`timeline.json`、`visual_config.json`
- 复制音频和 `images/scene_XX.*` 到 `hyper-mv/assets/`
- 安装并复制本地 `gsap.min.js`，避免 CDN 在渲染时失败
- 生成一个 paused GSAP master timeline：scene layers、kinetic lyrics、beat pulse、wave bars、particles、progress
- 后续用 `scripts/render_hyper_mtv.py` 做 review/final 渲染

## 输出结构

```
~/Videos/MTV/代码丛林_20260125/
├── 代码丛林.mp4           # 最终 MTV
├── project.json           # MTV 项目元数据
├── timeline.json          # 统一字幕/场景时间轴
├── preflight_report.json  # 输入、依赖、字幕覆盖率检查
├── storyboard.html        # 可审阅分镜预览
├── codex_image_requests.md # Codex 内置生图 prompt 清单
├── audio/
│   └── 代码丛林.mp3       # 原始音频
├── subtitles/
│   ├── 代码丛林.srt       # 字幕文件
│   └── 代码丛林.json      # 时间轴 JSON
├── images/
│   ├── scene_01.png       # 配图 1
│   ├── scene_02.png       # 配图 2
│   └── ...
├── visual_config.json     # 配图配置
├── metadata.json          # 项目元数据
└── hyper-mv/              # HyperFrames/GSAP 动态歌词工程（--stage hyper）
    ├── index.html
    ├── package.json
    └── assets/
        ├── mtv-data.js
        ├── gsap.min.js
        ├── song.mp3
        └── images/
```

## 与其他 Skills 的关系

| Skill | 角色 |
|-------|------|
| `suno-music-creator` | 上游：生成歌曲和歌词 |
| `whisper-transcribe` | 依赖：转录时间轴 |
| `qiaomu-image-generator` | 依赖：生成配图（即梦 API） |
| `ffmpeg` | 依赖：合成视频、烧录字幕、社交平台兼容编码 |
| `podcast-to-video` | 参考：字幕和合成风格最佳实践 |
| `gsap` / `greensock/gsap-skills` | Hyper 模式动效规则来源：timeline、stagger、plugins、utils、performance |

## GSAP / HyperFrames 动效规则

详细规则见 `references/gsap-mtv-motion.md`。做 Hyper MTV 时至少遵守：

- 用 `gsap.timeline({ paused: true })`，注册 `window.__timelines.main`。
- 用 labels 和 position parameter 编排场景、歌词、节拍，不用散乱 `delay`。
- 优先 transform aliases 和 `autoAlpha`；少动画 layout 属性。
- `gsap.utils.wrap()` / `clamp()` / `toArray()` 用于确定性映射，不用 `Math.random()`。
- 默认核心 GSAP 足够；SplitText、ScrambleText、MotionPath、DrawSVG、MorphSVG 等插件只在本地 asset 可用且显式注册时使用。

## 推荐工作流（Claude 生成描述）

**最佳实践**：让 Claude 分析歌词并生成视觉描述，而不是使用简单的关键词匹配。

### Step 1: 准备阶段

```bash
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/create_mtv.py \
    --audio ~/乔木新知识库/04.素材/AI音乐/代码丛林.mp3 \
    --prepare-only \
    --scenes 8
```

这会输出每个场景的歌词，等待 Claude 生成视觉描述。

### Step 2: Claude 生成描述

在 Claude Code 对话中：

```
用户：为以下歌词场景生成视觉描述（纯视觉语言，不要文字）：

场景 1: "午夜的终端闪烁着光，键盘就是我的战场"
场景 2: "代码在眼前不停旋转，这个 Bug 藏得太深太远"
...

Claude：
场景 1: 深夜办公室，一个人影坐在发光的屏幕前，手指悬停在键盘上，周围是代码的光影
场景 2: 迷宫般的电路板，一个人在其中寻找出路，远处有微弱的光点
...
```

### Step 3: 更新配置并生成

将 Claude 生成的描述更新到 `visual_config.json`，然后：

```bash
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/create_mtv.py \
    --audio ~/乔木新知识库/04.素材/AI音乐/代码丛林.mp3 \
    --visual-config ~/Videos/MTV/代码丛林_20260125/visual_config.json \
    --skip-transcribe
```

## 完整示例

### 从 Suno 歌曲到 MTV

```bash
# 1. 生成歌曲（suno-music-creator）
python /Users/joe/.agents/skills/suno-music-creator/scripts/generate_music.py \
    '{"title":"代码丛林","prompt":"[Verse 1]...","tags":"rock"}' \
    --download

# 2. 一键生成 MTV（本 skill）
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/create_mtv.py \
    --audio ~/乔木新知识��/04.素材/AI音乐/代码丛林.mp3 \
    --style newyorker \
    --ratio 9:16
```

### 自定义配图数量

```bash
# 指定生成 6 张配图
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/create_mtv.py \
    --audio song.mp3 \
    --scenes 6 \
    --style watercolor
```

### 使用已有素材

```bash
# 跳过转录，使用已有 SRT
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/create_mtv.py \
    --audio song.mp3 \
    --skip-transcribe \
    --subtitle existing.srt

# 跳过生图，使用已有图片
python /Users/joe/.agents/skills/qiaomu-mtv-creator/scripts/create_mtv.py \
    --audio song.mp3 \
    --skip-images \
    --images-dir ./my_images/
```

## 常见问题

| 问题 | 原因 | 解决方案 |
|------|------|----------|
| 转录效果差 | 音乐人声混合 | 确保使用 `--no-vad` |
| 配图风格不对 | 描述包含风格词 | 检查 visual_config.json |
| 视频比例错误 | 图片比例不匹配 | 确保 `--ratio` 与图片一致 |
| 字幕不同步 | 时间轴不准 | 使用 `--auto-correct` |
| Twitter/X 上传失败 "宽高比太小" | 视频格式不兼容 | 已自动修复（yuv420p + High profile） |

## 字幕位置优化

根据各平台 UI 安全区域研究：

### 9:16 竖屏（TikTok/抖音）
- **底部安全区域**：250px（被 UI 按钮覆盖）
- **字幕位置**：距离底部 280px
- **字体大小**：32px
- **右侧边距**：120px（避开点赞/评论按钮）

### 16:9 横屏（YouTube/B站）
- **底部安全区域**：60px
- **字幕位置**：距离底部 60px
- **字体大小**：28px

## 视频格式兼容性

为确保社交媒体平台兼容，视频自动使用：
- **编码**：H.264 High Profile Level 4.0
- **像素格式**：yuv420p（不是 yuv444p）
- **宽高比**：SAR 1:1 + 正确的 DAR

## 依��安装

```bash
# Whisper
pip install faster-whisper

# FFmpeg (macOS)
brew install ffmpeg

# 图片处理
pip install Pillow
```

## 注意事项

1. **音乐转录**：必须禁用 VAD（`--no-vad`），否则唱歌会被过滤
2. **配图描述**：使用纯视觉语言，不要包含文字
3. **视频比例**：抖音/TikTok 用 9:16，B站/YouTube 用 16:9
4. **生成时间**：完整流程约 5-10 分钟（取决于配图数量）
5. **SRT 版本必须匹配**：Suno 为每个版本生成独立 SRT（`歌名.srt` 对应 `歌名.mp3`，`歌名-1.srt` 对应 `歌名-1.mp3`），两者时间轴不同，混用会导致画面和歌词错位约10秒。使用 `将进酒-1.mp3` 时必须用 `将进酒-1.srt`。
6. **Suno 可能生成重叠时间戳**：部分条目 start 时间相同（如同时演唱），脚本已自动去重，不影响效果。

