尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Pixelle-Video 源码解析 #8:分镜规划逻辑:一句话如何拆成多个画面片段?

Pixelle-Video 源码解析 #8:分镜规划逻辑:一句话如何拆成多个画面片段? 前面几篇我们已经分析了 Pixelle-Video 的整体架构、启动流程、配置系统、AI 文案生成以及固定文案模式。这一篇继续往下看一个非常核心的问题一句话输入之后Pixelle-Video 是怎么把它拆成多个画面片段的很多人理解“一句话生成短视频”时容易以为系统是这样工作的输入主题 ↓ 直接生成一个完整 MP4但从 Pixelle-Video 的源码看它并不是这么做的。它真正的流程更像这样输入主题 ↓ 生成多段 narration ↓ 为每段 narration 生成 image_prompt ↓ 把 narration image_prompt 封装成 StoryboardFrame ↓ 逐帧生成音频、图片/视频、画面和视频片段 ↓ 拼接成最终视频也就是说Pixelle-Video 的核心不是“一步生成视频”而是先把内容拆成多个分镜片段再逐帧生产最后合成。这一篇我们重点分析中间这层narration → image_prompt → StoryboardFrame这就是 Pixelle-Video 的分镜规划逻辑。一、什么是分镜规划在传统视频制作里分镜是一个非常重要的概念。一个视频不是一整块内容而是由多个镜头组成的。每个镜头通常有自己的画面、旁白、时长、字幕、动作和转场。Pixelle-Video 里的分镜也是类似的只不过它不是人工画分镜图而是通过 AI 和代码自动生成。在 Pixelle-Video 中一个分镜片段大致包含这些信息第几个片段 这一段旁白说什么 这一段画面应该是什么 这一段语音文件在哪里 这一段图片或视频文件在哪里 这一段合成后的画面在哪里 这一段最终视频片段在哪里 这一段持续多长时间这些信息最终会落到StoryboardFrame这个数据结构里。所以所谓“分镜规划”本质上就是把一段连续文本转换成多个可以独立生成、独立配音、独立合成的视频片段。二、第一层拆分主题变成多段 narrationPixelle-Video 的第一层拆分发生在StandardPipeline.generate_content()。在 generate 模式下用户输入的text被当成主题系统会根据n_scenes、min_narration_words、max_narration_words调用generate_narrations_from_topic()生成多段 narration在 fixed 模式下用户输入的text被当成完整脚本系统会调用split_narration_script()拆成多段 narration。源码里这两个分支都在generate_content()中完成。也就是说Pixelle-Video 的第一步不是直接生成画面而是先生成或整理旁白。generate 模式 主题 → LLM 生成多段 narration fixed 模式 完整脚本 → paragraph / line / sentence 拆成多段 narration这一步非常关键。因为后面的视频片段数量不是由图片模型决定的也不是由 ffmpeg 决定的而是由 narration 数组决定的。假设用户输入主题为什么很多人越努力越焦虑系统可能先生成 5 段 narration1. 很多人越努力越焦虑不是因为不够自律而是目标太混乱。 2. 当你同时想做好太多事大脑会一直处在紧绷状态。 3. 真正有效的方法是先把最重要的一件事找出来。 4. 然后把它拆成今天能完成的小动作而不是盯着遥远的大结果。 5. 当你每天都有一点确定的进展焦虑感就会慢慢下降。到这里视频已经不再是一句话而是变成了 5 个可处理片段。三、fixed 模式下的拆分规则如果是 fixed 模式拆分逻辑来自split_narration_script()。这个函数支持三种拆分方式paragraph、line、sentence。其中paragraph按双换行拆分line按单行拆分sentence按中文或英文句末标点拆分。源码中还会统计拆分后每段的最短、最长和平均字符数。三种方式可以理解成paragraph 适合已经按分镜写好的脚本一段就是一个镜头。 line 适合一行一句的短视频脚本一行就是一个镜头。 sentence 适合普通文章快速转视频一句话就是一个镜头。例如 fixed 脚本是很多人越努力越焦虑不是因为不够自律而是目标太混乱。 当你同时想做好太多事大脑会一直处在紧绷状态。 真正有效的方法是先把最重要的一件事找出来。如果使用paragraph就会得到 3 个 narration。如果使用sentence可能也会得到 3 个 narration。如果每段里有多句话paragraph和sentence的结果就会不同。所以 fixed 模式下分镜数量由用户脚本结构决定。你写几段、几行、几句话就决定了后面有多少个视频片段。四、第二层规划narration 变成 image_prompt有了 narration 之后Pixelle-Video 还不能直接生成画面。因为旁白通常是给人听的不一定适合直接作为图片提示词。例如 narration 是很多人越努力越焦虑不是因为不够自律而是目标太混乱。如果直接拿这句话去生图画面可能很抽象。更适合图片生成模型的 prompt 应该像这样A young office worker sitting at a messy desk late at night, surrounded by sticky notes, calendars, and unfinished tasks, anxious expression, cinematic lighting, realistic style这就是 Pixelle-Video 第二层规划的意义旁白 narration ↓ 视觉描述 image_prompt在源码中这一步发生在StandardPipeline.plan_visuals()。plan_visuals()会先根据frame_template判断模板类型。如果模板类型是image说明需要生成图片如果是video说明需要生成视频如果是static则跳过媒体生成直接把ctx.image_prompts设置成和 narration 数量相同的None列表。也就是说Pixelle-Video 不是任何时候都生成图片提示词。它会先看模板需不需要媒体static 模板 不生成 image_prompt不生成 AI 图片/视频。 image 模板 生成 image_prompt用于后续生成图片。 video 模板 也会生成视觉 prompt用于后续生成视频类媒体。虽然源码里字段名叫image_prompt但从实际流程看它承担的是“这一帧的视觉提示词”角色。五、模板类型会影响分镜规划这一点很容易被忽略。在 Pixelle-Video 中模板不仅影响最终画面样式还会影响是否需要生成视觉素材。项目 README 中也说明了模板命名规范static_*.html表示不需要 AI 生成媒体的静态模板image_*.html表示使用 AI 生成图片作为背景的模板video_*.html表示使用 AI 生成视频作为背景的模板。所以同样一组 narration在不同模板下会走不同流程。1. static 模板narration ↓ TTS ↓ 文字模板 ↓ 视频片段这种模式最快成本最低不依赖图片或视频生成模型。2. image 模板narration ↓ image_prompt ↓ AI 图片 ↓ HTML 模板叠加标题/字幕 ↓ 视频片段这种模式适合知识类、故事类、情绪类短视频。3. video 模板narration ↓ visual prompt ↓ AI 视频素材 ↓ 模板合成 ↓ 视频片段这种模式更有动态感但耗时和成本通常也更高。这说明 Pixelle-Video 的分镜规划不是单纯文本拆分而是会结合模板类型决定后续生成策略。六、generate_image_prompts批量生成视觉提示词真正把 narration 转成 image prompt 的函数是generate_image_prompts()。这个函数位于pixelle_video/utils/content_generators.py。源码中可以看到它接收 narration 列表、最小词数、最大词数、batch size、最大重试次数和进度回调。默认会按batch_size10把 narration 分批处理每批构造 prompt 调用 LLM然后解析 JSON要求返回结果里必须有image_prompts字段。它的大致流程是ctx.narrations ↓ 按 batch_size 拆成多批 ↓ 每批调用 LLM ↓ 解析 JSON ↓ 检查 image_prompts 数量是否等于本批 narration 数量 ↓ 全部合并成 all_prompts源码还做了重试处理。如果某一批返回的 image prompt 数量和 narration 数量不一致会记录 warning并在未达到最大重试次数时重试如果最终仍然不一致就抛出错误。这点非常重要。因为 LLM 生成结构化输出并不总是稳定。比如输入 10 段 narration模型可能只返回 9 个 prompt或者多返回 11 个 prompt。如果不做数量校验后面的zip(ctx.narrations, ctx.image_prompts)就会错位。例如narration[0] 对应 prompt[0] narration[1] 对应 prompt[1] narration[2] 对应 prompt[2]一旦 prompt 少一个后面所有画面都可能对应错旁白。所以 Pixelle-Video 对 image prompt 的数量校验是保证分镜准确性的关键。七、prompt_prefix统一画面风格plan_visuals()里还有一个细节prompt_prefix。源码中生成 base image prompts 之后会读取prompt_prefix再通过build_image_prompt()把前缀和 base prompt 合并成最终 prompt。prompt_prefix可以从参数传入也可以从配置中的comfyui.image.prompt_prefix读取。这个设计很实用。因为 AI 图片生成不只要“画什么”还要“用什么风格画”。例如 base prompt 是A tired office worker sitting at a messy desk late at night如果加上 prompt prefixMinimalist black-and-white matchstick figure style illustration, clean lines, simple sketch style最终 prompt 就会变成Minimalist black-and-white matchstick figure style illustration, clean lines, simple sketch style, A tired office worker sitting at a messy desk late at night这样做有两个好处。第一保持整条视频风格统一。每一帧虽然内容不同但都能套上同一种视觉风格。第二方便做账号风格。比如你想做黑白线稿风格、赛博朋克风格、儿童绘本风格、电影感写实风格只需要调整 prefix而不一定要改每一段 prompt。所以分镜规划不只是“每段画什么”还包括“所有画面用什么统一风格”。八、第三层封装narration 和 image_prompt 变成 StoryboardFrame完成 narration 和 image_prompt 后Pixelle-Video 会进入initialize_storyboard()。这一阶段会创建StoryboardConfig、Storyboard和多个StoryboardFrame。源码中StoryboardConfig保存任务 ID、分镜数量、旁白词数范围、图片提示词词数范围、帧率、TTS 参数、媒体 workflow、模板路径、模板参数等配置。随后initialize_storyboard()会遍历zip(ctx.narrations,ctx.image_prompts)为每一组 narration 和 image_prompt 创建一个StoryboardFrameframeStoryboardFrame(indexi,narrationnarration,image_promptimage_prompt,created_atdatetime.now())源码中正是这样把ctx.narrations和ctx.image_prompts一一配对并追加到ctx.storyboard.frames中。到这一步分镜规划才真正落地。它不再是两个松散数组narrations [...] image_prompts [...]而是变成了结构化对象Storyboard ├── frame 0: narration image_prompt ├── frame 1: narration image_prompt ├── frame 2: narration image_prompt └── frame 3: narration image_prompt这就是 Pixelle-Video 内部的视频蓝图。九、StoryboardFrame 里保存了什么StoryboardFrame是分镜规划的核心数据结构。源码里StoryboardFrame包含index、narration、image_prompt以及后续生成过程中逐步填充的audio_path、media_type、image_path、video_path、composed_image_path、video_segment_path、duration等字段。这说明一个 frame 的生命周期是逐步完善的。刚创建时它只有index narration image_prompt经过后续处理后它会补上audio_path media_type image_path 或 video_path composed_image_path video_segment_path duration所以 StoryboardFrame 可以理解成“一个视频片段的状态容器”。它一开始只是计划。后面逐渐变成实际素材。最后变成一个真正的视频片段。十、Storyboard 是完整视频的蓝图Storyboard则是完整视频的蓝图。源码中Storyboard包含标题、配置、frames 列表、可选内容元数据、最终视频路径、总时长、创建时间和完成时间。它还有is_completed和progress两个属性用来判断所有 frame 是否都生成了video_segment_path并计算整体处理进度。这说明 Pixelle-Video 的视频生成不是无状态流程。它会维护一个完整的 storyboard 对象Storyboard title config frames final_video_path total_duration created_at completed_at这个对象后面可以用于显示生成进度 保存历史记录 排查失败帧 重新生成某一帧 统计视频总时长 查看每个分镜的中间产物这也是 Pixelle-Video 适合做产品化工具的原因。它不是一次性脚本而是有任务、分镜、状态和结果记录。十一、分镜数量到底由谁决定Pixelle-Video 的分镜数量不同模式下来源不同。generate 模式分镜数量由n_scenes决定。n_scenes 5 ↓ 生成 5 段 narration ↓ 生成 5 个 image_prompt ↓ 创建 5 个 StoryboardFramefixed 模式分镜数量由脚本拆分结果决定。脚本按段落拆出 6 段 ↓ 得到 6 段 narration ↓ 生成 6 个 image_prompt ↓ 创建 6 个 StoryboardFramestatic 模板即使不生成 image_prompt也仍然会创建同样数量的 frame。5 段 narration ↓ 5 个 None image_prompt ↓ 5 个 StoryboardFrame源码中 static 模板会把ctx.image_prompts设置成[None] * len(ctx.narrations)这样后续zip(ctx.narrations, ctx.image_prompts)仍然能一一对应。这点设计很巧妙。无论有没有视觉媒体后面的 frame 创建逻辑都可以保持一致。十二、为什么要先分镜再逐帧生成Pixelle-Video 采用“先分镜再生成”的方式有几个明显好处。1. 控制视频结构如果不先分镜系统很难知道视频要分几段、每段讲什么、每段持续多久。有了 narration 列表视频结构就清楚了第 1 段开头钩子 第 2 段提出问题 第 3 段解释原因 第 4 段给出方法 第 5 段总结收尾2. 方便并行处理每个 frame 相对独立。后续produce_assets()可以遍历 frame逐个调用frame_processor。如果使用 RunningHub 工作流且并发配置大于 1还可以使用 semaphore 控制并行处理。3. 方便失败重试如果第 3 帧图片生成失败理论上可以只重试第 3 帧而不需要重做整条视频。4. 方便调试你可以检查narration 是否合理 image_prompt 是否对应旁白 audio_path 是否生成 image_path 是否生成 video_segment_path 是否生成这比直接生成一个黑盒 MP4 更容易排查问题。5. 方便扩展未来可以增加更多分镜字段比如camera_motion transition subtitle_style emotion character_id scene_id visual_continuity这些都可以挂在 frame 层而不是塞进一个大函数里。十三、一个完整示例主题如何变成 5 个画面片段假设用户输入主题为什么很多人越努力越焦虑选择mode generate n_scenes 5 template 1080x1920/image_default.html prompt_prefix cinematic realistic stylePixelle-Video 内部可能会得到ctx.narrations [ 很多人越努力越焦虑不是因为不够自律而是目标太混乱。, 当你同时想做好太多事大脑会一直处在紧绷状态。, 真正有效的方法是先把最重要的一件事找出来。, 然后把它拆成今天能完成的小动作而不是盯着遥远的大结果。, 当你每天都有一点确定的进展焦虑感就会慢慢下降。 ]然后生成视觉提示词ctx.image_prompts [ cinematic realistic style, A tired young office worker sitting at a messy desk late at night, surrounded by unfinished task lists and glowing screens, cinematic realistic style, A person standing in the middle of floating calendars, notes, and deadlines, looking overwhelmed, cinematic realistic style, A clean desk with one important task highlighted under warm morning light, cinematic realistic style, A hand breaking a large goal written on paper into several small sticky notes, cinematic realistic style, A calm person checking off a small daily task, soft sunrise light, peaceful atmosphere ]接着创建 frameStoryboardFrame 0 narration 第 1 段旁白 image_prompt 第 1 个视觉提示词 StoryboardFrame 1 narration 第 2 段旁白 image_prompt 第 2 个视觉提示词 StoryboardFrame 2 narration 第 3 段旁白 image_prompt 第 3 个视觉提示词 StoryboardFrame 3 narration 第 4 段旁白 image_prompt 第 4 个视觉提示词 StoryboardFrame 4 narration 第 5 段旁白 image_prompt 第 5 个视觉提示词后续每个 frame 再进入 TTS、图片生成、模板合成和视频片段生成。这就是“一句话拆成多个画面片段”的真实过程。十四、分镜规划的关键不在“拆”而在“对应关系”很多人会以为分镜规划就是拆句子。其实更关键的是对应关系。Pixelle-Video 要保证第 1 段旁白 → 第 1 个视觉提示词 → 第 1 个画面 → 第 1 段视频 第 2 段旁白 → 第 2 个视觉提示词 → 第 2 个画面 → 第 2 段视频 第 3 段旁白 → 第 3 个视觉提示词 → 第 3 个画面 → 第 3 段视频只要这个对应关系乱了视频就会出现很奇怪的问题旁白讲焦虑画面却是阳光海滩。旁白讲学习画面却是办公室会议。旁白讲方法步骤画面却没有任何动作。所以generate_image_prompts()中对 prompt 数量的校验非常重要。源码明确检查每批返回的image_prompts数量必须等于本批narrations数量不一致就重试或报错。这就是工程化 AI 应用和普通“调一次模型”的区别。普通调用只关心模型有没有返回内容。工程化流程必须关心返回内容能不能继续稳定地进入下一步。十五、当前分镜规划的优点Pixelle-Video 这套分镜规划逻辑有几个优点。第一结构清晰。从narrations到image_prompts再到StoryboardFrame每一步都有明确数据结构。第二兼容 generate 和 fixed 两种内容来源。无论是 AI 写稿还是用户手写脚本最终都会统一成 narration 列表。第三兼容 static、image、video 三类模板。不需要媒体时直接跳过需要媒体时才生成视觉提示词。第四支持风格统一。通过 prompt_prefix可以给所有画面加统一风格描述。第五支持批量和重试。image prompt 按 batch 生成并对数量不一致做重试处理。第六方便后续扩展。StoryboardFrame 可以继续增加镜头运动、转场、角色一致性等字段。十六、当前分镜规划也有局限当然这套逻辑也有一些不足。1. narration 不一定等于最佳镜头一句旁白有时适合一个镜头有时可能需要两个镜头。例如他先关掉手机然后打开书本开始专注学习。这句话其实包含三个动作关掉手机 打开书本 开始学习如果只生成一个画面可能无法完整表达动作变化。2. 镜头之间缺少连续性约束如果每一帧都独立生成图片可能出现角色、场景、服装不一致的问题。第一帧是年轻男生。第二帧变成中年女性。第三帧又变成卡通人物。prompt_prefix 可以统一风格但不一定能统一角色。3. image_prompt 主要关注单帧画面当前标准流程中plan_visuals()调用的是generate_image_prompts()即使模板类型是 video也仍然使用这一套视觉提示词生成逻辑。这对图像模板足够但对于视频模板来说可能还需要更明确的动作描述例如camera slowly zooms in person walks from left to right papers fly across the desk soft handheld motion4. 没有显式镜头语言字段现在StoryboardFrame里有 narration 和 image_prompt但没有单独的shot_type camera_angle camera_motion transition visual_style character location这些信息可以写进 prompt但没有结构化字段。如果未来要做更专业的视频生成这些字段会很有价值。十七、二次开发可以怎么优化如果你想基于 Pixelle-Video 做二次开发分镜规划这一层有很多可优化空间。1. 增加结构化分镜字段可以把 frame 从narration image_prompt扩展成narration visual_prompt shot_type camera_motion main_subject location mood duration_hint transition这样后续生成图片、视频、字幕和转场时更可控。2. 增加角色一致性可以在 storyboard 层增加全局角色设定main_character: age gender clothing hairstyle style然后每个 frame 的 prompt 都自动带上角色描述。3. 增加场景连续性可以让相邻 frame 共享场景信息。比如第 1 到第 3 帧都发生在书桌前第 4 到第 5 帧切换到清晨户外。这样视频会更像一个连续故事而不是随机配图合集。4. 增加镜头节奏控制可以根据 narration 长度控制镜头类型短句快切、特写 长句中景、慢推 总结句稳定画面、留白5. 增加可视化预览在真正生成图片前可以先显示一个分镜表第几帧 旁白 视觉提示词 预计时长 模板类型 是否需要媒体用户可以先修改再生成视频。这会大幅提高可控性。十八、源码阅读建议如果你要读 Pixelle-Video 的分镜规划源码建议按这个顺序1. pixelle_video/pipelines/standard.py 看 generate_content() 如何得到 ctx.narrations 2. pixelle_video/utils/content_generators.py 看 split_narration_script() 和 generate_image_prompts() 3. pixelle_video/pipelines/standard.py 看 plan_visuals() 如何根据模板类型决定是否生成 image_prompt 4. pixelle_video/models/storyboard.py 看 StoryboardConfig、StoryboardFrame、Storyboard 的字段设计 5. pixelle_video/pipelines/standard.py 看 initialize_storyboard() 如何把 narration 和 image_prompt 封装成 frame 6. pixelle_video/services/frame_processor.py 看每个 frame 后续如何生成音频、媒体和视频片段这条路线能把“文本拆分”和“视频片段生成”之间的桥梁看清楚。十九、总结这一篇我们分析了 Pixelle-Video 的分镜规划逻辑。它的核心链路是输入主题或固定脚本 ↓ generate_content() ↓ 得到 narrations ↓ plan_visuals() ↓ 根据模板类型决定是否生成 image_prompts ↓ generate_image_prompts() ↓ 得到一组视觉提示词 ↓ initialize_storyboard() ↓ 创建 StoryboardConfig ↓ 创建 Storyboard ↓ 创建多个 StoryboardFrame从设计上看Pixelle-Video 并不是直接从一句话生成完整视频而是先把内容结构化为多个 frame。每个 frame 都是一个独立的视频生产单元StoryboardFrame narration image_prompt audio_path image_path / video_path composed_image_path video_segment_path duration所以“一句话生成短视频”的真正实现方式是先把一句话扩展或拆分成多段旁白再为每段旁白规划画面最后把每组旁白和画面封装成可逐帧处理的 StoryboardFrame。这就是 Pixelle-Video 分镜规划逻辑的核心。
返回列表