# 《说书人》MV 制作项目

- **歌曲**：《说书人》（词：古道背棺人　原唱：暗杠 / 寅子）
- **本片音源**：B站 UP 主 **咻咻满** 翻唱版（`BV1aw326mE3x`，2:57.66）
- **视觉风格**：**全片国风水墨**（人物与场景统一，由即梦 image2image 合成）
- **总积分消耗**：**0 积分**（即梦「图片 5.0 Lite · 2K 限时免费」权益 `image_basic_v5_2k`，余额全程 1130）

---

## 一、成果

| 产物 | 位置 | 规格 |
|---|---|---|
| **MV v2（全水墨合成版）** | `04-动态预览/说书人-MV-v2-全水墨.mp4` | 1920×1080 / 30fps / **173s** / 82MB / 含音轨 |
| 合成镜头 **12 张** | `06-合成镜头/` | 2560×1440，人物×场景 |
| 水墨人物 **10 张** | `02-人物设定/` | 2560×1440 |
| 水墨场景 **13 张** | `03-场景设定/` | 2560×1440 |
| 音源 + 逐句时间轴 | `05-音频/` | WAV 48kHz + 实测时间码 |
| 提示词 **42 个** | `prompts/` | 可完整复现 |

**访问地址**
- 下载页：http://192.168.31.76:8899/52-说书人MV/
- 成片直链：http://192.168.31.76:8899/52-说书人MV/04-动态预览/说书人-MV-v2-全水墨.mp4
- 相册：http://192.168.31.76:8900 → 目录 `shuoshuiren-mv/`

---

## 二、视觉方案演进（重要）

| 版本 | 人物 | 场景 | 结论 |
|---|---|---|---|
| v1 | 电影级写实 | 国风水墨 | ❌ **写实人物与水墨场景割裂、出戏**，已弃用 |
| **v2** | **水墨** | **水墨** | ✅ **全片水墨统一**，人物由 image2image 合成进场景 |

> 弃用的 10 张写实人物已移入 `02-人物设定/_已弃用-写实版/`（保留可对比，未删除）。

---

## 三、合成工序（本项目的关键手法）

单靠文生图拿不到「指定人物出现在指定场景」的画面。做法是用即梦 **`image2image`**：
上传 **2 张参考图**（参考图1 = 场景，参考图2 = 人物）+ 一段「把图2人物融入图1场景」的编辑提示词。

```
dreamina image2image \
  --images 03-场景设定/场景-路边茶楼-水墨.png \
  --images 02-人物设定/说书人-设定图-水墨.png \
  --prompt "$(cat prompts/合成-01-说书人×路边茶楼.txt)" \
  --ratio 16:9 --resolution_type 2k --model_version 5.0
```

关键提示词骨架（12 张共用，只换中间的动作描述）：
> 把参考图2中的人物自然地融入参考图1的场景：**〈动作与位置〉**。严格保持参考图1的宣纸质感、
> 墨色晕染、留白构图与整体色调，人物同样以水墨线描与淡笔着色表现，与场景的光影氛围自然融合，
> 人物比例与场景透视协调，不能出现剪贴拼贴感或风格割裂。

**12 个合成镜头**：说书人×路边茶楼 / 说书人×戏台 / 天山女子×枯城 / 昆仑痴儿×雪山 /
侠女×桃花林 / 游子×酒剑随马 / 判官×戏台 / 看客×路边茶楼 / 天山女子×桃花林 /
游子×街市吆喝 / 侠女×楼阁夜 / 说书人×江山风雨

**效果**：模型不仅融合了人物，还会**自动补出合理道具**（说书人脚下多出说书台、看客身旁多出茶桌），
大幅提升画面完整度。风格统一性实测良好，无剪贴感。

---

## 四、时间轴怎么来的

音源总长 177.66s，但**音乐实际在 2:52.85 结束**，之后是静音尾巴。逐句时间码通过两法互证：

1. **画面字幕法（主）**：该翻唱视频**画面上带书法体歌词字幕**。按 `fps=1/1.5` 抽 118 帧 →
   做成带时间码的 4×4 对照表 → 直接读字幕，得到每句起止（误差 ≤1.5s）。
