Back to skills
extension
Category: Content & MediaNo API key required

video-create-evaluation-skills

按 CineBench v2 框架评估 AI 生成视频与电影指令的对齐度。六角色 23 维打分(导演/美术指导/摄影师/演员指导/剪辑师/声音设计师),主观维度由多模态 LLM 判断,客观维度用纯算法规则公式(OpenCV/numpy,无外部模型权重)。当用户需要评测视频生成模型结果、给生成视频按专业电影语言打分、或生成视频质量报告时使用。

CineEval:电影视频六角色评估

对一段「电影指令(七模块 Prompt)+ 生成视频」,模拟电影工业六个专业角色做 23 个维度打分,输出双视角报告(六角色报告 + 三层电影语言报告)。

本 skill 不依赖任何外部模型权重。 原 CineBench v2 中由 CLIP/TransNetV2/DPFlow/DeepFace 等模型支撑的维度,全部降级为两种路径之一:

  • LLM 判断:多模态大模型直接看抽帧图(+ 音频,若模型支持)打分;
  • 规则公式:OpenCV/numpy 纯算法计算客观数据(scripts/ 提供通用实现)。

输入

| 输入 | 说明 | |------|------| | script | 七模块指令:①场景设定 ②角色描述 ③叙事指令 ④摄影指定 ⑤剪辑指令 ⑥声音指令 ⑦情绪风格 | | video | 生成视频文件路径(常见 mp4) |

总工作流程

0. 环境自检 → python scripts/check_env.py(缺核心依赖先装;缺 ffmpeg 则 S1~S4 标 N/A)
1. 预处理   → scripts/ 抽帧 + 镜头检测 + 视觉/音频客观数据(JSON)
2. Gate Check → 技术准入门槛,不过线直接判不合格,不进入六角色评分
3. 六角色评估 → 每角色逐维度:build_prompt.py 生成该维度具体 Prompt(指令摘录+规则数据+材料清单已嵌入)→ LLM 打分(1-5)
4. 聚合     → scripts/aggregate_scores.py 算角色均分 / 综合得分 / 三层归类
5. 报告     → 六角色报告 + 三层归类报告(aggregate_scores.py --md 生成骨架)

抽帧约定:默认每秒 1 帧、上限约 30 帧;视频 ≤30 秒整体评估,>30 秒按镜头分段评估再汇总(shot_detect / visual_analysis 均输出逐镜头数据,直接支撑分段)。镜头关键帧取每镜头中间帧(>10 秒的长镜头加取 1/3、2/3 处),用 extract_frames.py --shots shots.json 抽取。

指令模块切分:若 script 未按 ①~⑦ 标注分节,先按【场景设定】【角色描述】【叙事指令】【摄影指定】【剪辑指令】【声音指令】【情绪风格】七个小标题切分;缺某个模块时,依赖该模块的维度按「指令未指定」从严打分并在理由中注明。

依赖:opencv-python + numpy(必装,pip install opencv-python numpy);ffmpeg(仅音频维度需要,命令行调用)。

Gate Check(准入门槛)

先由 LLM 看抽帧逐项检查,任一不过 → 整体判不合格,终止评估:

  • 基本可辨识性:人物、场景、主要动作可辨认
  • 物理合理性:无严重失真、物体无故悬浮、液体反重力
  • 时间连续性:无突兀闪烁、画面断裂、帧间跳变
  • 最低视觉质量:无大面积模糊、严重变形、色块伪影
  • 最低声音质量(如有声):无明显爆音、断续,对白可听清
  • 声画基本同步(如有声):主要声画事件无明显延迟(>200ms)

23 维总表与评分路径

路径含义:纯LLM = 大模型看帧直接打分;混合 = 规则出客观数据,最终分 = 规则分×0.4 + LLM分×0.6;规则为主 = 规则产出基础分/客观事实,LLM 仅核验微调(±1)。

