Fix handwritten storyboard entry and generic grid presets; record GPU allocation audit
This commit is contained in:
parent
cb499612f4
commit
1f3f02e136
@ -6068,14 +6068,38 @@ export function LiblibVideoCanvasReplica({
|
||||
}
|
||||
case "参考":
|
||||
case "标记":
|
||||
case "风格":
|
||||
case "自己编写分镜脚本": {
|
||||
case "风格": {
|
||||
setSelectedNodeId(nodeId);
|
||||
setNodeContextMenu(null);
|
||||
setConnectionMenu(null);
|
||||
setCanvasCommand(null);
|
||||
return;
|
||||
}
|
||||
case "自己编写分镜脚本": {
|
||||
const rows = getStoryScriptRows(anchor);
|
||||
setNodes(current => current.map(node => node.id === nodeId ? {
|
||||
...node,
|
||||
title: node.title === "脚本生成器" ? "分镜脚本" : node.title,
|
||||
draftValues: {
|
||||
...node.draftValues, targetPreset: "story-script", viewMode: "table",
|
||||
rows: rows.length ? rows : [{
|
||||
id: makeId("shot"), shot: "01", duration: "5s", scene: "新镜头",
|
||||
sceneDescription: "", shotSize: "中景", lighting: "", dialogue: "",
|
||||
backgroundMusic: "", voiceAndSfx: "", cameraMovement: "",
|
||||
imagePrompt: "", motionPrompt: "", keyframeUrl: "",
|
||||
}],
|
||||
},
|
||||
} : node));
|
||||
setStoryWorkflowNodeId(nodeId);
|
||||
setStoryWorkflowStep("shots");
|
||||
setSelectedNodeId(nodeId);
|
||||
setSelectedEdgeId(null);
|
||||
setNodeContextMenu(null);
|
||||
setConnectionMenu(null);
|
||||
setCanvasCommand(null);
|
||||
setActivePanel(null);
|
||||
return;
|
||||
}
|
||||
case "音频生视频": {
|
||||
anchorUpdates = {
|
||||
kind: "media",
|
||||
|
||||
59
docs/video-canvas-base-audit-2026-09-18.md
Normal file
59
docs/video-canvas-base-audit-2026-09-18.md
Normal file
@ -0,0 +1,59 @@
|
||||
# 视频画布基础功能核对与 P40 资源调整(2026-09-18)
|
||||
|
||||
## 本轮范围与结论
|
||||
|
||||
直接核对 LibTV 现有画布的九宫格菜单、手写剧本工作流、资产准备和编组工具栏,并检查本地实现;没有触发参考站付费生成。应用改动仅在本地验收,未更新主站。本次服务器操作仅降低千问实例数量,未部署人声分离或视频超分模型。
|
||||
|
||||
| 功能 | 参考站 | 本地核对结果 |
|
||||
| --- | --- | --- |
|
||||
| 九宫格菜单 | 多机位九宫格、剧情推演四宫格、角色脸部三视图、角色设定图、场景设定图、产品设定图、25宫格连贯分镜、电影级光影校正、角色三视图、3秒后/5秒前推演,共11项 | 均有配置与生成入口;参考图模型路由及宫格拆分已实现。本轮未重复实际付费生图 |
|
||||
| 宫格默认提示词 | 应随输入素材保持主体与场景 | 发现4项写死绿色服装或森林;已改成素材通用约束,保留2x2/3x3/5x5布局。仅迁移已知旧默认值,保留管理员自定义提示词 |
|
||||
| 自己编写分镜脚本 | 直接打开确认镜头,初始1个空镜头 | 原入口仅选中节点,未打开编辑器;已修复。编辑、新增、自动保存及刷新持久化在本地浏览器通过 |
|
||||
| 分镜编辑 | 确认镜头、准备资产、合成提示词;单元格弹层、行拖动 | 本地已有三阶段、逐格编辑、增删/上移、逐行/全部合成、导出;弹层样式和拖动排序未完全对齐 |
|
||||
| 资产准备 | 角色/场景/道具;AI生成、当前画布、本地上传、个人资产库 | 已有前3种来源,个人资产库入口及逐资产模型/比例参数仍缺;不能标记完全复刻 |
|
||||
| 批量生成条件 | 三阶段完成状态及视频生成门槛 | 本地已统计资产/提示词就绪数,但批量入口尚未完整落实三阶段门槛,空镜头也应补校验 |
|
||||
| 编组 | 组颜色、布局、整组执行、添加到工具箱、转分镜组、解组、批量下载 | 现有 TOOLBOX_TEMPLATE_GROUP 为预设背景框,没有完整成员关系和通用编组操作,尚未完整实现 |
|
||||
| 视频高清 | 视频超分功能 | 已有1080/2K/4K节点参数,但执行函数明确报未接通;没有实际超分服务 |
|
||||
| 人声分离 | 人声/伴奏处理 | 本地已实现HTDemucs实际分离,但当前Python脚本使用主应用所在机器CPU,尚未迁移算力服务器 |
|
||||
|
||||
## 千问与 GPU 调整:已执行
|
||||
|
||||
- 服务器4张Tesla P40,每张驱动报告23040MiB。
|
||||
- 调整前 GPU0、1、3 各运行一个 `qwen38-27b-32k` 实例,单实例 `--parallel 1`;GPU2 被 masked。
|
||||
- GPU2 的既有 Nginx 配置明确记录历史 `NVIDIA Xid 79 / fallen off bus`。虽然当前可枚举、显存5MiB,不能因此宣称可稳定计算。本轮没有解除该卡禁用。
|
||||
- 将 `127.0.0.1:18233` 从 Nginx upstream 移除,`nginx -t` 通过并 reload。
|
||||
- 连续3次确认18233的槽位空闲后,disable并stop `qwen38-27b-32k@3.service`。
|
||||
- GPU3显存从19055MiB降到5MiB,无计算进程,复查利用率0%。GPU0、1仍各19055MiB。
|
||||
- 并发由3路降为2路;模型、量化和单实例32K上下文保持不变。超过两路的请求等待或上游限流风险相应增加,未扩大请求队列。
|
||||
- 18230、18231直接健康检查、18080/18188代理健康检查通过;18084鉴权模型列表返回200。
|
||||
- 两个保留实例同时执行短文本推理,均200且返回2个输出token。
|
||||
- 手动运行CUDA驻留守护检查后,GPU3仍inactive。守护脚本会跳过disabled/masked实例。
|
||||
- 原视频服务所用18231保留;video-render与FRP服务均active。
|
||||
- 配置备份位于服务器 `/root/qwen-gpu-release-20260918-104112/qwen38-27b-local.conf`,备份目录仅root可访问。
|
||||
|
||||
### 回滚
|
||||
|
||||
先启用并启动 `qwen38-27b-32k@3.service`,等待18233健康且确认GPU3模型已驻留,再从备份恢复原Nginx配置,检查语法后reload。不能先恢复路由到尚未就绪的实例。部署媒体模型后回滚应先排空媒体任务并释放GPU3。
|
||||
|
||||
## 算力服务方案与开源检索
|
||||
|
||||
优先把新释放的GPU3作为媒体任务卡,人声分离和视频超分共享有界队列,初期每卡仅一个重任务。GPU2故障卡另行稳定性测试后才考虑加入。主应用仅处理鉴权、任务状态和结果引用;媒体下载、推理、封装及上传在算力服务执行,禁止失败后静默回落主站CPU。
|
||||
|
||||
| 项目 | 依据与用途 | 本机边界 |
|
||||
| --- | --- | --- |
|
||||
| [Demucs](https://github.com/facebookresearch/demucs) | MIT,官方支持GPU;可沿用当前HTDemucs模型与人声/伴奏输出 | 将脚本硬编码CPU改为显式GPU设备,独立依赖环境、异步任务和取消/超时;目前未部署GPU实例 |
|
||||
| [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN) | BSD-3-Clause,官方包含视频推理、分块和FP32选项;优先作为可验证的超分基线 | P40先验证兼容环境和分块推理;逐帧方法可能闪烁,实际速度和质量未测,不能承诺实时4K |
|
||||
| [RealBasicVSR](https://github.com/ckkelvinchan/RealBasicVSR) | Apache-2.0,面向真实视频恢复,具有时序处理 | 旧MMCV/MMEditing依赖需隔离。原示例整段读帧、默认25fps,不可原样上线;应分段并保持源帧率及音轨 |
|
||||
| [FlashVSR](https://github.com/OpenImagingLab/FlashVSR) | Apache-2.0,官方性能展示基于A100等,依赖稀疏注意力实现 | 官方性能不能套用P40,不作为首选部署目标 |
|
||||
| [SeedVR2](https://github.com/ByteDance-Seed/SeedVR) | Apache-2.0,官方高规格GPU视频恢复方案 | 官方H100示例不能用于推断P40吞吐,暂不作为首选 |
|
||||
|
||||
Real-ESRGAN的视频示例存在shell路径调用、FPS表达式求值和帧失败继续执行等行为,不能直接封装为公网API。实现时使用安全argv调用FFmpeg、验证媒体参数、限制时长/像素/磁盘量;输入帧失败应明确失败,成片校验帧率、帧数、时长及音轨,不把普通缩放标成AI超分。
|
||||
|
||||
## 本轮验证
|
||||
|
||||
- 本地浏览器3027:手写入口打开含1个空镜头的工作流;填写柜门画面描述,新增第2镜头;保存后刷新,2个镜头和描述均保留。
|
||||
- 四个相关测试文件:66通过,1项FFmpeg集成测试因当前命令PATH无FFmpeg跳过。本轮没有修改媒体编解码实现。
|
||||
- TypeScript 全量 `tsc --noEmit --incremental false` 通过。
|
||||
- 新增回归覆盖:旧示例提示词迁移、布局约束保留,以及管理员自定义绿色服装/森林提示词不被覆盖。
|
||||
- 参考站临时测试节点已删除,原11个节点保留,恢复到素材混剪分组视图。
|
||||
- 本轮不宣称编组、超分服务、像素级分镜编辑器或GPU人声分离已完成。
|
||||
@ -125,7 +125,7 @@ const defaultFunctions: VideoCanvasFunctionDefinition[] = [
|
||||
route: "canvas-generate-image",
|
||||
enabled: true,
|
||||
prompt:
|
||||
"以选中图片作为角色身份、服装、发型、场景光线、镜头距离和画面质感的唯一参考,生成一张 2x2 剧情推演四宫格合成图。画面中只能有 4 个画面区域,只允许一条竖向分割线和一条横向分割线;严禁出现 3 行 3 列、9 个画面区域或九宫格布局。四格都必须保持参考图的近景/半身近中景人物构图,主体占画面主要面积,不要远景、全景、森林空镜或主体很小的画面。四格是同一角色在同一自然光场景中的连续轻微剧情变化:1 正面安静凝视,2 保留参考图抬手/袖摆动作的延续,3 视线或表情轻微变化,4 情绪收束的近中景反应。保持五官、发型、绿色服装、柔和森林逆光、色调和景深一致;每格角度和动作有轻微差异,但不能像 9 个不同机位分镜。输出单张 16:9 图片,2x2 等分排版,分割线清晰干净,不能出现文字、水印、编号、边框标签或 3x3/5x5 宫格。",
|
||||
"以选中图片作为主体身份、外观、场景光线、镜头距离和画面质感的唯一参考,生成一张 2x2 剧情推演四宫格合成图。只能有 4 个等大画面区域,一条横向和一条竖向分割线,严禁生成 3x3 或 5x5 布局。四格依次呈现初始状态、动作或事件延续、细微变化、结果或反应,形成连贯的短叙事。根据参考图实际主体安排变化,保持原有身份、数量、服装或产品结构、配色、场景、光线和景别一致,不引入无依据的人物、服装颜色或环境。输出单张 16:9 图片,2x2 等分排版,分割线清晰干净,不添加文字、水印、编号或边框标签。",
|
||||
description: "官方剧情推演四宫格:基于参考图生成 2x2 连续剧情分镜合成图。",
|
||||
},
|
||||
{
|
||||
@ -135,7 +135,7 @@ const defaultFunctions: VideoCanvasFunctionDefinition[] = [
|
||||
route: "canvas-generate-image",
|
||||
enabled: true,
|
||||
prompt:
|
||||
"以选中图片作为唯一角色参考,生成一张角色三视图设定图。只输出正面、侧面、背面 3 个完整站姿人物,三人横向并排在同一张 16:9 画面中,白色或浅灰干净背景。必须保持同一角色身份、五官、发型、绿色服装、材质、体型比例和配饰一致;正面、侧面、背面视角要清晰可辨,人物全身完整入画,站姿自然。禁止生成 3x3 九宫格、多机位分镜、黑色分割线、重复头像、文字、水印、编号、环境场景或额外人物。",
|
||||
"以选中图片作为唯一角色参考,生成一张角色三视图设定图。只输出同一角色的正面、侧面、背面 3 个完整站姿视图,横向并排在同一张 16:9 画面中,白色或浅灰干净背景。保持参考图中的身份、五官、发型、服装颜色、材质、体型比例和配饰一致,不擅自添加或改变服装颜色。三个视角清晰可辨,全身完整入画,站姿自然。禁止生成 3x3 九宫格、多机位分镜、黑色分割线、重复头像、文字、水印、编号、环境场景或额外人物。",
|
||||
description: "官方角色三视图预设,使用参考图生图/编辑模型。",
|
||||
},
|
||||
{
|
||||
@ -145,7 +145,7 @@ const defaultFunctions: VideoCanvasFunctionDefinition[] = [
|
||||
route: "canvas-generate-image",
|
||||
enabled: true,
|
||||
prompt:
|
||||
"以选中图片作为角色、服装、发型、场景光线的唯一参考,生成一张 3x3 多机位分镜合成图。必须是 9 个明显不同的镜头画面,不是同一张图裁切或重复人脸。九格分别包含:1 森林环境远景/主体很小,2 全身远景,3 中景正面,4 侧面半身,5 低机位或俯拍,6 面部近景,7 手部/衣袖/动作细节,8 背面或侧背,9 仰视或情绪特写。保持同一角色身份、绿色服装、自然森林光线一致,每格构图、景别、机位和主体大小必须不同。输出为单张 16:9 图片,九格之间使用清晰黑色分割线,不能出现文字、水印、编号,不能白底棚拍。",
|
||||
"以选中图片作为主体、外观、场景和光线的唯一参考,生成一张 3x3 多机位分镜合成图。必须是 9 个明显不同的镜头,不是同一张图裁切或重复。九格分别呈现:1 环境建立远景,2 主体完整全景,3 正面中景,4 侧面中景,5 俯拍,6 主体近景,7 关键局部细节,8 背面或侧背视角,9 低机位或特写。根据实际主体选择合理构图,保持身份、数量、服装或产品结构、配色、材质、场景和光线一致,不凭空加入森林、指定服装颜色或人物。输出单张 16:9 图片,严格 3x3 等分排版,九格之间使用清晰黑色分割线,不添加文字、水印或编号。",
|
||||
description: "官方九宫格工具:先生成带黑色分割线的 3x3 分镜图,再由宫格切分拆成单张镜头。",
|
||||
},
|
||||
{
|
||||
@ -155,7 +155,7 @@ const defaultFunctions: VideoCanvasFunctionDefinition[] = [
|
||||
route: "canvas-generate-image",
|
||||
enabled: true,
|
||||
prompt:
|
||||
"以选中图片作为角色、服装、发型、场景光线和电影质感的唯一参考,生成一张 5x5 连贯分镜合成图。必须是 25 个连续镜头,体现从远景建立场景、人物动作推进、情绪变化、细节特写到结尾反应的完整微型叙事,不是同一张图重复裁切。保持同一角色身份和绿色服装一致,森林自然光线统一;每格景别、机位、主体大小或动作都要有明显差异。输出为单张 16:9 图片,必须严格 5x5 等分排版,25 个宫格的宽高一致、间距一致、边界完整,所有宫格之间使用清晰纯黑分割线,分割线等宽且横线竖线都要贯穿整张图;禁止使用白线、浅色线、柔边、渐变线、不规则拼贴、错位排版、跨格大图、留白边距、文字、水印、编号或额外边框说明。",
|
||||
"以选中图片作为主体、外观、场景光线和画面质感的唯一参考,生成一张 5x5 连贯分镜合成图。必须是 25 个连续镜头,从建立场景、动作或事件推进、状态变化、细节特写到结尾反应形成完整微型叙事,不是同一张图重复裁切。保持参考图中的主体身份、数量、服装或产品结构、配色、材质和场景光线一致,不引入无依据的人物、指定服装颜色或环境。每格景别、机位、主体大小或动作要有合理差异。输出单张 16:9 图片,严格 5x5 等分排版,25 格宽高和间距一致、边界完整。使用清晰纯黑等宽分割线,横线竖线贯穿整张图。禁止白线、浅色线、柔边、渐变线、不规则拼贴、错位排版、跨格大图、留白边距、文字、水印、编号或额外边框说明。",
|
||||
description: "官方 25 宫格连贯分镜:生成 5x5 连续镜头合成图。",
|
||||
},
|
||||
{
|
||||
@ -696,14 +696,20 @@ function isRecord(value: unknown): value is Record<string, unknown> {
|
||||
}
|
||||
|
||||
const legacyFunctionPrompts: Record<string, string[]> = {
|
||||
"multi-view-nine-grid": [
|
||||
"以选中图片作为角色、服装、发型、场景光线的唯一参考,生成一张 3x3 多机位分镜合成图。必须是 9 个明显不同的镜头画面,不是同一张图裁切或重复人脸。九格分别包含:1 森林环境远景/主体很小,2 全身远景,3 中景正面,4 侧面半身,5 低机位或俯拍,6 面部近景,7 手部/衣袖/动作细节,8 背面或侧背,9 仰视或情绪特写。保持同一角色身份、绿色服装、自然森林光线一致,每格构图、景别、机位和主体大小必须不同。输出为单张 16:9 图片,九格之间使用清晰黑色分割线,不能出现文字、水印、编号,不能白底棚拍。",
|
||||
],
|
||||
"story-beat-grid-4": [
|
||||
"以选中图片作为角色身份、服装、发型、场景光线、镜头距离和画面质感的唯一参考,生成一张 2x2 剧情推演四宫格合成图。画面中只能有 4 个画面区域,只允许一条竖向分割线和一条横向分割线;严禁出现 3 行 3 列、9 个画面区域或九宫格布局。四格都必须保持参考图的近景/半身近中景人物构图,主体占画面主要面积,不要远景、全景、森林空镜或主体很小的画面。四格是同一角色在同一自然光场景中的连续轻微剧情变化:1 正面安静凝视,2 保留参考图抬手/袖摆动作的延续,3 视线或表情轻微变化,4 情绪收束的近中景反应。保持五官、发型、绿色服装、柔和森林逆光、色调和景深一致;每格角度和动作有轻微差异,但不能像 9 个不同机位分镜。输出单张 16:9 图片,2x2 等分排版,分割线清晰干净,不能出现文字、水印、编号、边框标签或 3x3/5x5 宫格。",
|
||||
"以选中图片作为角色身份、服装、发型、场景光线、镜头距离和画面质感的唯一参考,生成一张 2x2 剧情推演四宫格合成图。四格都必须保持参考图的近景/半身近中景人物构图,主体占画面主要面积,不要远景、全景、森林空镜或主体很小的画面。四格是同一角色在同一自然光场景中的连续轻微剧情变化:1 正面安静凝视,2 保留参考图抬手/袖摆动作的延续,3 视线或表情轻微变化,4 情绪收束的近中景反应。保持五官、发型、绿色服装、柔和森林逆光、色调和景深一致;每格角度和动作有轻微差异,但不能像 9 个不同机位分镜。输出单张 16:9 图片,2x2 等分排版,分割线清晰干净,不能出现文字、水印、编号、边框标签或 3x3/5x5 宫格。",
|
||||
"以选中图片作为角色、服装、发型、场景光线的唯一参考,生成一张 3x3 多机位分镜合成图。必须是 9 个明显不同的镜头画面,不是同一张图裁切或重复人脸。九格分别包含:1 森林环境远景/主体很小,2 全身远景,3 中景正面,4 侧面半身,5 低机位或俯拍,6 面部近景,7 手部/衣袖/动作细节,8 背面或侧背,9 仰视或情绪特写。保持同一角色身份、绿色服装、自然森林光线一致,每格构图、景别、机位和主体大小必须不同。输出为单张 16:9 图片,九格之间使用清晰黑色分割线,不能出现文字、水印、编号,不能白底棚拍。",
|
||||
],
|
||||
"continuous-storyboard-grid-25": [
|
||||
"以选中图片作为角色、服装、发型、场景光线和电影质感的唯一参考,生成一张 5x5 连贯分镜合成图。必须是 25 个连续镜头,体现从远景建立场景、人物动作推进、情绪变化、细节特写到结尾反应的完整微型叙事,不是同一张图重复裁切。保持同一角色身份和绿色服装一致,森林自然光线统一;每格景别、机位、主体大小或动作都要有明显差异。输出为单张 16:9 图片,必须严格 5x5 等分排版,25 个宫格的宽高一致、间距一致、边界完整,所有宫格之间使用清晰纯黑分割线,分割线等宽且横线竖线都要贯穿整张图;禁止使用白线、浅色线、柔边、渐变线、不规则拼贴、错位排版、跨格大图、留白边距、文字、水印、编号或额外边框说明。",
|
||||
"以选中图片作为角色、服装、发型、场景光线和电影质感的唯一参考,生成一张 5x5 连贯分镜合成图。必须是 25 个连续镜头,体现从远景建立场景、人物动作推进、情绪变化、细节特写到结尾反应的完整微型叙事,不是同一张图重复裁切。保持同一角色身份和绿色服装一致,森林自然光线统一;每格景别、机位、主体大小或动作都要有明显差异。输出为单张 16:9 图片,5x5 等分排版,使用清晰分割线,不能出现文字、水印、编号或多余边框说明。",
|
||||
],
|
||||
"character-three-view": [
|
||||
"以选中图片作为唯一角色参考,生成一张角色三视图设定图。只输出正面、侧面、背面 3 个完整站姿人物,三人横向并排在同一张 16:9 画面中,白色或浅灰干净背景。必须保持同一角色身份、五官、发型、绿色服装、材质、体型比例和配饰一致;正面、侧面、背面视角要清晰可辨,人物全身完整入画,站姿自然。禁止生成 3x3 九宫格、多机位分镜、黑色分割线、重复头像、文字、水印、编号、环境场景或额外人物。",
|
||||
"以输入角色图为唯一角色参考,生成正面、侧面、背面三视图角色设定图。保持五官、发型、服装、颜色和体型一致,干净白底,三视图水平排布,适合后续视频角色一致性使用。",
|
||||
],
|
||||
};
|
||||
|
||||
6
tests/fixtures/video-canvas-grid-legacy-prompts.json
vendored
Normal file
6
tests/fixtures/video-canvas-grid-legacy-prompts.json
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"story-beat-grid-4": "以选中图片作为角色身份、服装、发型、场景光线、镜头距离和画面质感的唯一参考,生成一张 2x2 剧情推演四宫格合成图。画面中只能有 4 个画面区域,只允许一条竖向分割线和一条横向分割线;严禁出现 3 行 3 列、9 个画面区域或九宫格布局。四格都必须保持参考图的近景/半身近中景人物构图,主体占画面主要面积,不要远景、全景、森林空镜或主体很小的画面。四格是同一角色在同一自然光场景中的连续轻微剧情变化:1 正面安静凝视,2 保留参考图抬手/袖摆动作的延续,3 视线或表情轻微变化,4 情绪收束的近中景反应。保持五官、发型、绿色服装、柔和森林逆光、色调和景深一致;每格角度和动作有轻微差异,但不能像 9 个不同机位分镜。输出单张 16:9 图片,2x2 等分排版,分割线清晰干净,不能出现文字、水印、编号、边框标签或 3x3/5x5 宫格。",
|
||||
"character-three-view": "以选中图片作为唯一角色参考,生成一张角色三视图设定图。只输出正面、侧面、背面 3 个完整站姿人物,三人横向并排在同一张 16:9 画面中,白色或浅灰干净背景。必须保持同一角色身份、五官、发型、绿色服装、材质、体型比例和配饰一致;正面、侧面、背面视角要清晰可辨,人物全身完整入画,站姿自然。禁止生成 3x3 九宫格、多机位分镜、黑色分割线、重复头像、文字、水印、编号、环境场景或额外人物。",
|
||||
"multi-view-nine-grid": "以选中图片作为角色、服装、发型、场景光线的唯一参考,生成一张 3x3 多机位分镜合成图。必须是 9 个明显不同的镜头画面,不是同一张图裁切或重复人脸。九格分别包含:1 森林环境远景/主体很小,2 全身远景,3 中景正面,4 侧面半身,5 低机位或俯拍,6 面部近景,7 手部/衣袖/动作细节,8 背面或侧背,9 仰视或情绪特写。保持同一角色身份、绿色服装、自然森林光线一致,每格构图、景别、机位和主体大小必须不同。输出为单张 16:9 图片,九格之间使用清晰黑色分割线,不能出现文字、水印、编号,不能白底棚拍。",
|
||||
"continuous-storyboard-grid-25": "以选中图片作为角色、服装、发型、场景光线和电影质感的唯一参考,生成一张 5x5 连贯分镜合成图。必须是 25 个连续镜头,体现从远景建立场景、人物动作推进、情绪变化、细节特写到结尾反应的完整微型叙事,不是同一张图重复裁切。保持同一角色身份和绿色服装一致,森林自然光线统一;每格景别、机位、主体大小或动作都要有明显差异。输出为单张 16:9 图片,必须严格 5x5 等分排版,25 个宫格的宽高一致、间距一致、边界完整,所有宫格之间使用清晰纯黑分割线,分割线等宽且横线竖线都要贯穿整张图;禁止使用白线、浅色线、柔边、渐变线、不规则拼贴、错位排版、跨格大图、留白边距、文字、水印、编号或额外边框说明。"
|
||||
}
|
||||
@ -2,6 +2,7 @@ import { processVideoFile } from "@/lib/video-canvas/media-processing";
|
||||
import { test, expect } from "@playwright/test";
|
||||
import { promptToolSchema, selectPromptToolModel, promptToolErrorMessage } from "@/lib/video-canvas/prompt-tools";
|
||||
import { toVideoTimeRange, videoProcessSchema } from "@/lib/video-canvas/media-contract";
|
||||
import legacyGridPrompts from "../fixtures/video-canvas-grid-legacy-prompts.json";
|
||||
import { normalizeVideoCanvasFunctionConfig } from "@/lib/video-canvas/config";
|
||||
|
||||
test("prompt tools reject empty and oversized input before calling a model", () => {
|
||||
@ -72,3 +73,20 @@ test('real FFmpeg frames differ by time and slow motion keeps synchronized audio
|
||||
for(const factor of [2,3,5]){const file=join(dir,`slow${factor}.mp4`);await processVideoFile(source,file,'slow',undefined,undefined,{factor});const info=JSON.parse(execFileSync('ffprobe',['-v','error','-show_format','-show_streams','-of','json',file],{encoding:'utf8'}));expect(Math.abs(Number(info.format.duration)-2*factor)).toBeLessThan(0.2);expect(info.streams.some((s:{codec_type:string})=>s.codec_type==='audio')).toBe(true);}
|
||||
}finally{await rm(dir,{recursive:true,force:true});}
|
||||
});
|
||||
|
||||
|
||||
test("grid presets migrate sample-specific defaults while preserving deliberate overrides", () => {
|
||||
const config = normalizeVideoCanvasFunctionConfig({ functions: Object.fromEntries(
|
||||
Object.entries(legacyGridPrompts).map(([key, prompt]) => [key, { prompt }]),
|
||||
) });
|
||||
for (const key of Object.keys(legacyGridPrompts)) {
|
||||
const prompt = config.functions[key].prompt;
|
||||
expect(prompt).not.toMatch(/绿色服装|柔和森林逆光|森林自然光线统一/);
|
||||
expect(prompt).toContain("参考");
|
||||
const custom = "客户指定绿色服装和森林场景,严格保持产品尺寸。";
|
||||
expect(normalizeVideoCanvasFunctionConfig({ functions: { [key]: { prompt: custom } } }).functions[key].prompt).toBe(custom);
|
||||
}
|
||||
expect(config.functions["story-beat-grid-4"].prompt).toContain("2x2");
|
||||
expect(config.functions["multi-view-nine-grid"].prompt).toContain("3x3");
|
||||
expect(config.functions["continuous-storyboard-grid-25"].prompt).toContain("5x5");
|
||||
});
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user