# 《霜刃》片头曲 · 06 制作记录（交付）

> **成片**：2 分 21 秒 / 1344×768（2.39:1 加黑边）/ 24fps / 立体声 48kHz
> **制作日期**：2026-09-20（生成 03:35→15:28，后期 15:30→16:00）
> **状态**：✅ 全流程完成，成片可播
> **下载页**：http://192.168.31.76:8899/46-武侠片头曲项目/

---

## 一、交付物

| 文件 | 说明 | 下载页 |
|---|---|---|
| `post/04_成片_2.39x1_混音.mp4` | **交付主片**：裁 2.39:1 + 黑边 + 剧名淡入 + 完整混音 | [链接](http://192.168.31.76:8899/46-武侠片头曲项目/post/04_成片_2.39x1_混音.mp4) |
| `post/04_母版_16x9_混音.mp4` | 16:9 母版（不裁幅、不叠字），便于二次剪辑 | [链接](http://192.168.31.76:8899/46-武侠片头曲项目/post/04_母版_16x9_混音.mp4) |
| `post/03_final_239.mp4` | 2.39:1 含剧名，**静音画面层** | — |
| `post/03_master_169.mp4` | 16:9 画面层 | — |
| `post/01_concat.mp4` · `02_grade.mp4` | 拼接版与调色版（中间产物，便于回退） | — |
| `music/v1-male.flac` | **主音轨**《霜刃引》男声独唱（48kHz） | [链接](http://192.168.31.76:8899/46-武侠片头曲项目/music/v1-male.mp3) |
| `music/v2-female.flac` · `v3-duet.flac` | 女声独唱版 / 男女对唱版 | — |
| `shots/shot01–18.mp4` | 18 个镜头母版 | — |
| `qa/shot*_sheet.jpg` | 每镜 6 帧联系表（质检用） | [目录](http://192.168.31.76:8899/46-武侠片头曲项目/qa/) |
| `title/title_xiaobiaosong_1344x768.png` | 剧名叠加层（带 alpha）；`title_kaiti_*` 为备选 | — |
| `assets/` | 23 张素材（4 角色设定稿 + 9 场景板 + 7 道具 + 3 特写） | [目录](http://192.168.31.76:8899/46-武侠片头曲项目/assets/) |
| 相册 | 18 镜已自动收录（ComfyUI 输出） | http://192.168.31.76:8900 → `video/` |

---

## 二、成片规格核验

| 项 | 实测 | 目标 | 结论 |
|---|---|---|---|
| 时长 | 141.21 s | 音乐 141.52 s | ✅ 收在尾奏余韵里 |
| 总帧数 | 3388 帧 | 17×192 + 124 = 3388 | ✅ 精确 |
| 分辨率 | 1344×768（2.39:1 内容 + 黑边） | — | ✅ |
| 帧率 | 24 fps | 24 | ✅ |
| 音轨 | AAC 立体声 48kHz，mean **−15.2 dB** / max −0.2 dB | 对齐原歌曲 −15.6/0.0 | ✅ |
| 剧名 | 135.2s 起 1.4s 淡入，持续到片尾 | — | ✅ 已抽帧确认 |

---

## 三、生成运行记录

**11 小时 53 分钟，18 镜全部成功，零失败、零硬挂。**

| 项 | 值 |
|---|---|
| 时间窗 | 03:35:32 → 15:28:15 |
| 单镜耗时 | 34–43 分钟（192 帧 / 12 步 / 1344×768），含 5 分钟冷却合计 38–48 分钟/镜 |
| 最短 | shot18（124 帧）16.4 分钟 |
| 底座 | `Minimax-h3_Singularity_ref2va_Pruned_v1.3_int8.safetensors` |
| 节点 | **官方 `MiniMaxH3ReferenceToVideo`（comfy_extras）+ 独立 MotionContext 包**；**零加速节点** |
| 采样 | res_multistep + simple，**12 步**，单采 |
| 冷却 | 基础 300s + **等温度回落到 ≤62°C**；实测出片后 60°C → 5 分钟内降到 44°C |
| 续接 | 仅镜10→镜11 用 AV latent（`h3_ctx_duizhi`） |

> 09-15 / 09-17 两次整机硬挂的教训全部生效：单镜独立任务、192 帧远离 90 分钟红线、强制冷却、断点续跑、失败即停。**连续 11.9 小时满载没有再出现硬挂。**

---

## 四、过程中抓到的三个真问题（都已修复）

### 4.1 剧名叠加层根本叠不上去（后期前抓到）

PNG 作为 ffmpeg 输入是**单帧**流，`fade` 的时间轴永远停在 t=0，alpha 恒为 0 —— 剧名实际不会出现。
**修复**：加 `-loop 1` 把字层变成连续视频流。已在 2.39:1 裁幅下抽帧确认落位。
> 若没在后期前验证，会是「跑完 12 小时才发现片名没上」。

### 4.2 混音输入标号写反，歌曲被压到 20%（交付前抓到）

`-i video -i MUSIC` 时 `[0:a]` 是**画面自带的环境音**、`[1:a]` 才是**歌曲**，我最初把 `volume=0.20` 加在了歌曲上。
实测成片 mean −30.9 dB（原歌曲 −15.6 dB），差 15 dB —— 相当于整片只有气氛没人声。
**修复**：歌曲 1.0 / 环境音 0.20，并关掉 `amix` 默认的 `normalize=1`（它还会把每个输入再减半）。
修复后 mean −15.2 dB / max −0.2 dB ✅

### 4.3 AV latent 续接段会短 22 帧（质检时发现）

`MotionContextTrim` 会裁掉钉入的 22 帧前缀，所以**续接段的交付帧数 = 采样帧数 − 22**。镜11 因此只有 170 帧（应 192），会让后半段整体比音乐早 **0.917 秒**。
**修复**：把**前一个镜头（镜10，静止的云海远景剪影）末帧克隆延长 22 帧**吸收缺口。对画面几乎不可察觉，时间轴精确回到 3388 帧。
> 这条是**方法论级**的发现：以后凡是带 AV latent 续接的段，采样帧数要按「目标帧数 + 22」来给，否则整条时间轴会漂。

---

## 五、18 镜质检结论

规格：**17/18 精确达标**（1344×768 / 192 帧 / 8.00s / 带音轨）；镜11 为 170 帧（续接裁剪，已按 4.3 补帧）。镜18 为 124 帧。

画面抽检（联系表见 `qa/`）：

| 镜 | 内容 | 抽检结论 |
|---|---|---|
| 01 | 雪原古战场大远景 | ✅ 构图与场景板一致，缓推到位，无文字无崩坏 |
| 05 | 药庐苏晚回眸 | ✅ 回眸过程完整、朱红披帛甩出有力、脸干净 |
| 08 | 裴无涯近景 | ✅ 银面具反光、皮指套叩栏、长街灯火 bokeh 全对，脸无畸变 |
| 11 | 刀剑相击 | ✅ 双人身份正确、有火星、与镜10 轴线延续 |
| 17 | 雪中擦肩 | ✅ 双人身份（黑衣狐裘 vs 月白朱红披帛）完全正确，远景无脸崩 |

**未做 FaceRefine**：中近景人脸（镜5/8/12）抽检均干净，未发现需要修复的崩坏，因此省下数小时 GPU 时间。

---

## 六、后期管线（可复现）

```
18 镜 → fixup（补帧对齐网格）→ concat（拼接）
      → grade（冷青/去饱和0.90/胶片曲线/暗角）
      → finish（裁 2.39:1 + 黑边 + 剧名 alpha 淡入）
      → mix（《霜刃引》0dB + H3 环境音 −14dB，压缩+限幅）
```

```bash
cd ~/Downloads/h3-tasks/sd-yin
~/Downloads/vlm-env/bin/python post_produce.py --stage all
```

⚠️ 必须用 `~/Downloads/vlm-env/bin/python`（系统 python3 无 `requests`）。

---

## 七、脚本清单

| 脚本 | 作用 |
|---|---|
| `h3_shot.py` | 逐镜执行器（官方节点图 + 温度冷却 + 断点续跑 + 内存哨兵） |
| `shots_a.json` / `shots_b.json` | 18 镜清单：完整六段式提示词、参考图、seed、latent 配置 |
| `rescue_current.py` | 接住 GPU 上正在跑的任务（重启执行器时不浪费在途算力） |
| `post_produce.py` | 后期总装（fixup/concat/grade/finish/mix） |
| `make_title.py` | 剧名排版器（小标宋/楷体两版） |
| `inspect_shots.py` | 镜头质检（规格 + 联系表） |
| `music_to_grid.py` | 歌曲 → 镜头网格换算 |
| `abc_sections.py` | ABC 乐谱段落解析 |
| `yue2_three_versions.py` | 三版本歌曲生成 |
| `h3_run.log` / `batch_detached.log` | 运行日志 |

---

## 八、v2 修订（用户反馈后返工，2026-09-20 18:00–19:10）

用户审片指出两处「有点搞笑」的动作。诊断结论：**都是提示词歧义，不是模型能力问题**。

### 8.1 镜7（48s）男主"背身开门" —— 几何自相矛盾

原提示词同一段里写了「门向内开 + 他背对镜头走出去」，又写了「摄影机在他身后跟随」。
**摄影机在他身后 = 门在摄影机背后**，这个动作根本无法入画；模型只能自己发明一个能同时满足「背对镜头」与「有扇门」的动作，于是变成背着手开门。

**改法**：把「开门」与「走人」拆成两个互不干扰的节拍，并禁止任何手部碰门。
- 0–1.5s 门关着，只有雪落；
- 1.5s 门**自行向外推开**（从里面推，画面不出现手或手臂），暖光成楔形洒到雪上；
- 2.5s 他从门内走出，在光里停一拍（背影/侧后）；
- 之后斜向左前方走远，雪地留脚印。
- 负面项：`no hand touches the door` / `never walks backwards` / `never turns his head`。

> 要点：模型不需要做精细物体交互——只让它同时渲染「一扇自己转开的门」和「一个人往外走」。

### 8.2 镜8（59s）反派叩栏过快过多 —— "evenly spaced" 被读成连击

原提示词写 `taps the stone three times, evenly spaced`。「均匀间隔的三次」被执行成了均匀快速的连续敲击，看着像打拍子，反而消解了「老谋深算」。

**改法**：全程只敲一次，且用**静止**来演城府。
- 前 3 秒完全静止，只有抬眸；
- 3–5.5s 手一动不动搭在石栏上；
- 5.5s 食指缓慢抬起、停顿、落下**一次**，一声轻响，之后手彻底静止到片尾。
- 负面项：`one tap only` / `no second tap` / `no repeated tapping` / `no drumming of the fingers`。

### 8.3 返工数据

| 项 | 值 |
|---|---|
| 重跑镜头 | 镜7（seed 20260962→**20260963**）、镜8（20260969→**20260971**） |
| 耗时 | 镜7 约 34 分钟 + 冷却，镜8 33.9 分钟 + 冷却，共约 73 分钟 |
| 是否影响他镜 | **否**——两镜都不在 AV latent 续接链上（只有镜10→镜11 用 latent） |
| 后期重建 | `post_produce.py --stage all --force`，19.2 分钟 |
| 修复后复核 | 镜7 抽帧 49/52/55s：门敞开→走出→背身走远 ✅；镜8 抽帧 59/61/63s：手仅 59s 一次起落、其后完全静止 ✅ |
| 响度复核 | mean −15.2 dB / max 0.0 dB（与原曲一致） |
| 旧版备份 | `shots/_v1_backup/shot07_v1_背身开门.mp4`、`shot08_v1_快速连击.mp4` |

> ⚠️ 坑：备份文件若放在 `shots/` 目录下，会被执行器的 `shot*.mp4` 通配匹配到，导致后期报「镜头数不对：20/18」。备份必须放**子目录**。

### 8.4 镜8 v3 —— 改为「坐太师椅」（用户第二次反馈，2026-09-20 19:20–20:30）

用户要求把镜8 从「立于垛口」改成「坐在太师椅上」。这个方向是对的：**坐着的反派比站着的更有压迫感**，也更贴「老谋深算」。

**前置问题**：原有 9 块场景板里**没有太师椅**。让 H3 凭空画椅子风险高，所以先补一块场景板。

| 步骤 | 做法 | 结果 |
|---|---|---|
| 补场景板 | 即梦 `5.0` + `2k` 生成两张（椅子背对镜头 / 椅子侧对镜头） | **0 积分**（1110→1110 实测） |
| 选型 | 用**侧对镜头**那张（`sc_throne_chair_facing.png`） | 背对镜头那张只能拍后脑勺，而本镜核心是「抬眸 + 面具反光」的正面戏 |
| 重跑镜8 | seed 20260971→**20260975**，参考图换成新场景板 + 裴无涯三视图 | 33.5 分钟，192 帧 / 8.00s ✅ |
| 后期重建 | `post_produce.py --stage all --force` | 18.6 分钟 |

**提示词关键改动**
- 椅子「四分之三侧对镜头」，人物**从第一帧起已落座**，并硬约束 `He remains seated in the chair for the entire shot, never stands, never rises and never leans forward`（防止模型把人立起来）；
- 叩击从**石栏**改到**木扶手**（`wooden armrest`），音色由清脆转沉闷，气质更「权」；
- 保留 v2 的克制节奏：前 5 秒手完全不动 → 5.0s 食指缓慢抬起、停顿、落下**一次** → 之后手静止到片尾。

**新场景板**：`assets/sc_throne_chair_facing.png`（交付用）、`sc_throne_chair_back.png`（备选：椅子朝向远处灯火，适合拍「俯瞰江山」的背影镜头，本次未使用）。
提示词存于 `~/Downloads/h3-tasks/sd-yin/prompts/sc_throne_chair2.txt`。

**复核**：成片 57/59/61/63s 抽帧确认——端坐太师椅、四分之三侧对镜头、银面具接月光、手搭卷云扶手，仅 59s 一次起落；响度 mean −15.2 dB / max 0.0 dB ✅
旧版备份：`shots/_v1_backup/shot08_v2_站立叩栏.mp4`。

### 8.5 镜8 v4（定稿）—— 站姿 + 明暗交替的脸（用户第三次反馈，2026-09-21 00:30–01:25）

用户定调：**回到站姿，不用敲击动作，改用「明暗交替的脸」来演城府。**

这个方向比"叩击"高级：**光在变、人不变**——动作层面的完全静止 + 光照层面的持续变化，才是"看不透"的视听表达。叩击是"人在动"，而静止是"人在忍"，后者更冷。

**提示词设计**
- 站姿立于垛口，**八秒内身体、头、手、手指全部不动**，全程只眨一次眼；
- 天上的**流云反复掠过月亮**作为唯一变化源，冷光在脸上三度涨落：
  `00:00.5 暗 → 00:02.0 满打 → 00:04.0 暗 → 00:05.5 满打 → 00:07.0 微暗`；
- 亮时**一侧脸与面具锐利受光、另一侧沉入深阴影**（半边脸语言）；暗时**几乎只剩面具轮廓**，背景暖色灯火反衬成剪影；
- 音效层同步去掉敲击（`no impact sounds and no tapping`）。

**数据**

| 项 | 值 |
|---|---|
| 重跑镜8 | seed 20260975→**20260981**，参考图换回 `sc_city_tower.png` + 裴无涯三视图 |
| 耗时 | 33.4 分钟 + 冷却 |
| 后期重建 | 18.5 分钟 |
| 复核 | 抽帧 0.5/2.0/3.5/5.0/6.5/7.75s：暗→亮→暗→亮→微暗，**六帧头位与视线完全一致** ✅；成片 57/59/61/63s 同样成立 ✅ |
| 响度 | mean −15.2 dB / max 0.0 dB ✅ |
| 备份 | `shots/_v1_backup/shot08_v3_坐太师椅.mp4` |

> 三条弯路的价值：v1 快速连击 → v2 站立单次叩击 → v3 坐太师椅 → **v4 站姿 + 明暗交替（定稿）**。
> 结论：**用"光照变化"代替"动作"来演内心**，既绕开了模型做精细手势的短板，又比任何动作都更克制。

**新增经验**：当需要「不动声色地表现压迫感」时，不要写动作，改写成**光照事件**（流云掠月 / 灯焰摇曳 / 帘影扫过），并明写 `does not move his body at all` + 具体时间点的光照变化。模型对光照变化的渲染能力远强于对手部动作的控制能力。

---

## 九、经验沉淀（下次直接复用）

1. **音乐先行**，且用 **ABC 乐谱头部拿精确 BPM**（比音频估计可靠）；但 **ABC 的段落标记不能当音频结构用**——实测两者不一致，内容强度要按**音频能量包络**排。
2. **让 BPM 与 H3 帧数网格对齐**：本片 120 BPM → 4 小节 = 8.000s = 192 帧（恰好是 17k+5），剪辑点天然落在乐句上。
3. **192 帧比 260 帧更安全**（34–43 分钟 vs 54–86 分钟），且切点更密、片头更活。
4. **场景板作 `<Picture 1>` 当首帧**是控制构图最有效的手段（13 小时那次与本次都验证）。
5. **AV latent 续接段要按「目标 + 22 帧」给采样帧数**（见 4.3）。
6. **ffmpeg 叠加 PNG 必须 `-loop 1`**（见 4.1）。
7. **混音时 `[0:a]` 是画面自带音、`[1:a]` 是外挂音轨**，别写反；`amix` 记得 `normalize=0`（见 4.2）。
8. **长跑要脱离工具会话**（`setsid`），并另起一个轻量等待任务挂在会话上以获取完成通知。
9. 冷却不是干等：**读温度等回落 + 读宿主内存**，这才是 09-15 那次冻死的真正防线。
10. **写动作前先做一遍「摄影机能不能拍到」的几何自检**：镜7 的返工就是「背对镜头」与「门在他身后」两条要求互相矛盾——描述里同时出现「背对摄影机」+「摄影机在他身后」+「他从门里出来」时，门必然在镜头背后，模型只能瞎编。**每个镜头都要问：机位在哪、主体朝哪、被交互的物体在画面里吗。**
11. **不要让模型做精细物体交互**（开门闩、握把手、解绳结）：改成「物体自行运动 + 主体随后移动」，把两个动作解耦。
12. **数量词要封顶**：`three times` / `evenly spaced` 这类会被执行成快速连击。要「克制的一次」就明写 `one tap only` + `no second tap` + `no drumming`，并给出**具体时间点**（如 `At 00:05.500`）。用**静止**演情绪比用重复动作更可靠。
13. **备份文件不要放在被通配的工作目录里**（见 8.3 的坑）。
