Bläddra i källkod

docs: 产线A/B 能力矩阵更新(即梦通道实态)+ 新增人物资产章节

FmodeAgent 1 vecka sedan
förälder
incheckning
a8158c40c4
2 ändrade filer med 140 tillägg och 77 borttagningar
  1. 85 51
      references/pipeline-a-song-mv.md
  2. 55 26
      references/pipeline-b-talking.md

+ 85 - 51
references/pipeline-a-song-mv.md

@@ -22,14 +22,15 @@ fmode-mv providers       # 能力现状(哪条通道能用)
 ## 一、产线全景
 
 ```
-① 作曲填词      [chat ✅]   → work/song.json
-② 分镜脚本      [chat ✅]   → work/storyboard.json
-③ AI 音乐       [music ⚠️]  → work/audio/music.mp3
-④ 音轨分离      [本地 ◐]    → work/audio/vocals.wav + instrumental.wav
-⑤ 关键帧        [image ✅]  → work/frames/shot-XX.png
-⑥ 图生视频      [video ⚠️]  → work/clips/shot-XX.mp4
-⑦ 唇形驱动      [lipsync ⚠️] → work/lipsync/lip-XX.mp4
-⑧ 剪辑合成      [本地 ✅]   → out/mv.mp4
+① 作曲填词      [chat ✅]     → work/song.json
+② 分镜脚本      [chat ✅]     → work/storyboard.json
+③ AI 音乐       [music ❌]    → work/audio/music.mp3(未开通,可自备音频)
+④ 音轨分离      [本地 ◐]      → work/audio/vocals.wav + instrumental.wav
+⑤ 人物资产      [即梦 ✅]      → out/character/{1-定妆照,2-上半身,3-全身,4-多视图}.png   ★v0.2新增
+⑥ 场景图+关键帧  [即梦 ✅]      → work/scene/shot-XX.png(无人)+ work/frames/shot-XX.png(有人)★v0.2
+⑦ 图生视频      [即梦 ✅]      → work/clips/shot-XX.mp4(真 AI 生成)        ★v0.2
+⑧ 唇形驱动      [lipsync ❌]   → 可用即梦数字人替代
+⑨ 剪辑合成      [本地 ✅]     → out/mv.mp4
 ```
 
 一条命令跑完全程:
@@ -156,62 +157,88 @@ fmode-mv separate work/audio/music.mp3
 
 ---
 
-## 六、⑤ 场景 & 人物关键帧 ✅
+## 六、⑤ 人物资产(★v0.2 新增,不换脸的关键)
 
 ```bash
-fmode-mv keyframe --from work/storyboard.json              # 全部镜头
-fmode-mv keyframe --from work/storyboard.json --shot 3     # 只做第 3 镜
-fmode-mv keyframe --from work/storyboard.json --dry-run    # 只看 prompt,不花钱
+fmode-mv character-sheet --desc "25岁东亚女性,栗棕色长直发,身穿米色针织开衫和白色长裙,清冷安静" --limit 1
+fmode-mv character-sheet --desc "..." --limit 4      # 完整四步
 ```
 
-**产物**:`work/frames/shot-XX.png` + `work/frames/keyframes.json`(含每张的 prompt,便于复现)。
+四步流水线:**① 定妆照(3候选) → ② 上半身 → ③ 全身 → ④ 多视图**,每步图生图参考上一步 + 锐度自动择优。
 
-**要点**:
-- 实测可用:`gpt-image-2.5-sunburst`,`--tier large` 出 1792×1024,约 3MB/张。
-- **先 `--dry-run` 看 prompt**,确认人物锚点进去了再花钱。这是最省钱的习惯。
-- 风格统一靠 `styleKeywords`(自动拼入);不一致时手工把它写具体,
-  例:`"neo-noir city pop, sodium orange and cyan teal palette, 35mm film grain"`。
+**产物** `out/character/{1-定妆照,2-上半身,3-全身,4-多视图}.png` + `candidates/` + `character-sheet.json`。
+
+**为什么必须有这一步**:纯 AI 出片最容易翻车的就是「同一人物跨镜头换脸」。
+只靠 prompt 里的 `appearanceAnchor` 是**软约束**;有了多视图做图生图参考,才是**像素级硬约束**。
+
+**费用**:`--limit 1` ¥0.60(3 张候选);完整四步 ¥1.98(9 张候选)。`--dry-run` 零费用。
 
 **避坑**:
