pipeline-b-talking.md 11 KB

产线 B · AI 口播讲解视频完整 SOP

口播稿 → TTS 配音 → 讲解画面 → 场景 B-roll → 剪辑成片。全程零实拍。

与产线 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
④ 人物资产      [即梦 ✅]      → 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

一条命令跑完:

fmode-mv talk "三分钟讲清楚什么是多租户数据隔离" --duration 90

二、① 口播稿

fmode-mv talk "三分钟讲清楚什么是多租户数据隔离" \
  --duration 90 \
  --audience "中小企业技术负责人" \
  --points "痛点,方案,成本对比,落地建议"

产物 work/script.json + work/script.md(可直接改)。

{
  "title": "数据隔离,到底怎么隔离?",
  "durationSec": 90,
  "hook": "你以为你的数据是私有的?其实……",
  "cta": "想搞清楚自己的架构,评论区聊。",
  "hostAnchor": "Asian man in his 30s, short neat black hair, ...",
  "sections": [{ "name": "开场钩子", "text": "..." }],
  "fullText": "完整口播稿(TTS 用这个)"
}

要点:

  • 字数按 3.6 字/秒估算:90 秒 ≈ 324 字。写多了 TTS 会赶,画面也来不及切。
  • hostAnchor 是讲者外貌锚点,作用与产线 A 的 appearanceAnchor 完全一样。
  • 已有稿子直接给文件,跳过自动撰写:

    fmode-mv talk --script my-script.md --duration 120
    

    (会按 --duration 切分镜;稿子是 md/txt 均可,会自动剥掉 markdown 标记)

避坑:

  • 口播稿里的数字要写成能读出来的形式:「30%」读作「百分之三十」, 「API」在中文 TTS 里可能被念成字母,改成「接口」更稳。技能已在提示词里要求,但改稿时注意保持。
  • 稿子改了必须重跑分镜(第 ③ 步),否则字幕和画面对不上。

三、② TTS 配音 ⚠️ 平台暂无通道

fmode-mv tts --probe                                        # 先看有没有得用
fmode-mv tts --from work/script.md --voice zh-CN-YunxiNeural

现状:网关没有 TTS 路由(/v1/audio/speech 返回前端兜底页)。

三条替代路线:

方案 做法 说明
A. 本地 edge-tts(推荐) pip install edge-tts 免费、中文音色多;技能会自动探测并使用,无需改代码
B. 对接外部 OpenAI 兼容服务 export FEME_TTS_ENDPOINT=https://your-host/v1/audio/speech 需自建或采购
C. 自备配音 --voice my-voiceover.mp3 或直接 fmode-mv talk --voice my.mp3 真人配音也行

安装 edge-tts 后,fmode-mv tts --probe 会显示:

状态      可用
提供方    edge-tts(local)

常用中文音色:zh-CN-XiaoxiaoNeural(女,默认)、zh-CN-YunxiNeural(男,年轻)、 zh-CN-YunjianNeural(男,沉稳)、zh-CN-XiaoyiNeural(女,活泼)。

避坑:

  • edge-tts 首次运行需要联网拉音色列表,离线环境会失败。
  • 配音时长是后面所有步骤的基准:分镜时长、字幕时间轴都以配音实际时长为准。 所以先配音、后分镜(本产线的顺序就是这么排的)。

四、③ 讲解分镜

fmode-mv storyboard --script work/script.md --duration 90 --shots 8

(fmode-mv talk 内部会自动调用这一步)

与产线 A 分镜的区别:

产线 A 产线 B
镜头类型 broll / perf broll / talking
新增字段 — narration(对应口播原文)
字幕来源 歌词 subtitle(≤20 字,单行)
节奏依据 音乐节拍 口播语义分段

要点:

  • B-roll 要占多数。讲者镜头(talking)越多,没有唇形驱动时画面越尴尬。 提示词里已要求 talking 镜头的 lipSync 总数 ≤ 3。
  • 每个镜头都要有 narration,这是字幕与画面同步的依据。