| 角色 | 维度 | 评估内容 | 路径 | 规则数据来源 | 输入材料 | |------|------|---------|------|------------|---------| | 导演 | A1 叙事完整性 | 是否传递清晰叙事事件,与③对齐 | 纯LLM | — | 全片均匀帧 + ③⑦ | | 导演 | A2 场景逻辑一致性 | 物品、空间关系前后是否一致 | 纯LLM | — | 全片均匀帧 + ①③ | | 导演 | A3 情绪节奏弧 | 情绪起伏曲线与⑤⑦是否一致 | 纯LLM | — | 全片均匀帧 + ⑤⑦ | | 美术 | PD1 场景与道具设计 | 空间布局、道具丰富度、类型感 | 纯LLM | — | 均匀帧 + ① | | 美术 | PD2 色彩方案 | 配色是否服务于指定情绪 | 混合 | 调色板/主色调/色温 | 均匀帧 + ①⑦ | | 美术 | PD3 风格自洽 | 视觉元素是否同一风格体系 | 纯LLM | — | 均匀帧 + ①⑦ | | 美术 | PD4 场景跨镜头一致 | 场景/道具细节跨镜头一致性 | 规则为主 | 镜头间 HSV 直方图相关性 | 各镜头关键帧并排 + ① | | 摄影 | B1 运镜轨迹 | 推拉摇移的方向/速度与④一致 | 混合 | 稠密光流方向/速度/类型 | 逐镜头连续帧 + ④ | | 摄影 | B2 焦点与景深 | 焦点位置、虚实关系与④一致 | 混合 | 清晰度网格图 | 均匀帧 + ④ | | 摄影 | B3 构图质量 | 构图是否符合电影级审美 | 纯LLM | (可选)三分法/对称性指标 | 均匀帧 + ④ | | 摄影 | B4 光影氛围 | 光线方向、质感、色温、明暗 | 混合 | 亮度/色温/对比度/光源方向 | 均匀帧 + ④⑦ | | 演员 | C1 行为自然度 | 动作流畅、无机械感、合物理 | 纯LLM | — | 均匀帧 + ②③ | | 演员 | C2 情绪表达 | 表情/肢体是否传递指定情绪 | 纯LLM | — | 均匀帧(含人物近景时刻)+ ②⑦ | | 演员 | C3 空间互动 | 角色距离/朝向/互动合理性 | 纯LLM | — | 均匀帧 + ②③ | | 演员 | C4 演员跨镜头一致 | 外观/服装/状态跨镜头一致 | 纯LLM | — | 各镜头关键帧并排 + ② | | 剪辑 | D1 转场方式 | 硬切/叠化/淡入淡出与⑤一致 | 规则为主 | 转场点检测+类型分类 | 转场点前后窗口帧 + ⑤ | | 剪辑 | D2 切换节奏 | 切换频率、时长分布与⑤一致 | 规则为主 | 节奏统计+模式分类 | F3 统计为主,帧可省 + ⑤ | | 剪辑 | D3 轴线规则 | 转场后视线/空间方向一致性 | 纯LLM | — | 相邻镜头关键帧对 + ①⑤ | | 剪辑 | D4 镜头数量 | 实际镜头数与⑤指定一致 | 规则为主 | 镜头计数(纯规则打分) | 无需帧,纯规则 + ⑤ | | 声音 | S1 对白质量 | 对白清晰度、口型、语气匹配 | 纯LLM* | — | 音频 + 人物画面帧 + ⑥ | | 声音 | S2 声音设计 | 环境音/音效/层次与⑥一致 | 纯LLM* | (可选)音量/静音比 | 音频 + ⑥ | | 声音 | S3 声画同步 | 声音事件与视觉事件时间对齐 | 纯LLM* | — | 音频 + 均匀帧 + ⑥ | | 声音 | S4 音乐情绪 | 配乐风格与情绪匹配 | 纯LLM* | — | 音频 + ⑥⑦ |

* 声音维度要求评估模型具备音频理解能力;若所用 LLM 不支持音频,S1~S4 全部标记 N/A 并在报告中注明,综合得分按其余角色均分计算。

规则公式

以下公式由 scripts/ 中的脚本实现;超出脚本覆盖范围的计算,由执行 agent 按本节的公式现场编写。

F1 镜头边界检测(替代 TransNetV2)

对相邻两帧算 H-S 二维直方图相关性:

hist = cv2.calcHist([hsv], [0, 1], None, [50, 60], [0, 180, 0, 256])
cv2.normalize(hist, hist)
corr = cv2.compareHist(hist_prev, hist_curr, cv2.HISTCMP_CORREL)
# corr < 0.5 → 镜头边界

也可用 ffmpeg -vf "select='gt(scene,0.4)',showinfo" 或 PySceneDetect(直方图法,无权重)替代。输出镜头列表 [(start_frame, end_frame), ...]

F2 转场类型分类(D1)

在边界点前后窗口内分析帧间差异模式:

  • 硬切:帧间差异在单帧内突刺(corr 从 >0.8 骤降到 <0.5)
  • 叠化:帧间差异呈渐变模式,持续 10~30 帧(连续 N 帧差异近似线性递减)
  • 淡入淡出:亮度线性下降至近黑(淡出)或从近黑线性上升(淡入)
  • 匹配剪辑/跳切:规则不可判,交 LLM 看前后镜头代表帧判断

