先看结果
肖申克电影剪辑-V2
关注我,免费领取1月“plus”会员
升级前后对比
| MVP版本 | 升级版 | |
|---|---|---|
| 画面 | 全程一张静态封面图 | 每个分镜独立配图,画面随旁白切换 |
| 大模型输出 | 一篇完整口播文案 | 分镜脚本(含旁白、时长、画面描述) |
| 图像生成 | 1次 | N次(每个分镜1次) |
| 视频合成 | 1次图片+音频合成 | N次小段合成 + 1次整体拼接 |
| 字幕 | 不变 | 不变 |
📌 涉及改动的节点
以下节点与MVP版本完全不变,不再重复介绍:
- 第一步:创建工作流、开始节点
- 第六步:中的 compile_image_audio、
audio_to_subtitle和add_subtitles - 第七步:结束节点与测试发布
本次只改三处:
- 第二步:大模型提示词(改为输出分镜JSON)
- 新增循环结构(循环体内:TTS + 图像生成 +
compile_image_audio) - 新增代码节点(收集小视频URL) +
concat_videos拼接
开始(电影名) ↓ 大模型 ↓ ┌─────────────────────────────────────────────┐ │ 循环节点 │ │ ↓ 循环体内: | ├─ 代码节点(提取大模型分镜头) │ │ ├─ TTS(当前分镜 narration → 该段音频) │ │ ├─ 图像生成(当前分镜 visual_prompt → 图片) │ │ └─ compile_image_audio(图片 + 音频 → 小视频) │ └─────────────────────────────────────────────┘ ↓ concat_videos(拼接成完整视频) ↓ audio_to_subtitle(语音自动转字幕) ↓ add_subtitles(叠加字幕) ↓ 结束(输出完整视频URL)改动一:第二步——大模型输出分镜脚本
把原来生成整篇文案的提示词,替换为以下内容。关键是输出一个JSON对象,包含分镜数组。
# 角色设定 你是一个拥有千万粉丝的抖音影视解说博主,风格犀利、口语化、善于埋钩子、制造悬念。同时你也是一名专业的分镜师,能将解说文案拆分为分镜脚本。 # 任务 请根据电影名称,生成一篇影视解说文案,并拆分为3-5个分镜。整体篇幅适合40-60秒口播。 # 输入数据 电影名称:{{movie_name}} # 输出要求 请严格输出一个JSONs数组,不要加任何额外说明,不要使用代码块标记。格式如下: [ { "index": 1, "narration": "第1个分镜的旁白文本", "duration": 10, "visual_prompt": "用于AI生成图片的画面描述,英文,详细描述场景、人物、光影、构图" }, { "index": 2, "narration": "第2个分镜的旁白文本", "duration": 12, "visual_prompt": "..." } ] # 约束规则 - 所有内容必须基于电影真实情节,严禁编造。 - 全程用“你”“我”对话感,像是在跟朋友聊天。 - 禁止出现“大家好”“欢迎收看”等套话。 - visual_prompt必须用英文,适合AI绘画工具理解,描述要具体(场景、人物、光影、构图)。 - duration单位为秒,每个分镜建议8-15秒。 - 分镜数量控制在3-5个。 - 不要重复我的要求,不要重复规则,开头3秒钩子这种话就不要返回了,不要推理内容,我只要结果💡关键:输出的是一个纯JSON。因为每个分镜的旁白就是独立文本,不再需要整段文案。
改动二:搭建循环结构(核心升级)
新增节点1:循环节点
- 🔍操作解读:添加“循环”节点,连接在大模型节点之后。
- 🧩配置循环数据:点击循环节点,在“循环数据”输入框中,通过“添加变量” → “节点引用” → 选择大模型节点输出的 output 字段(即分镜数组)。循环次数留空,自动按数组长度执行。
新增节点2:循环体内提取分镜头详细信息
由于大模型生成输出的是数组,TTS只需要单镜头的旁白,照片生成只需要提示词,所以要用代码解析一下:
- 输入:为单次循环的item,也就是分镜头
- 输出:为四个字段:index、duration 、narration 、visual_prompt
✍️ 代码:
async def main(args): # 当前循环的是 单个对象(item) item_str= args["params"]["input"] #item_str=json.loads(item) # 直接取 title 和 url index = item_str["index"] duration = item_str["duration"] narration = item_str["narration"] visual_prompt = item_str["visual_prompt"] return {"index": index,"duration":duration,"narration":narration,"visual_prompt":visual_prompt}新增节点3:添加TTS节点
- 🔍操作解读:双击循环节点进入内部画布。
- 🧩配置TTS:
input:引用循环当前项的narration字段。- 具体操作:点“添加变量” → “节点引用” → 选择“循环” → 当前项 →
narration。 voice_id、speaking_rate、format等参数与MVP完全一致。
- 📦 TTS输出该分镜旁白的独立音频URL。
新增节点4:循环体内添加图像生成
- 🔍操作解读:和TTS并行,添加“Doubao-图像生成(自接入版)”插件(或与TTS节点并行,节省时间)。
- 🧩配置图像生成:
prompt:引用循环当前项的visual_prompt字段。req_schedule_conf、height、width等与MVP一致。
- 📦 输出图片URL,存放在
data.data.image_urls数组中。后续需要提取第一个URL。
新增节点5:循环体内合成小视频
- 🔍操作解读:在提取图片URL的代码节点后,添加“视频剪辑工具”的
compile_image_audio工具。 - 🧩配置:
image_url:引用上一步代码节点的image_url。audio_url:引用循环体内TTS节点的音频URL。
- 📦 该节点输出这个小分镜的视频URL,可直接引用其
data或video_url字段。
✅ 至此,循环体内一次执行就完成了一个分镜的“配音+出图+合成小视频”。循环执行完毕后,每个分镜都会输出一段小视频。
改动三:收集小视频URL并拼接
新增节点6:拼接视频(concat_videos)
- 🔍操作解读:在代码节点后,添加“视频剪辑工具”的
concat_videos工具。 - 🧩配置:
video_urls:引用代码节点输出的video_urls数组。
- 📦 该节点输出拼接后的完整视频URL。
后续步骤
拼接后的视频进入audio_to_subtitle→add_subtitles→ 结束节点。与MVP完全一致。
🧪 测试要点
试运行输入“《肖申克的救赎》”,观察:
- 大模型是否输出标准JSON(无代码块包裹)
- 循环是否执行了预期次数(可在循环节点上看到迭代次数)
- 每个分镜的小视频URL是否有效(检查循环输出或代码节点输出)
- 拼接后的视频时长是否合理,画面是否随旁白切换
如果循环内TTS或图像生成失败,检查插件是否正常工作;可先在循环外单独测试单个分镜的TTS+出图。
如果拼接后只有第一段有声音,检查
concat_videos是否保留了音频轨(默认会保留),必要时检查每个小视频是否包含音频。
⚠️ 升级版常见踩坑
| 现象 | 原因 | 解决 |
|---|---|---|
| 循环只执行一次 | 循环数据引用错误,未选到scenes数组 | 检查大模型输出的JSON字段名,确认scenes存在且为数组 |
| 图片生成有时为空 | visual_prompt不合理或被拦截 | 简化prompt,确保符合内容政策;可统一加“safe for work” |
| 代码节点收集不到视频URL | compile_image_audio输出字段路径变化 | 打印loop_output查看实际结构,调整代码中的取值路径 |
| TTS调用频繁限流 | 免费额度或并发限制 | 循环节点勾选“串行执行”,避免同时发起多个TTS请求 |
🚀 后续再升级方向
- 精确控制分镜时长:目前每个分镜的音频时长由TTS自动决定,后续可在分镜脚本中指定精确时长,或利用TTS返回的音频实际时长来统一节奏。
- 转场效果:若
concat_videos支持,可配置转场动画。 - 数字人出镜:将静态图替换为蝉镜数字人口播视频。
现在你已经从“有声幻灯片”升级到“多镜头影视解说”。
初版建议用简化音频方案先跑通,确认多画面切换效果后再做精确同步。