-- **首镜最重要**:第 1 镜定调,人物/场景一致性从它开始。先只跑 `--shot 1`,满意了再批量。
-- 图里的**文字/招牌** AI 会写成乱码或错字。若在意,在 prompt 里避免要求文字招牌,
-  或在 `styleKeywords` 加 `no text, no signage`。
-- 图生视频需要**同一角色不同机位**时,用 `--anchor` 显式传锚点,别指望模型自己记住。
+- 服装请写在 `--desc` 里(如「身穿…」),否则会退回默认兜底并在日志里警告。
+- `--single` 每步只出 1 张、跳过择优(省钱,但质量靠运气)。
+
+---
+
+## 七、⑥ 场景图 + 关键帧 ✅(★v0.2 重构)
+
+```bash
+fmode-mv scene --from work/storyboard.json --character out/character/4-多视图.png
+fmode-mv scene --from work/storyboard.json --shot 3 --limit 1     # 试跑
+fmode-mv scene --from work/storyboard.json --scene-only           # 只出场景图
+```
+
+**两步法**(v0.2 的核心改进):
+1. **场景图(无人/纯环境)** ← 文生图,为每镜铺环境;
+2. **关键帧(有人)** ← 图生图多图参考:`[场景图, 人物多视图]`。
+
+**为什么拆两步**:一次推理里同时解决空间/光线/人脸三件事,结果往往是背景每镜都不一样、
+人物和背景光照打架。拆开后背景一致、光照统一。
+相邻镜头还会把「上一镜场景描述」注入本镜 prompt 做一致性约束。
+
+**产物** `work/scene/shot-XX.png` + `work/frames/shot-XX.png` + `work/scene/scenes.json`。
+
+**费用**:每镜 ¥0.42(场景图 ¥0.20 + 关键帧 ¥0.22)。
+
+> 旧的 `fmode-mv keyframe`(走 `/v1/images/generations`)保留可用,作为即梦不可用时的回退。
 
 ---
 
-## 七、⑥ 图生视频 ⚠️ 通道未开通
+## 八、⑦ 图生视频 ✅(★v0.2 已接通真实通道)
 
 ```bash
-fmode-mv video --from work/storyboard.json
+fmode-mv video --from work/storyboard.json                       # auto:走即梦真通道
+fmode-mv video --from work/storyboard.json --limit 1             # 先试 1 镜(≈¥1.41)
+fmode-mv video --from work/storyboard.json --mode still          # 零费用:Ken Burns 兜底
 ```
 
-**现状实测**:`POST /v1/video/generations` 返回 **503 `No available channel for model doubao-seedance-1-0-pro`**。
-模型在清单里,但没有可用渠道。
+**实测**:`/getVideoV3_720p`,121 帧(5 秒),实扣 **¥1.41**,返回 h264 mp4(2.4MB)。
+旧通道 `/v1/video/generations` 仍是 503,已由即梦替代。
 
 **`--mode` 三种模式**:
 
 | 模式 | 行为 |
 |---|---|
-| `auto`(默认) | 先探活;通就走真通道,不通**自动降级**为 Ken Burns 兜底 |
-| `provider` | 只走真通道,不通即失败(用于通道开通后强制验证) |
-| `still` | 强制用关键帧做 Ken Burns 运镜 |
+| `auto`(默认) | 探活;通就走即梦真通道,不通**自动降级**为 Ken Burns 兜底 |
+| `jimeng` | 只走即梦,不通即失败(用于强制验证) |
+| `still` | 强制用关键帧做 Ken Burns 运镜(零 API 费用) |
+
+**三条硬约束(v0.2 实测修正,KB 未记载)**:
 
-**兜底是什么**:把关键帧做成 2 倍画布上的缓慢推拉(`zoompan`),按镜头序号交替推近/拉远。
-产物文件名是 **`shot-XX.fallback.mp4`** —— 一眼能看出这不是真 AI 生成视频。
+1. **`frames` 必须 ∈ {121,145,169,193,217,241}**(既在 `[121,241]` 内,又要 `≡1 (mod 24)`)。
+   → **单镜只能是 5/6/7/8/9/10 秒的整数秒**。分镜阶段就按时长设计最省事。
+2. **`method=3`(首尾帧)需要 2 张同比例图**;第一镜用下一镜的关键帧作尾帧。
+3. **`method=3` 失败会自动降级 `method=2`**,返回带 `degraded: true` 并在日志写明(不静默)。
 
 **避坑**:
-- 兜底片段**体积偏大**(1080p 十余 MB/段),因为静态图用低 CRF 编码。要压小可加 `--tier standard` 生成小图。
-- 单段**必须 5~8 秒**(技能已把分镜时长钳制在此区间)——真通道一般也就支持 4~10 秒,
-  长镜头要靠多段拼接,而不是让单段变长。
-- 真通道开通后**一键替换**:
-  ```bash
-  fmode-mv video --from work/storyboard.json --mode provider --force
-  ```
+- **场景跨度大时别用 `method=3`**(室内→室外、人物→空镜这类两帧会崩坏)——
+  硬规则:首尾帧只用于同场景连续动作 / 相似场景过渡 / 状态渐变。
+- 首帧图**长边/短边 ≤ 3**,否则被拒。
+- 兜底片段体积偏大(低 CRF 编码静态图)。
+- 真通道开通/重新开通后**一键替换**:`fmode-mv video --from work/storyboard.json --force`。
 
 ---
 
-## 八、⑦ 唇形驱动 ⚠️ 平台暂无通道
+## 九、⑧ 唇形驱动 ❌ → 改用即梦数字人 ✅
 
 ```bash
 fmode-mv lipsync --probe    # 先看通道状态
@@ -219,21 +246,25 @@ fmode-mv lipsync --probe    # 先看通道状态
 
 **现状**:网关**没有** `/lipsync/generations` 这条路由(返回前端兜底页)。
 
-**三条替代路线**(按推荐度排):
+**v0.2 的替代(实测可用)**:
+
+```bash
+fmode-mv jimeng digital-human \
+  --ref out/character/3-全身.png \
+  --audio work/audio/vocals.wav \
+  --prompt "固定机位,头部随节奏轻微摆动,神情投入,眼神直视镜头"
+```
+
+走即梦数字人 v1.5 三步流程,**¥1/秒**,是真人对口型。
+
+**其余替代路线**(按推荐度):
 
 | 方案 | 做法 | 观感 |
 |---|---|---|
+| 即梦数字人 | 上面那条命令 | **最好**(¥1/秒) |
 | C. 纯空镜 + 字幕 | 不标 `lipSync`,全片走 B-roll | 纯音乐 MV 最常见,零风险 |
 | B. 表情微动镜头 | 演唱镜头走图生视频(表情/头部微动),不严格对口型 | 成片观感可接受 |
-| A. 自建服务 | 部 Wav2Lip / SadTalker / LatentSync,`export FEME_LIPSYNC_ENDPOINT=https://your-host/lipsync` | 最好,但要部署 |
-
-**自建对接的请求约定**(技能会这样调你的服务):
-
-```jsonc
-POST <FEME_LIPSYNC_ENDPOINT>
-{ "image": "<人脸图片URL或base64>", "audio": "<音频URL>", "model": "..." }
-// 期望返回:{ "data": { "video_url": "https://..." } } 或任何含视频 URL 的结构
-```
+| A. 自建服务 | 部 Wav2Lip / SadTalker / LatentSync,`export FEME_LIPSYNC_ENDPOINT=...` | 需部署 |
 
 **避坑**:
 - 唇形镜头**全片别超过 4 个**:每个都需要人脸正脸关键帧 + 人声干声,成本和翻车率都高。
@@ -241,7 +272,10 @@ POST <FEME_LIPSYNC_ENDPOINT>
 
 ---
 
-## 九、⑧ 剪辑合成 ✅
+## 十、⑨ 剪辑合成 ✅
+
+```bash
+## 十、⑨ 剪辑合成 ✅
 
 ```bash
 fmode-mv assemble \
@@ -273,7 +307,7 @@ fmode-mv assemble \
 
 ---
 