2. **音频能量包络法（交叉验证）**：纯 Python（**本机无 numpy/PIL**，用 `wave`+`array` 手写）
   按 50ms 窗口算 RMS，定位显著能量变化点 → 确认「前奏 0:00–0:09.25 弱起，
   正片 0:09.25 进入，2:52.85 结束」。

完整逐句时间码：**`05-音频/时间轴-音源字幕实测.md`**

> ⚠️ **本翻唱版与原始歌词有出入**：尾声副歌**省略了 4 句**（江山易老嘛 / 痴儿侠女 / 酒剑随马 /
> 白衣不见），从「谈笑一段」直接跳到「这江山风雨」。MV 按**音源实际内容**排镜。

---

## 五、MV v2 构成

- **53 个镜头**，0.0 → 173.0s，与音源逐句对齐
- 每镜：素材 + **Ken Burns 运镜**（推 / 拉 / 左右横移）+ 歌词字幕（对白段换暖黄色）
- 片头大标题「说书人」、间奏制作信息卡、片尾淡出到黑
- **28 种素材**参与，最高重复 4 次

**复现**：
```bash
cd ~/Downloads/dl-hub/52-说书人MV/04-动态预览
python3 build_mv.py            # 完整成片
python3 build_mv.py --preview  # 只渲前 3 镜自检
```

---

## 六、踩坑与修复（重要）

1. **🔴 JSON 解析正则错误（影响最大，已修）**
   即梦 CLI 把日志与结果 JSON **混在 stdout**，而 `SLOW SQL` 日志行里**也含有 `{`**
   （`commerce_info="{...}"`）。原先用贪婪正则 `\{.*\}` 会从**日志里的 `{`** 开始匹配 →
   解析必然失败 → 触发兜底逻辑 → **频繁误取上一条任务**。
   **修复**：改为 `t.rfind("\n{\n")`，从「行首单独一个 `{`」开始的最后一段解析。
   修复后第 4 轮（6 人物 + 12 合成）**零重试、零兜底**。

2. **🔴 兜底串图事故（已修 + 有护栏）**
   提交阶段网络超时（`context deadline exceeded`）时，原兜底会取 `list_task` 最新任务；
   若本次**根本没提交成功**，就会把**上一条的图**当成本次产物——实测导致 `天山女子-写实` 与
   `说书人-写实` **md5 完全相同**。
   **护栏**：提交前记录 `PREV_SID` → 失败先重试 3 次 → 仍失败才兜底，且**兜底值必须 ≠ `PREV_SID`**。
   **已实证生效**：`场景-城中楼阁-夜` 提交失败被正确拒绝（而非复制上一张）。

3. **本地任务库是共享的**：`list_task` 会混入别的会话提交的任务（曾见 1728×2304 竖版，非本项目）。
   兜底必须带 `PREV_SID` 护栏。

4. **ffmpeg 三个坑**：`drawtext` 的 `text='0:01.5'` 冒号会被当选项分隔符截断（须写 `0\:01.5`）；
   `xstack` 的 `layout` **行高必须累加**（`h0+h1`），只写 `h0` 会行重叠；
   `-frames:v 1` 必须放在**输出文件之前**。

5. **`get_history_by_ids failed: ret=1015`**：轮询报错但任务已提交、积分照扣。切勿重复提交。

6. **环境限制**：本机无 `tesseract`/`numpy`/`PIL`/`ImageMagick`，只有 `ffmpeg`。
   OCR 靠多模态读图，图像合成与对照表全用 `ffmpeg` filter 完成。

---

## 七、版权与署名

本片为**粉丝向非商用同人作品**。音源来自 B站 UP 主「咻咻满」的翻唱（`BV1aw326mE3x`），
原词曲版权归 **古道背棺人 / 暗杠 / 寅子** 所有。对外发布请保留片尾署名并注明非商用。

---

## 八、下一步可选项

- [ ] **转场**：当前为硬切，可加 0.3s 交叉溶解（需重算重叠时长）
- [ ] **字幕升级**：竖排书法体逐字浮现，对齐人声
- [ ] **补图**：限免期内继续扩图，进一步降低单图重复率
- [ ] **真动态**：如需图生视频，走即梦 Seedance（需积分，执行前先报价）；**不使用 GPU 机**
