← 返回爱琴海个人主页

小说转 AI 剧情 MV

把小说/IP 做成 AI 原创剧情 MV 的完整流水线——剧本分镜 → 角色与场景图 → AI 配乐 → 图生视频素材 → 歌词精准对齐 → 多画幅成片 → 引流切片。当用户要做「小说改 MV」「AI 剧情 MV」「把小说/故事做成带歌词的视频」「歌词字幕对齐」「竖版+方版双版本 MV」时使用。覆盖火山方舟 Ark Seedance、ImageGen、海绵音乐、demucs+Whisper、ffmpeg 全流程,并内置 10 个已验证的避坑规则。

---
name: ai-novel-mv-pipeline
description: 把小说/IP 做成 AI 原创剧情 MV 的完整流水线——剧本分镜 → 角色与场景图 → AI 配乐 → 图生视频素材 → 歌词精准对齐 → 多画幅成片 → 引流切片。当用户要做「小说改 MV」「AI 剧情 MV」「把小说/故事做成带歌词的视频」「歌词字幕对齐」「竖版+方版双版本 MV」时使用。覆盖火山方舟 Ark Seedance、ImageGen、海绵音乐、demucs+Whisper、ffmpeg 全流程,并内置 10 个已验证的避坑规则。
agent_created: true
---

# AI 小说 MV 流水线

把一部小说/故事做成带精准歌词字幕的原创 MV。已在《诛仙·痴情咒》项目完整跑通(3分32秒成片,竖版+方版+15秒切片)。

## 何时使用
- "把 XX 小说做成 MV / 剧情视频"
- "AI 生成剧情 MV,要有歌词字幕"
- "歌词字幕对不上唱,怎么对齐"
- "竖版视频转方版,字被裁了"

## 成本边界(必须一开始就讲清楚)
- **只有"调用视频生成 API 新产生一段视频"才花钱**(火山方舟 Ark Seedance)
- 剪接、变速、加字幕、换字体、改画幅、混音、导出 N 个版本、重渲染 N 次 → **全部零费用**
- 生成好的素材目录(如 `videos_full/scene_01..12.mp4`)就是母带,务必保留并反复复用

## 流水线七步

### 1. 剧本与分镜
- 主线精炼成 12 段左右分镜,每镜对应一个情绪节点
- 若要引共鸣:先搜网民对该 IP 的热评,提炼 5-6 个共鸣点写进剧本

### 2. 角色形象图 + 场景参考图
- 角色图用 ImageGen 文生图,固化人设关键词(如"绿衣金铃""黑袍噬血珠"),后续每镜 prompt 都带
- 场景参考图 = 场景 + 人物,**人物面部不要过于写实**(见坑 1)

### 3. AI 配乐
- 海绵音乐 CLI(`aimv`),Key 用环境变量 `AIMV_API_KEY` 传入,避开 Git Bash 路径坑
- 生成有并发锁,多首要串行;男女声各出 2 个候选给用户挑

### 4. 视频素材(火山方舟 Ark Seedance)
- 模型 `doubao-seedance-2-0-260128`,**单次最长 12s**(不是 5s),图生视频 i2v
- 参数:9:16 / 1080p / duration=12,约 5 分钟一段
- 批量脚本必须带"跳过已存在"断点续跑(长任务会被中断)

### 5. 歌词精准对齐(本流水线最难、最值钱的一步)
**不要**用能量法/平均分配——密集编曲下必错。
正确链路:
```bash
pip install torch --index-url https://download.pytorch.org/whl/cpu
pip install demucs
pip install --no-cache-dir openai-whisper   # 必须 --no-cache-dir
```
1. demucs 剥人声:`python -m demucs --two-stems=vocals -n htdemucs song.mp3 -o out`
2. Whisper 识别:`whisper.load_model("small").transcribe(vox, language="zh")`
3. DP 单调对齐:以 difflib 字符相似度为得分,允许 1 行歌词对应 1-3 个识别片段、允许跳段(惩罚 -0.35)
4. 输出 `[{start, end, text}]` JSON 供渲染脚本读取