-## 十、端到端速查
+## 十一、端到端速查
 
 ```bash
 # 全自动(能跑的都跑,跑不了的如实跳过并降级)

+ 55 - 26
references/pipeline-b-talking.md

@@ -2,22 +2,26 @@
 
 > 口播稿 → TTS 配音 → 讲解画面 → 场景 B-roll → 剪辑成片。全程零实拍。
 >
-> 与产线 A **共用同一套底层模块**(`chat` / `image` / `video` / `tts` / `ffmpeg`),
+> 与产线 A **共用同一套底层模块**(`chat` / `image` / **即梦** / `tts` / `ffmpeg`),
 > 只是编排顺序与镜头类型不同。先把 `references/pipeline-a-song-mv.md` 里的
 > 「避坑」通用部分看一遍,本文只讲产线 B 特有的。
+>
+> **v0.2**:画面链路已改用即梦(人物资产 / 场景图 / 图生视频实测可用);
+> 唇形驱动仍无通道,但可用即梦**数字人**替代。
 
 ---
 
 ## 一、产线全景
 
 ```
-① 口播稿        [chat ✅]    → work/script.json + work/script.md
-② TTS 配音      [tts ⚠️]     → work/audio/voiceover.mp3
-③ 讲解分镜      [chat ✅]    → work/storyboard.json
-④ 关键帧        [image ✅]   → work/frames/shot-XX.png
-⑤ 讲解画面/B-roll [video ⚠️] → work/clips/shot-XX.mp4
-⑥ 唇形(可选)    [lipsync ⚠️]
-⑦ 剪辑合成      [本地 ✅]    → out/talk.mp4
+① 口播稿        [chat ✅]     → work/script.json + work/script.md
+② TTS 配音      [tts ❌]      → work/audio/voiceover.mp3(未开通,见第三节替代)
+③ 讲解分镜      [chat ✅]     → work/storyboard.json
+④ 人物资产      [即梦 ✅]      → out/character/{1-定妆照,2-上半身,3-全身,4-多视图}.png
+⑤ 场景图+关键帧  [即梦 ✅]      → work/scene/shot-XX.png(无人)+ work/frames/shot-XX.png(有人)
+⑥ 图生视频      [即梦 ✅]      → work/clips/shot-XX.mp4
+⑦ 对口型(可选)  [即梦数字人 ✅]  → 真人对口型镜头
+⑧ 剪辑合成      [本地 ✅]      → out/talk.mp4
 ```
 
 一条命令跑完:
@@ -146,29 +150,50 @@ fmode-mv keyframe --from work/storyboard.json
 
 ---
 
-## 六、⑤ 讲解画面 / B-roll ⚠️ 通道未开通
+## 六、④ 人物资产 · ⑤ 场景图 + 关键帧 · ⑥ 图生视频(v0.2 新增)
+
+产线 B 与产线 A 共用这三步,命令完全一致:
 
 ```bash