F3 切换节奏统计(D2)

由镜头列表计算:镜头数、平均时长、时长标准差、最短/最长时长。模式分类:

  • 平均时长 < 2s 且标准差小 → 快切
  • 平均时长 2~6s → 常规节奏
  • 仅 1~2 个镜头且单镜头 > 15s → 长镜头
  • 标准差大 → 变速节奏

F4 镜头数量核验(D4,纯规则打分)

镜头数 = 边界点数 + 1。与指令指定数的差值映射得分:差 0→5;差 1→4;差 2→3;差 3~4→2;差 ≥5→1。

shot_detect.py --expect-shots N 会在输出 JSON 中直接给出 d4_shot_count.score,该维度无需 LLM。

F5 亮度 / 色温 / 对比度(B4、PD2)

mean_brightness = np.mean(v_channel) / 255.0      # HSV 的 V 通道
r_b_ratio = np.mean(r) / (np.mean(b) + 1e-6)      # 色温:>1.3 暖,<0.8 冷,否则中性
global_contrast = (gray.max() - gray.min()) / 255.0
local_contrast  = np.std(gray) / 255.0
# 明暗比 = 最亮20%像素均值 / 最暗20%像素均值
  • 调性:mean_brightness > 0.6 高调,< 0.4 低调,之间中间调
  • 光质:明暗比 > 5 硬光,< 3 柔光
  • 光源方向:3×3 网格各区域平均亮度,最亮区域即光源大致方向

F6 调色板与主色调(PD2)

每秒抽 1 帧,采样像素做 K-means(cv2.kmeans,k=5),各色簇占比即调色板权重;主色调 = HSV 的 H 通道直方图(180 bin)argmax。

F7 镜头间色彩连续性(PD4)

取相邻两镜头各自的中间帧,按 F1 的 H-S 直方图算相关性:

  • corr > 0.8 → 色调连续
  • 0.5 ~ 0.8 → 有差异但可接受
  • corr < 0.5 → 不一致(结合曝光差 abs(mean_a - mean_b)/255 > 0.1 佐证)

基础分:无不一致→5;1~2 处轻微不一致→4;多处不一致→3;频繁无理由跳变→2;完全无法识别场景→1。LLM 核验不一致处是否属于合理叙事切换(闪回/换场/时间跳跃),不合理每处 -1。

F8 清晰度与焦点(B2)

8×8 网格,每格算 Laplacian 方差(cv2.Laplacian(patch, cv2.CV_64F).var()),最高值网格 = 焦点区域;逐帧追踪焦点区域迁移可识别焦点转移(Rack Focus)。景深浅 = 焦点区清晰、其余区域清晰度急剧下降;景深深 = 全画面清晰度较均匀。焦点是否落在指令主体上由 LLM 结合焦点区域网格位置判断。

F9 运镜参数(B1,用 OpenCV 稠密光流替代 DPFlow)

cv2.calcOpticalFlowFarneback(可先缩放到 320px 宽提速),对全帧光流取均值:

avg_fx, avg_fy = mean(flow[...,0]), mean(flow[...,1])
speed = sqrt(avg_fx**2 + avg_fy**2) / frame_diagonal   # 归一化速度
# 方向:|fx| > 2|fy| → 水平;|fy| > 2|fx| → 垂直;否则对角
# 速度:<0.001 static;<0.005 very_slow;<0.02 slow;<0.05 medium;否则 fast

类型判定:全局平移 → 摇/移;光流呈放射状(中心向内/外)→ 推/拉(Zoom/Dolly);光流极小 → 固定机位。连续性 = 1 - 突变帧数/总帧数(相邻帧方向角差 > 90° 记一次突变)。光流数据 + 指令④一起交 LLM 做最终对齐判断。

F10 构图辅助指标(B3,可选)

  • 三分法合规性 = 1 - 主体到最近三分线交点距离 / 画面对角线(主体位置由 LLM 估计)
  • 对称性 = 原图与左右翻转图的相关性
  • 视觉重量:四象限亮度/色彩丰富度是否平衡

F11 音频基础统计(S 维度可选辅助)

ffmpeg -i video.mp4 -vn -ac 1 -ar 16000 out.wav,随后算 RMS 音量、静音段占比。口型同步、对白内容、音乐情绪本身只能由支持音频的 LLM 判断。

LLM 评估要点

每个维度一次调用。Prompt 构造分三层:全局契约(所有维度共用,只维护一份)→ 路径模板(3 种评分路径立场不同,不能混用)→ 维度规格(23 维总表的「输入材料」列 + 下方各角色检查点)。不要用一个通用模板套所有维度。

