| 产品 | 轻剪云 · 短视频内容生产平台 |
| 模块 | 混剪视频(本次为功能重构) |
| 版本 | V1.0(重构版) |
| 文档类型 | 产品需求文档(PRD) |
| 撰写角色 | 负责该模块的产品方案设计、版本拆分与线上验收 |
| 关联文档 | 《老链路兼容与灰度回退》(配套篇,本模块改造的安全边界) |
| 项 | 取值 | 说明 |
|---|---|---|
| 一次生成数量 N | 1~100 | 必填,无默认值 |
| 每组素材 | ≥ 3 段 | 不足禁止生成(红禁) |
| 每组口播 | ≥ 1 条 | 建议 3 条,不足仅黄提示 |
| 成片时长 | T ± 20% | 档位 15 / 30 / 45 / 60s |
平台原有三条出片路径:「经典混剪」(填参数表单直接出片)、「分镜剪辑」(导入脚本 → 手工给每个镜头配素材 → 出片)、「脚本生成」(AI 出镜头组脚本)。三条都能出片,但存在两类根本问题。
一是功能互相矛盾、配置过多。脚本与素材强绑定,一个脚本只能配一套素材、出一版成片;出片配置把大量引擎参数直接暴露给用户(镜头数、单镜秒数、去头去尾、变速倍率、三路音量、亮度对比度饱和度、滤镜枚举、转场枚举、字幕字号等),用户既看不懂,也不该由用户决定。这与"AI 混剪提效"的定位相悖。
二是无法批量。出片是单线程的,一次请求只能出一版;要 N 条成片只能人工重复 N 次操作,且 N 条之间没有差异来源,出来的是同一条片。
本次重构要解决什么:把三条路径合并为唯一流程,让「生成几条 + 每条多长 + 内容 + 素材 + 策略」成为用户唯一需要决定的事,其余全部由系统推导;同时把出片能力从单条升级为批量,并保证批内每条互不相同。
这是一份重构类 PRD,不是从零定义新产品。改造对象是一条已在生产环境出片的核心链路——真正的难点不是新流程好不好用,而是老数据不丢、老行为不漂移、出问题随时能退回。
| 需求项 | 本次范围 | 预期结果 |
|---|---|---|
| 统一入口与流程 | 三条路径合并为唯一「混剪视频」五步流程;旧入口保留但置灰,作为回退开关 | 用户只走一条路;新流程出问题时放开置灰即切回经典链路 |
| 数量与时长前置 | 生成数量 N(1~100,必填无默认)+ 每条目标时长 T(15/30/45/60s,默认 30s) | 镜头拆分、配音、时长全部由 N + T 自动推导,用户不再配镜头数 |
| 脚本与口播池 | 每个镜头组自带 1 条主口播,可对任意一条仿写扩充变体;每组 ≥1 条硬性、建议 ≥3 条 | 文案变体与生成条数解耦,不再为凑批量条数生成废文案 |
| 按镜头组素材槽 | 每组一个素材槽,≥3 段达标、不足禁止生成;支持整池上传后一键自动分配 | 素材按情节段落归属,不跨组挪用;情节拼得成形 |
| 出片配置收敛 | 主流程一行(N|策略|比例);高级配置折叠为 4 项,音色/BGM/字体支持多选成池,改动回存个人偏好 | 用户可见参数从几十个收敛到 4 个,且只作用于整批 |
| 批量生成内核 | 一次请求拆成 N 个渲染任务,逐条随机实例化并固化到任务快照 | N 条成片互不相同,且可复现、可重试 |
| 批次与作品管理 | 新增批次聚合视图与「未分组」收纳;支持单条重试与整批重生成 | 批量产物可管理、可断点、可重来 |
| 老链路兼容与回退 | 老脚本只读映射、老请求等价翻译、数据只加不改、置灰即开关 | 改造期内老链路行为零漂移,随时可回退(详见配套文档) |
| 内容安全兜底 | 口播完整收尾、禁用静止帧硬撑、结尾定格淡出、字幕与配音对齐 | 批量出片不出现"话没说完就切走""画面卡住""声音突然断" |
本次不包含:生成策略的参数数值调优;描述式 AI 生成的文案质量打磨;节奏常量校准;单镜头组级覆盖(V1 只做整批级)。
用户从进入「混剪视频」到拿到成片,共五步,逐步解锁,前一步未完成不显示下一步。
① 定数量与时长 ② 写内容 ③ 放素材 ④ 出片配置 ⑤ 生成 生成数量 N(必填) → 描述式 / 自建式 → 每组一个素材槽 → N|策略|比例 → 达标校验 每条时长 T(默认30) 导入旧脚本 ≥3 段达标 高级配置(折叠4项) 建批次 → 异步渲染 默认组数 B = T÷5 产物 = 完整脚本 整池上传一键分配 改动回存个人偏好 批次进度 → 作品管理
| 步骤 | 角色/系统 | 操作或判断 | 输出/状态 |
|---|---|---|---|
| ① | 用户 | 填 N(1~100)、选 T(15/30/45/60s);系统按 T 实时显示"约 B = T÷5 个镜头组" | 缺 N 不可进入下一步;B 为该次生成的初始预估 |
| ② | 用户 / AI | 描述式:一句话 → AI 出 B 组脚本(每组画面描述 + 1 条主口播);自建式:手动建组;导入旧脚本:只读映射后补齐口播 | 产物 = 完整脚本,随生成请求一起提交,不存中间态 |
| ③ | 用户 / 系统 | 每组放入素材;系统实时校验组内段数 | ≥3 段绿(可生成);0~2 段红禁(拦截) |
| ④ | 用户 | 一行内确认 N、策略、比例;高级配置可展开编辑 | 改动即时回存个人默认偏好;N、T 不回存 |
| ⑤ | 系统 | 契约校验 → 达标校验 → 建批次 → 拆 N 个任务异步渲染 → 进度回写 | 批次状态:进行中 x/y → 成功 / 部分失败;完成后进作品管理批次视图 |
| 场景 | 需求说明 | 结果与提示 |
|---|---|---|
| 新入口 | 新增一级菜单「混剪视频」,无子菜单,即本流程全部内容 | 全平台唯一出片主入口 |
| 旧入口 | 「经典混剪」「分镜剪辑」两项置灰不可进入,代码与路由不删 | 置灰即回退开关:新流程出问题,放开置灰即切回经典链路 |
| 脚本生成入口 | 保留可进,其 AI 生成能力内嵌为本流程步骤二的组件(同源同数据,不重复实现) | 老用户可继续使用,不引导来回切换 |
| 字段 | 控件 | 必填 | 格式/枚举 | 校验与联动 |
|---|---|---|---|---|
| 生成数量 N | 数字输入 | 是 | 整数 1~100,无默认值 | 越界或为空阻止进入下一步;不写入个人偏好。每次生成显式确认,防止误用上次批量数 |
| 每条目标时长 T | 下拉 | 是 | 15 / 30 / 45 / 60(秒),默认 30 | 变更后实时刷新默认组数 B;档位制,不开放自定义秒数 |
| 默认镜头组数 B | 只读提示 | — | B = T ÷ 5(常量每镜净长 5s) | 用户在步骤二增删组后,以实际组数为准并明示差额。T=15→3 组;30→6;45→9;60→12 |
B 只是初始预估。描述式由 AI 实际返回组数为准,页面明示"预估 6 组,实际返回 4 组",用户可增删组对齐;成片实际时长以口播与素材推导为准,落在 T ±20% 内即达标,先不锁死秒数。
脚本在本页内完成,不跳转到独立脚本页。产物 = B 个镜头组,每组含名称、画面描述、口播池、素材池。
| 场景 | 触发条件 | 需求说明 | 结果与提示 |
|---|---|---|---|
| 描述式生成 | 用户输入一句话 | 调 AI 生成 B 组脚本,每组自带画面描述 + 1 条主口播;结果可改组名/描述、可增删组 | 以实际组数为准,与预估不符时明示差额 |
| 自建式 | 用户手动新建 | 手动建组、命名、写画面描述;口播至少手填 1 条 | 与描述式产物结构完全一致 |
| 导入旧脚本 | 用户选择历史脚本 | 走只读映射:一个段落 → 一个镜头组;已有台词进入该组口播池第 1 条;无法归类到新结构的字段原样保留 | 映射只产生新脚本记录,绝不修改老数据 |
| 口播仿写扩充 | 用户对池内任意一条点「仿写」 | 输入想生成的变体条数(1~50,默认 3),追加进本组口播池末尾;可继续对任一条再仿写 | 追加即时生效,达标校验同步刷新;失败重试幂等,不重复追加 |
| 项 | 规则 |
|---|---|
| 硬性门槛 | 每组 ≥1 条,为 0 时禁止生成(契约层拦截) |
| 建议线 | 每组 ≥3 条,不足只给黄提示,不阻断 |
| 与 N 的关系 | 完全解耦。一个镜头组在成片里就是一段情节、只讲 1 条口播;口播池是该情节的多条文案变体,不是为 N 凑数 |
| 批量差异来源 | N 条成片在 B 个组各随机抽 1 条,组合空间 = 各组池条数之积(例:每组 3 条 × 6 组 = 729 种) |
| 池小复用 | 每组只有 1 条时该组口播必然复用,属用户刻意选择,黄提示不阻断 |
认知前提:镜头组 = 成片中的一段情节段落,由组内多段素材的画面拼接表达(例:甜品组 = 切水果 → 搅拌 → 入模)。素材段数下限是镜头组的固有属性,不随生成条数 N 变化。
| 场景 | 触发条件 | 需求说明 | 结果与提示 |
|---|---|---|---|
| 组素材槽 | 进入步骤三 | 每组一个槽,显示组名、画面描述、已放入素材(缩略图 + 时长)与状态条 | 状态由服务端达标校验统一返回,前端不自拼文案 |
| 逐库选择加入 | 用户从素材库选 | 支持单选/多选加入,可从槽内移除,可在组之间拖拽移动 | 未点确认不写入脚本,无脏数据 |
| 整池上传 | 用户批量上传 | 先进「待分配池」,不归属任何组 | 池内素材可预览 |
| 一键自动分配 | 用户点击 | 后端按每组画面描述/组名与素材标题做弱匹配打分,总量按组数均分、先保每组 ≥3,无匹配随机补位 | 返回建议分配清单 + 依据说明(如"按'搅拌'匹配到 3 段"),不直接落库 |
| 确认与手调 | 用户确认或拖拽调整后 | 写入各组素材池,重新跑达标校验,逐组刷新状态 | 确认前的一切调整不落库 |
| 状态 | 条件 | 用户看到的提示 |
|---|---|---|
| 红禁(不能生成) | 组内 0 段 | "镜头组 3 还没有素材,至少传 3 段(0/3)才能生成" |
| 红禁(不能生成) | 组内 1~2 段 | "镜头组 2 素材只有 1 段(1/3),再补 2 段才能生成" |
| 绿(达标) | 组内 ≥3 段 | 可生成;段数越多,画面挑得越好,无上限提示 |
[原型占位] 步骤三 · 按镜头组放素材 ────────────────────────────────────────────────────── 镜头组 1 · 备料 已放 1 段 状态:红禁 提示:镜头组 1 素材只有 1 段(1/3),再补 2 段才能生成 镜头组 2 · 制作 已放 4 段 状态:达标 提示:可生成,段数越多画面挑得越好 待分配池 整池上传的中转区,未归属任何组 操作:一键自动分配 → 返回建议清单 + 依据说明,确认后才落库
计段口径:1 段素材计 1 段,不按时长折算。长素材也只算 1 段。
主流程一行常驻:生成数量 N(可回看微调)| 生成策略 ▾ | 比例 ▾
比例放在主流程而不进高级配置——它决定"剪给哪个平台用",是每单都该看见的目标项。
| 配置项 | 控件 | 默认值 | 规则 |
|---|---|---|---|
| 配音音色 | 多选(成池) | 随策略 | 勾选 ≥1 项即成池;不展开/不勾 = 用策略默认单值 |
| BGM 风格 | 多选(成池) | 随策略 | 同上 |
| 字幕字体 | 多选(成池) | 随策略 | 同上 |
| 素材原音 | 开关(开/关) | 随策略 | 布尔,非池 |
覆盖优先级:用户高级配置 > 策略字段 > 系统默认。用户不填即完全按策略。
不开放项(引擎与策略内部,防矛盾):镜头数、单镜头秒数、字幕逐条时间轴、去头去尾、变速倍率、三路音量细调、亮度/对比度/饱和度、滤镜枚举、转场枚举、字幕字号。全部由脚本内容或策略推导。
个人默认偏好回存:音色池 / BGM 池 / 字体池 / 素材原音开关 + 主流程的比例与上次使用的策略,改动即时回存(防抖写),下次进入自动带出,提供「恢复默认」一键清空。N 与 T 不回存。
策略可用性(V1):唯一可用策略为「标准解说」。下拉同时展示「快闪卡点」但置灰标注"打磨中",点击给提示,不产生该策略的生成请求。
契约校验(结构非法直接拒,不建批次) → 达标校验(素材红禁拒;口播黄提示与成本提醒随响应带回,不阻断) → 建批次 → 拆 N 个渲染任务 → 异步渲染 → 进度回写
| 校验 | 判定 | 处理 |
|---|---|---|
| 契约校验 | 脚本结构、N 范围、T 枚举、策略枚举、每组口播 ≥1 | 不通过直接拒绝并返回明确错误,不落任何数据 |
| 素材达标 | 每组素材 ≥3 段 | 不通过拦截,逐组列出原因 |
| 口播达标 | 每组 ≥3 条为建议线 | 不足仅提示,不阻断 |
| 成本提醒 | 镜头组数 × N 超过阈值(V1 取 600 条配音与渲染任务,阈值按线上实测确定) | 提示"预计耗时长、进队列排队",不阻断 |
一次请求拆成 N 个渲染任务,每个任务独立随机,跨批次与同批次内都如此。差异来自四个互不冲突的维度:
| 规则 | 处理 |
|---|---|
| 镜长推导(标准解说) | 该组口播语音合成试算时长 + 0.3s 余量,下限 2s |
| 素材不够长时 | 先降速,变速下限 0.5x;仍不足则缩短该镜并在任务详情注明("素材不足,该镜取实际 x.xx s");禁止用静止帧硬撑,禁止无限拉长单段 |
| 口播完整性 | 任何兜底下,台词必须说完才允许切走或收尾;字幕时间点与配音对齐,容差 ±0.3s |
| 结尾 | 末镜口播说完后定格 1s,背景乐淡出收束,不硬切截断 |
| 时长达标 | 预估按每镜净长 5s,实际以推导为准,成片落在 T ±20% 即达标;预估与实际在任务详情可见 |
| 场景 | 处理 |
|---|---|
| 单条任务失败 | 标记失败原因,不产出残片,不把残片计为成功作品 |
| 批次中断 | 进行中的任务落到终态,排队中的任务标记中断 |
| 批次整体 | 含失败任务时批次状态为「部分失败」,失败原因汇总在批次上可读 |
| 单条重试 | 复用该失败任务的原随机种子与抽定值做确定性重渲染;瞬时型失败可复原成功,确定性根因(如素材缺失)仍在时如实再败并标因 |
| 整批重生成 | 复用批次快照(脚本/素材/策略/配置不变)+新随机种子建新批次,旧批次保留可查 |
| 场景 | 需求说明 |
|---|---|
| 默认主界面 | 批次卡片列表,按创建时间倒序;一个批次 = 一张卡片,显示创建时间、成片缩略图排布、整体状态(生成中 x/y/成功/部分失败)、失败原因摘要 |
| 展开 | 展开为该批 N 个成片列表,每片可播放 / 下载 / 删除;失败单条标红给原因并提供重试入口 |
| 未分组 | 历史老作品(无批次归属)收纳于「未分组」,播放 / 下载 / 删除 / 详情行为与改造前完全一致,不写老数据,防老用户困惑 |
| 成片详情 | 保留现有详情能力,新增「所属批次」入口可跳回卡片 |
| 删除边界 | 删除只作用于单条成片,不整批级联删;未分组老作品永不被批次操作触碰 |
输入 = 生成数量 N(1~100 必填)+ 每条目标时长 T(15/30/45/60s)
▼
脚本 Script
└─ 镜头组 Block × B { 名称, 画面描述,
口播池 voiceovers(≥1 硬性、建议 ≥3),
素材池 materials(≥3 段硬性、上限不限)}
生成请求 Req = 脚本 + 策略 id + N + T + overrides{ 音色池 / BGM 池 / 字体池 / 素材原音 }
▼
生成批次 Batch { id, 用户, 快照(脚本/策略/N/T/配置), 状态, 进度, 创建时间, 失败汇总 }
└─ 渲染任务 Task × N { 序号, 实例快照(抽定的音色/BGM/字体 + 每组口播索引 + 抽段方案),
状态, 错误原因, 产出作品, 起止时间 }
▼
成片 Work { …, 批次 id }
存储改动原则:只加不改。新增三张表(批次表、任务表、个人默认偏好表);现有作品表新增一列「批次 id」(可空 + 索引),历史记录保持空 = 未分组;迁移脚本幂等执行,老数据零改动;批次 id 仅由批量渲染产物回填,脚本类/草稿类记录不挂。个人偏好表的存盘字段名与生成请求中的配置字段完全对齐,避免两套命名。
| 状态 | 进入条件 | 退出条件 | 允许操作 |
|---|---|---|---|
| 排队中 | 批次创建,任务未开始 | 首个任务开始渲染 | 查看 |
| 进行中 x/y | 有任务在渲染 | 全部任务落终态 | 查看进度、取消 |
| 成功 | N 个任务全部成功 | — | 展开、播放/下载/删除、整批重生成 |
| 部分失败 | 至少一个任务失败 | 失败任务重试成功且其余成功 | 展开、单条重试、整批重生成 |
| 失败 | 全部任务失败 | — | 整批重生成 |
排队中 → 渲染中 → 成功 / 失败 / 中断。中断指批次执行被停止时仍在排队中的任务,按中断标记,不计入失败原因汇总。
| 异常场景 | 系统处理 | 用户看到 |
|---|---|---|
| 未填生成数量 N | 阻止进入下一步 | "请先填写生成数量(1~100)" |
| 某组素材不足 3 段 | 拦截生成,逐组列出 | "镜头组 2 素材只有 1 段(1/3),再补 2 段才能生成" |
| 某组无口播 | 契约层拦截 | "镜头组 3 还没有口播,至少写 1 条才能生成" |
| 描述式 AI 生成失败 | 保留已填内容,提供重试 | 可读错误文案 + 重试入口,不丢失脚本 |
| 一键分配无匹配素材 | 随机补位并说明 | 依据说明中标注哪些为随机补位 |
| 重复绑定同一素材到两组 | 后端拦截 | 提示该素材已在其他组,请另传 |
| 单条渲染失败 | 标因不产残片,批次转部分失败 | 卡片显示失败原因摘要,单条可重试 |
| 整批渲染中断 | 排队任务标中断,进行中任务落终态 | 卡片显示"已中断",可整批重生成 |
| 页面刷新或接口失败 | 页内脚本状态保留至确认提交 | 已填内容不丢,或给出明确提示 |
| 任意接口失败 | 可读文案 + 可重试 | 不丢已填内容,脚本保留在页内直至确认提交 |
本模块改造的安全边界单独成篇(配套文档《老链路兼容与灰度回退》),此处只列四条必须遵守的规则:
改造过程中有若干条规则被自己推翻。下表保留推翻原因,便于后续追溯——一条从没被质疑过的规则,通常只是还没遇到真实数据。
| 议题 | 当前结论 | 曾经的方案 | 推翻/保留原因 |
|---|---|---|---|
| 素材达标线 | 固定硬门槛:每组 ≥3 段,与生成条数 N 无关;不足禁止生成,不降级硬撑 | 按"画面单元口径"与 N 联动(组池容量 ≥ N 才达标、段数预估按 N 折算) | 镜头组是情节段落,段数下限是组的固有属性;与 N 联动会让用户为了多出几条片而被迫上传大量素材,且长素材被折算成多段,口径说不清 |
| 口播池规模 | 每组 ≥1 条硬性、建议 ≥3 条;想要更多由用户主动仿写追加 | 规定"每组口播池目标 = N 条,缺口自动补齐" | 一个镜头组只讲 1 条口播,池是文案变体不是凑数;按 N 补齐会产生大量废文案,且用户改一次 N,已生成的口播全部作废 |
| 批量差异来源 | 口播 / 素材编排 / 音色 / BGM / 字体各自随机,池小复用属正常 | 希望通过"素材段数 ≥ N"保证每条画面不重复 | 与素材达标线同一次推翻——取段区间、顺序、变速与文案变体的组合空间已足够,不必靠堆素材 |
| 高级配置范围 | 音色 / BGM 风格 / 字幕字体(前 3 项多选成池)+ 素材原音开关,改动回存个人偏好 | 暴露几十个引擎参数 | 这些参数要么由内容推导(镜头数、镜长),要么属策略内部(变速、滤镜、转场、音量),交给用户只会制造矛盾配置 |
| 覆盖粒度 | 只支持整条 / 整批级覆盖 | 考虑单镜头组级覆盖 | V1 不做的理由:属高阶个性化,等有真实需求再以"逐组覆盖"扩展 |
| 历史作品去向 | 收纳于「未分组」,行为与现状完全一致;作品管理默认主页为批次卡片 | 草案"全部作品为默认视图" | 批量场景下按批次管理才是主诉求,且老作品混入会引起老用户困惑 |
| 单条重试语义 | 复用原随机种子与抽定值做确定性重渲染 | 允许"重试 = 重抽换种子" | 语义会漂移成"生成新的一条",破坏同批次的一致性 |
| 比例的位置 | 主流程一行常驻:N|策略|比例,比例默认 9:16 | — | 比例决定"剪给哪个平台用",是每单都该看见的目标项,不是高级玩家的调参项 |
| 描述式组数 | B = T÷5 为初始预估,以 AI 实际返回组数为准并明示差额,用户可增删组对齐 | — | AI 的时长→组数映射与"每镜 5s"基准在长档位存在固有偏差;与其强行对齐数值,不如把差额如实告诉用户并给编辑能力 |