避坑:

  • 讲数据/讲概念的段落,让 AI 生成「抽象概念画面」容易翻车。 更好的做法:在 --points 里把可视觉化的东西写清楚(「三个并列的方块表示租户」), 或者事后手工改 work/storyboard.json 里那几镜的 description/imagePrompt 再重生成关键帧。

五、④ 关键帧 ✅

fmode-mv keyframe --from work/storyboard.json --dry-run    # 先看
fmode-mv keyframe --from work/storyboard.json

同产线 A。讲者一致性靠 appearanceAnchor(来自 hostAnchor),逻辑完全一致。

产线 B 的额外建议:

  • 讲者镜头尽量用同一景别与光线(如「中景、正面、柔和侧光」写进 styleKeywords), 这样多镜头剪在一起不会有明显的「换了个空间」的割裂感。
  • 需要「图表感」画面时,prompt 里明确写 clean minimal infographic style, flat design, no text —— 否则 AI 会在图里塞满乱码文字。

六、④ 人物资产 · ⑤ 场景图 + 关键帧 · ⑥ 图生视频(v0.2 新增)

产线 B 与产线 A 共用这三步,命令完全一致:

# ④ 锁定讲者(不换脸的关键)
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

产线 B 已有整链支持:fmode-mv talk 的第 [4/8]~[6/8] 步就是上面这三步, 可用 --character / --skip-character / --char-steps / --tier / --video-mode 控制。

产线 B 的特殊考虑:

  • 口播视频的 broll 镜头用 Ken Burns 兜底(--video-mode still)观感损失比 MV 小—— 观众注意力在听觉信息上,画面只需「不静止、不跳戏」。 预算紧时,B-roll 用兜底、只给 talking 镜头花钱走即梦,是性价比最高的组合。
  • talking 镜头如果不对口型,用 Ken Burns 推近会放大「嘴不动」的问题。 建议:talking 镜头要么做对口型(见第七节)、要么改成手部动作/物件特写,别做正脸大特写。

七、⑦ 对口型(可选)—— 改用即梦数字人 ✅

唇形驱动通道(/lipsync/generations)平台仍无此路由,但 v0.2 起有了实测可用的替代:

fmode-mv jimeng digital-human \
  --ref out/character/3-全身.png \
  --audio work/audio/voiceover.mp3 \
  --prompt "固定机位,手臂自然轻微挥动,神情专注自信,眼神直视镜头"
  • 走即梦数字人 v1.5 三步(主体识别 → 视频生成),¥1/秒。
  • 这是真人对口型,比唇形驱动通道更适合竖屏口播。
  • 产线 B 场景下的建议:
    • 讲解视频对口型的需求比 MV 强(观众盯着讲者看),所以这一步值得花钱。
    • 预算有限时:把讲者镜头压到 1~2 个,用中景/中近景,其余用 B-roll 盖过。

八、⑦ 剪辑合成 ✅

fmode-mv assemble \
  --from work/storyboard.json \
  --voice work/audio/voiceover.mp3 \
  --bgm work/audio/bgm.mp3 \
  --out out/talk.mp4

与产线 A 的差异:

产线 A 产线 B
主音轨 --music(音量 1.0) --voice(音量 1.0)
辅助音轨 — --bgm(自动压到 0.18)
卡点 --beat-sync 用得上 一般不用(口播跟着语义走)

混音规则(lib/ffmpeg.mjs 的 amix): 多轨时按各自 volume 混,背景乐默认 0.18 —— 这个值是「人声清楚、音乐有存在感」的平衡点, 觉得音乐太响/太轻就调 --bgm-volume 0.12 或 0.28。

避坑:

  • 配音轨短于画面时,-shortest 会直接截断成片 → 成片比预期短。 先确认配音时长(fmode-mv tts 会打印时长),再决定分镜时长。
  • 口播字幕建议每屏 ≤ 20 字(提示词已要求),太长会挤满画面下方。

九、端到端速查

# 全自动
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 storyboard --script work/script.md --duration 90 --shots 8
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 越多,成片越稳 (对口型失败的风险只在 talking 镜头上)。