实际执行时不要手工拼装scripts/build_prompt.py <维度> 已把三层结构固化——内置 23 维注册表(路径/指令模块/规则数据键/材料类型/检查点),读入指令原文、各脚本产物 JSON 与抽帧 manifest,直接输出该维度的最终具体 Prompt(--json 另附 requires_audio / material_files 等路由元数据,供编排程序给不同维度分配不同模型)。以下三节是生成器所依据的规范,需调整维度行为时改 build_prompt.py 的注册表。

全局契约(所有维度不变量)

  • 只输出 JSON:{"analysis": "...", "evidence": "...", "score": N};analysis 必须先于 score 给出
  • evidence 必须引用具体时间戳(视觉维度引帧时间戳,声音维度引音频时间点),禁止无证据断言
  • temperature=0(可重复);score 按 1~5 锚定
  • 维度不适用时输出 {"score": null, "na_reason": "..."},不要强行打分

路径模板(按 23 维总表的「路径」列三选一)

纯 LLM(激发型——模型全权判断):

你是一位专业的{角色名},正在评估一段 AI 生成视频是否准确执行了电影指令。
【评估维度】{维度代号} {维度名}:{评估内容}
【相关指令原文】{指令模块原文}
【材料】{按「输入材料」列准备的帧图(文件名含时间戳)或音频}
请逐步分析:{该维度检查点}
只输出 JSON:{"analysis": "逐步分析...", "evidence": "时间戳证据", "score": N}

混合(融合型——规则数据与画面判断按 0.4/0.6 加权):

你是一位专业的{角色名}。【评估维度】{维度代号} {维度名}
【相关指令原文】{指令模块原文}
【客观测量数据】{规则数据 JSON}——这是算法对原视频的客观测量,不含主观判断
【材料】{帧图或音频}
1. 先依据客观数据与指令的匹配程度给出规则分 rule_score(1~5),写明映射依据
   (若该维度规则公式已直接产出分数,如 F4/F7,直接采用)
2. 再看材料独立给出 LLM 分 llm_score(1~5)
3. 两者冲突时以材料为准复核数据是否失效(如检测错误),并在 analysis 说明
只输出 JSON:{"analysis": "...", "evidence": "...", "rule_score": N, "llm_score": N,
             "score": round(rule_score*0.4 + llm_score*0.6)}

规则为主(抑制型——模型只核验,不越权):

你是一位专业的{角色名}。【评估维度】{维度代号} {维度名}
【客观结论】{规则产出的基础分/客观事实,如 F4 得分、F2 转场分类}
【相关指令原文】{指令模块原文}
【核验材料】{帧图,仅用于核验}
你的任务只是核验客观结论与画面是否矛盾:
- 不矛盾 → 直接采用规则分,evidence 说明核验了什么
- 矛盾 → ±1 微调,evidence 必须给出矛盾处的时间戳
禁止抛开规则结论凭主观印象重新打分。
只输出 JSON:{"analysis": "...", "evidence": "...", "score": N}

维度规格

每次调用前按 23 维总表确定三件事:输入材料(贴哪些帧/音频——取帧规则见该列,如 PD4/C4 用各镜头关键帧并排、D1 用转场点前后窗口帧、声音维度用音频而非帧)、指令模块(①~⑦ 中哪几节原文)、规则数据键(哪个脚本 JSON 的哪段)。检查点如下:

各角色检查点:

  • 导演 A1:事件是否清晰(发生了什么/起因/结果/陌生观众能否看懂)+ 与③对齐;A2:物品是否凭空出现消失、空间关系是否前后一致;A3:用 3 个形容词描述主观感受 → 情绪是否一致/有无弧线/与⑦对齐
  • 美术 PD1:空间布局、道具丰富度、类型感是否服务叙事;PD2:结合调色板数据判断配色与情绪意图的匹配;PD3:场景/道具/服装/色彩是否同一风格体系;PD4:核验规则标记的不一致镜头对
  • 摄影 B1:光流数据描述的运镜与④的类型/方向/速度逐项对比;B2:焦点区域是否落在指令主体、虚实关系、有无执行指定焦点转移;B3:主体位置/层次感/视觉平衡/引导性/风格一致性(好构图可打破规则,以视觉意图为准);B4:光影质感/色温与情绪/明暗对比与叙事/光源逻辑
  • 演员 C1:动作起止是否自然、速度是否合人体规律、有无反物理(穿模/悬浮/关节异常);C2:情绪是否到位、有无层次变化、肢体是否配合、转变是否突兀;C3:距离与场景情绪匹配、站位层次、互动自然度、有无穿模;C4:同一角色跨镜头的外观/服装/伤妆/状态连续性
  • 剪辑 D1:核验规则分类的转场类型与⑤是否一致(匹配剪辑单独看帧判断);D2:规则统计的节奏模式与⑤对齐;D3:是否越轴、越轴是否影响空间理解、是否故意艺术选择;D4:纯规则,无需 LLM
  • 声音(需音频能力)S1:对白清晰度/语气/口型同步;S2:环境音与场景匹配、对白/音效/音乐层次平衡;S3:声音事件与视觉事件时间对齐;S4:配乐风格、情绪匹配、动态变化