模板脚本见 `scripts/lyric_align_asr.py`。

### 6. 多画幅成片(关键:每个画幅独立渲染)
时间轴结构参考(以 212s 歌曲为例):
- 0–30s 序章:小说简介字幕 20 行 × 1.5s(若人声 30s 才进,这段就是纯音乐,无需压音量)
- 30s–203s 正片:按 ASR 时间轴逐句显示歌词
- 203–212s 尾板:金句 + 淡出

**每个画幅单独走完整流程**(几何变换 → 字幕烘焙 → 拼接 → 混音),字幕 Y 按各自画布设定:
| 画幅 | 简介字幕 Y | 歌词字幕 Y |
|---|---|---|
| 竖屏 1080×1920 | h×0.72 | h×0.78 |
| 方版 1080×1080 | h×0.74 | h×0.80 |

模板脚本见 `scripts/make_final_v2.py`(VARIANTS 循环,一稿多画幅)。

### 7. 引流切片(15s)
- 2s 标题卡 + 3 段高光快切 + 2s 引导卡
- 配乐取副歌段(先跑 `tools/analyze_audio.py` 看能量曲线找副歌),首尾淡入淡出
- 同样要竖版/方版独立渲染

## 十个必踩的坑(已验证)

1. **汉字渲染成方框** — ffmpeg `drawtext` 的 `fontfile` 路径含中文时静默加载失败、回退默认字体。字体必须放纯 ASCII 路径(如 `C:/mvfonts/`)。验证方法:同一串字分别用中/英路径渲染比对墨迹像素,方框明显偏低;或与 PIL 同字体渲染做 IoU(正常应 >0.9)。
2. **方版截字** — 不能"竖屏渲完再中心裁",字幕会骑在裁剪线上。必须独立渲染。
3. **Ark 拦真人脸** — `InputImageSensitiveContentDetected.PrivacyInformation`。用 ImageGen i2i 把参考图重做成"风格化 3D CG 概念图"即可过审。
4. **concat -c copy 时间戳错乱** — 实测 212s 变 3799s。拼接必须重编码(`-c:v libx264 -preset veryfast`)。
5. **403 AccountOverdueError 会瞬时抖动** — 先重跑一次再判断是否真的欠费。
6. **沙箱禁用 rmtree/unlink** — 临时目录用 `tempfile.mkdtemp`,成品用 `shutil.copy` 覆盖,不要删旧文件。
7. **pip 安装要加 `--no-cache-dir`** — 否则清缓存时触发沙箱删除限制而失败。
8. **Whisper 需要 PATH 上有 `ffmpeg.exe`** — imageio_ffmpeg 的二进制名不是 ffmpeg.exe,需复制一份到 PATH 目录。
9. **后台长任务会被中断** — 所有批量脚本必须断点续跑。
10. **滤镜字符串末尾多一个逗号** → `No such filter: ''` 报错。

## 中文字体获取
系统通常只有黑体/楷体/雅黑。想要更"灵动"的字体,`C:/Windows/Fonts` 没有行楷/毛笔体,可下载思源宋体(GitHub raw 常被墙,用 jsDelivr 镜像):
```
https://cdn.jsdelivr.net/gh/notofonts/noto-cjk@main/Serif/SubsetOTF/SC/NotoSerifSC-Bold.otf
https://cdn.jsdelivr.net/gh/notofonts/noto-cjk@main/Serif/SubsetOTF/SC/NotoSerifSC-Regular.otf
```
ffmpeg drawtext 可直接用 OTF,但**必须放 ASCII 路径**。

## 交付清单
- 竖版 9:16(抖音/视频号)+ 方版 1:1(小红书)完整成片
- 15 秒引流切片(竖版+方版)
- 发布三件套:标题 ×7、双平台文案、封面建议、话题标签、发布节奏
- 保留素材母带目录,便于零成本改版
小说转 AI 剧情 MV · 由 sync_homepage.py 自动生成