+# ④ 锁定讲者(不换脸的关键)
+fmode-mv character-sheet --desc "35岁东亚男性,短发,身穿深灰针织衫,专业亲和" --limit 4
+
+# ⑤ 场景图(无人)→ 关键帧(有人,多图参考)
+fmode-mv scene --from work/storyboard.json \
+  --character out/character/4-多视图.png
+
+# ⑥ 图生视频(第一镜首尾帧,其余首帧)
 fmode-mv video --from work/storyboard.json
 ```
 
-同产线 A,`auto` 模式会自动降级为 Ken Burns 兜底(`shot-XX.fallback.mp4`)。
+> 产线 B 已有整链支持:`fmode-mv talk` 的第 [4/8]~[6/8] 步就是上面这三步,
+> 可用 `--character` / `--skip-character` / `--char-steps` / `--tier` / `--video-mode` 控制。
 
 **产线 B 的特殊考虑**:
-- 口播视频的 `broll` 镜头用静态运镜**观感损失比 MV 小**——
+- 口播视频的 `broll` 镜头用 **Ken Burns 兜底**(`--video-mode still`)**观感损失比 MV 小**——
   观众注意力在听觉信息上,画面只需「不静止、不跳戏」。
-  这是产线 B 在视频通道未开通时依然能出可用成片的原因。
-- `talking` 镜头如果没有唇形驱动,用 Ken Burns 推近会**放大「嘴不动」的问题**。
-  建议:`talking` 镜头要么做唇形、要么改成**手部动作/物件特写**类画面,别做正脸大特写。
+  预算紧时,B-roll 用兜底、只给 `talking` 镜头花钱走即梦,是性价比最高的组合。
+- `talking` 镜头如果不对口型,用 Ken Burns 推近会**放大「嘴不动」的问题**。
+  建议:`talking` 镜头要么做对口型(见第七节)、要么改成**手部动作/物件特写**,别做正脸大特写。
 
 ---
 
-## 七、⑥ 唇形驱动(可选)⚠️
+## 七、⑦ 对口型(可选)—— 改用即梦数字人 ✅
+
+唇形驱动通道(`/lipsync/generations`)平台**仍无此路由**,但 v0.2 起有了**实测可用的替代**:
 
-同产线 A,平台暂无通道。产线 B 场景下的建议:
+```bash
+fmode-mv jimeng digital-human \
+  --ref out/character/3-全身.png \
+  --audio work/audio/voiceover.mp3 \
+  --prompt "固定机位,手臂自然轻微挥动,神情专注自信,眼神直视镜头"
+```
 
-- 讲解视频**对口型的需求比 MV 强**(观众盯着讲者看)。所以这里更值得自建 Wav2Lip/SadTalker。
-- 若不自建:把讲者镜头压到 1~2 个,且用**中景/中近景**(口型不明显),其余用 B-roll 盖过。
+- 走即梦数字人 v1.5 三步(主体识别 → 视频生成),**¥1/秒**。
+- 这是**真人对口型**,比唇形驱动通道更适合竖屏口播。
+- 产线 B 场景下的建议:
+  - 讲解视频**对口型的需求比 MV 强**(观众盯着讲者看),所以这一步值得花钱。
+  - 预算有限时:把讲者镜头压到 1~2 个,用**中景/中近景**,其余用 B-roll 盖过。
 
 ---
 
@@ -208,19 +233,23 @@ fmode-mv assemble \
 fmode-mv talk "主题" --duration 90 --points "要点1,要点2"
 
 # 分段(推荐)
-fmode-mv talk "主题" --duration 90          # ① 口播稿(只看 work/script.md,Ctrl-C 中断即可)
-vim work/script.md                          # ② 手工润色稿件(强烈建议)
-fmode-mv tts --from work/script.md          # ③ 配音(装 edge-tts 后可用)
+fmode-mv talk "主题" --duration 90            # ① 口播稿(只看 work/script.md,Ctrl-C 中断即可)
+vim work/script.md                            # ② 手工润色稿件(强烈建议)
+fmode-mv tts --from work/script.md            # ③ 配音(装 edge-tts 后可用)
 fmode-mv storyboard --script work/script.md --duration 90 --shots 8
-fmode-mv keyframe --from work/storyboard.json --dry-run
-fmode-mv keyframe --from work/storyboard.json
-fmode-mv video --from work/storyboard.json
+fmode-mv character-sheet --desc "讲者设定" --limit 4          # ④ 人物资产
+fmode-mv scene --from work/storyboard.json --character out/character/4-多视图.png  # ⑤
+fmode-mv video --from work/storyboard.json                    # ⑥
+fmode-mv jimeng digital-human --ref out/character/3-全身.png --audio work/audio/voiceover.mp3  # ⑦(可选)
 fmode-mv assemble --from work/storyboard.json --voice work/audio/voiceover.mp3 --bgm bgm.mp3
 ```
 
+**省钱组合(实测花费)**:④ 完整四步 ≈ ¥1.98 → ⑤ ≈ ¥0.42/镜 → ⑥ ≈ ¥1.41/镜(720p 5 秒)。
+8 镜口播片:④⑤⑥ ≈ **¥16.6**。预算再紧就把 ⑥ 换成 `--video-mode still`(¥0)。
+
 **产线 B 特有的两条经验**:
 
 1. **稿件必须人工润色一遍**。AI 写的口播稿结构没问题,但「像人说的话」这点还差一口气。
    TTS 会把书面语读得格外生硬,改稿的性价比比调任何参数都高。
-2. **B-roll 占比决定成片观感**。在视频/唇形通道未开通的现状下,
-   B-roll 越多、讲者特写越少,成片越稳。
+2. **B-roll 占比决定成片观感**。讲者特写越少、B-roll 越多,成片越稳
+   (对口型失败的风险只在 `talking` 镜头上)。