评分标准与聚合

统一 1-5 分锚定:

| 分值 | 等级 | 含义 | |------|------|------| | 5 | 优秀 | 完全对齐指令,可直接用于成片 | | 4 | 良好 | 基本对齐,细微偏差,微调即可 | | 3 | 合格 | 大方向正确,有明显可感知偏差 | | 2 | 不合格 | 核心指令未被正确执行 | | 1 | 失败 | 完全偏离指令或无意义输出 |

聚合(由 scripts/aggregate_scores.py 固化执行,不要手算):

角色均分 = 该角色各维度(不含 N/A)算术平均
综合得分 = 六角色均分(不含 N/A 角色)的算术平均

可选调权:侧重叙事 → 导演×1.5、演员×1.5(--weights narrative);侧重视觉 → 摄影×1.5、美术×1.5(--weights visual);侧重剪辑 → 剪辑×1.5(--weights editing);侧重声音 → 声音×2.0(--weights sound);默认均权。自定义权重用 --custom-weights '{"director": 2}'

把 23 个维度的 LLM/规则评分整理成 JSON({"A1": {"score": 4, "reason": "..."}, "S1": {"score": null, "na_reason": "..."}, ...},可选 "_gate"_title 字段),交给 aggregate_scores.py 即可一次算出角色均分、综合得分、三层归类均分,并用 --md report.md 生成报告骨架。格式细节见脚本 docstring。

报告格式

六角色报告:每角色给出各维度分数+一句话理由+角色均分。

三层归类报告(定位能力短板):

| 层级 | 包含维度 | |------|---------| | 镜头内运动(11项) | B1 B2 B3 B4、C1 C2 C3、PD1 PD2 PD3、A2 | | 镜头间过渡(5项) | D1 D2 D3、PD4、S3 | | 组合逻辑(7项) | A1 A3、D4、C4、S1 S2 S4 |

各层取层内维度均分。典型结论模式:镜头内高分 + 组合逻辑低分 → 「优秀的单镜头生成器,尚不具备电影片段生成能力」。

特殊情况

  • 单镜头片段(指令写明无剪辑):D1、D2、D3、PD4、C4 标 N/A;D4 仍需核验镜头数=1
  • 无声片段:S1、S3、S4 标 N/A;S2 仅评估「是否有合理的环境音/音效设计意识」(无声即不符合时给低分,指令要求无声则 N/A)
  • 无角色片段(纯空镜):C1~C4 全部 N/A;A1 改评「空镜是否传递了指定氛围/情绪」
  • 无音频能力的评估模型:S1~S4 全部 N/A

N/A 维度不计入任何均分。

scripts/ 清单

| 脚本 | 用途 | 实现公式 | |------|------|---------| | scripts/check_env.py | 环境自检:Python/OpenCV/NumPy/ffmpeg 可用性,输出 JSON | 依赖约定 | | scripts/extract_frames.py | 抽帧(均匀采样 + --shots 镜头关键帧),输出 JPEG + manifest.json | 抽帧约定 | | scripts/shot_detect.py | 镜头边界检测、转场分类、节奏统计、镜头计数;--expect-shots 直接出 D4 规则分 | F1 F2 F3 F4 | | scripts/visual_analysis.py | 亮度/色温/对比度/光源方向、调色板、清晰度焦点、光流运镜、镜头间色彩连续性,输出 JSON | F5 F6 F7 F8 F9 | | scripts/audio_extract.py | ffmpeg 提取音频 + RMS/静音比统计,输出 JSON | F11 | | scripts/build_prompt.py | 按维度生成具体评估 Prompt:23 维注册表 + 三层组装(指令摘录/规则数据/材料清单已嵌入),--json 输出路由元数据 | 评估要点三层 | | scripts/aggregate_scores.py | 23 维评分聚合:角色均分 / 综合得分(含调权)/ 三层归类 / Markdown 报告骨架 | 聚合规则 |

用法示例见各脚本 --help。脚本只负责产出客观数据 JSON 和聚合计算,打分永远按本文件的路径规则(纯LLM/混合/规则为主)完成。