# 评测结果(2026-11-02 重新解码) 运行配置:**只用确定性取证 + OCR,没开 VLM**(VLM 用来补强"实拍 / AI / 3D"的区分、AI 图和真实照片的区分,以及轻音效)。复现命令见文末。 ## 1. 底层画面制作方式(8 类,按镜头时长加权) | 集合 | 视频数 | 准确率 | 切点 F1 | 独立性 | |---|---|---|---|---| | `labels.yaml`(调参集) | 15 | **98.3%** | 1.00(2 条有真值,含 14 处 0.25s 交叉溶解) | 规则在这批样本上设计 | | `holdout.yaml` | 9 | **99.6%** | — | 首轮错了 2 处,据此加了帧率相关规则,已不完全独立 | | `holdout2.yaml` | 7 | **98.9%** | — | 制作方式规则定稿后才第一次运行 | 调参集的混淆矩阵(秒):实拍 16.0 全对;AI 视频 141.2 全对;3D 66.5 全对;代码渲染 155.9 对、2.4 错判为 3D;录屏/截图 19.0 全对;静帧 42.8 对、5.3 错判为代码渲染。 这张表是 2026-11-02 从头解码(不复用缓存特征)测的。剪辑包装层之前是 99.9% / 99.6% / 99.8%,原因见文末「2026-11-02:重新解码后的回归」。 ## 2. 用户真实素材(镜头里有没有实拍 / 截图 / 录屏 / 照片,按时长加权) | 集合 | 准确率 | 说明 | |---|---|---| | labels | 97.6% | 唯一错误:mediank 的暗色半透明 NASA 背景照片漏检(已知局限) | | holdout | 99.6% | 首轮有 2 处误报:浅色代码画面的字幕被当成截图;3D 毛发被当成嵌入视频。修复后的结果 | | holdout2 | 97.2% | **首轮只有 75.6%**:字幕带被当成照片/视频;嵌入图片默认算作"真实"。修复后已不独立。剩余错误:暗色主题网页截图漏检 | 修复内容: - 文字按单帧计数,避免不同时刻的字幕被累加。 - 字幕带不参与照片/视频判断。 - 嵌入的照片/视频片段默认标为"真实还是 AI 待确认",只有截图和录屏直接算真实素材。 - 3D 画面里只认截图面板。 ## 3. 声音 | 项 | 结果 | 真值来源 | |---|---|---| | 有无人声 | 5/5 | capsule-cinema 的 tts.py、口播视频 | | 有无 BGM | 4/4 | bgm.py、bgm_fit.json | | BPM(±4%,含半速/倍速) | 2/2(110.0 / 112.3 vs 真值 110.15) | bgm_fit.json | | 调性 | 2/2(D major) | bgm_fit.json | | 有无音效(≥3 处) | 2/4 | cues.py、素材清单 | | 音乐来源 | 2/5(见下) | Suno 生成记录、曲库下载记录 | **音效是确定性层的短板**:在咸鸭蛋的人声 + BGM 混音里,对照 cues.py 的 110 个音效真值,信号特征完全区分不了音效和语音/音乐起音(精度约 0.2,与随机相当)。所以现在只在人声之外、且极其突出的瞬态上给出"低置信候选",**完整的音效清单交给 VLM(Gemini 能听)**。 **音乐来源**按"视频形式先验 + 证据"判断(规则见 `skills/rea-video/references/audio.md`)。不开 VLM、不给平台信息时: | 视频 | 形式 | 真值 | 判断 | |---|---|---|---| | qing_hiphop_mv | AI 说唱 MV(干声副歌重复 0.26) | Suno v6 | AI 生成 52% ✓ | | mediank_pure_data | 纯配乐 | 曲库 manten diloty | 现成曲库 60% ✓ | | monkey_wine_v3 / salted_egg / birdnest | TTS 旁白 + BGM(干声副歌重复 0.00) | Suno 生成 | 现成曲库 52% ✗ | 三个错例是**先验本身的局限**:AI 工作流做出来的普通视频,BGM 也常是 Suno 生成的,而 Suno 器乐和曲库器乐从信号上分不开。之前 3/3 是因为"满屏音乐 + 有人声"误把 TTS 旁白当成 MV,属于碰对;现在加了唱/说区分,判断理由对了,准确率反而如实下降。纠正这三条要靠平台音乐标签(`--meta`)或听歌识曲,所以报告里普通配乐一律写"倾向曲库,待确认"。注意唱/说的阈值是看过 qing MV 之后定的,这条属于开发集。 **人声分离**(`stems/`):把咸鸭蛋的一句 TTS 叠在它的 Suno BGM 上(人声高 6 dB),分离 SDR 人声 19.7 dB、配乐 19.7 dB;纯 BGM 漏进人声轨 −42.5 dB。mediank 的键盘音效会落进人声轨(瞬态音效的已知去向)。说唱 MV 在混音上测的持续音高是 0.44,在干声上只有 0.24——混音上的数字被伴奏的长音抬高了,所以现在唱/说一律在干声上测。 ## 4. 平台转码视频(OiiOii 文章里的 10 条,开发集) `eval/articles.yaml`:从两篇公众号文章下载的微信转码版(30fps、二次压缩)。真值来自文章作者说明 + 人工看画面。v0.3 的规则是看过这批视频后加的,所以这是开发集。 | 视频 | 真值 | v0.2 | v0.3 | |---|---|---|---| | v11 TikTok 带货原片 | 实拍 | AI 100%(0.0) | 实拍 100%,标"实拍还是 AI 待确认"(1.0) | | v09 Gemini 发布片 | 2D UI 动效 | 代码 63% + 3D 37%(0.63) | 代码 81% + 3D 19%(0.81) | | v10 OiiOii 产品片 | 代码 UI 动效 | 代码 78% + 3D 17%(0.83) | 代码 92% + 3D 4%(0.96) | | v04 推广片原片 | 3D 元素 + 文字动效 | 3D 65% + AI 35%(0.65) | 不变(0.65) | | 其余 6 条 AI 视频 / 拼屏 | — | 全对 / 0.8 | 不变 | | **平均** | | **0.79** | **0.92** | v0.3 的三处修改: 1. 识别平台转码(元数据 `Tencent CAPD MTS` / `Wxmm_` / `vid:v…`)。转码后噪声证据失效,"没有噪声"不再推向 AI;清晰度节奏(会被转码的 GOP 结构伪造)不再当插帧证据。 2. 整片级帧率证据:30fps 文件里,实拍类镜头 ≥70% 时长没有重复帧 → 倾向手机直出(生成模型多输出 24fps,转 30fps 后有 20% 重复帧)。 3. 几乎无彩色、只用个位数颜色的平面画面判为界面/文档,不判 3D。 三个评测集回归:制作方式 99.9% / 99.6% / 99.8% 与 v0.2 完全一致。 ### agent 复核(dsh,DeepSeek V4.1 Flash,不能看图) 11 条有真值时:工具全对 5 / 部分对 5 / 错 1;dsh 复核后全对 6 / 部分对 2 / 错 3。dsh 推翻工具 4 次,2 对 2 错,错的两次都是凭像素统计改判画面类型。为此 SKILL.md 增加了"看不了图时不得推翻工具的制作方式判断"。详细见 `out/dsh_articles/REVIEW.md`,复测方法见 `eval/agent_test/README.md`。 ## 已知局限 1. 实拍样本只有 3 条(都是 60fps 抖音手机视频);没有真实的 Ken Burns 样本,只在合成视频上测过。 2. 暗色/半透明的背景照片、暗色主题网页截图漏检;实拍或 AI 画面上叠加的商品图和 Logo 不做确定性检测,依赖 VLM。 3. 嵌入图片是真实照片还是 AI 图,确定性层判断不了。 4. VLM 路径只用假服务器测过端到端,还没有在真实 Gemini 上跑过评测。 5. 音乐来源:普通视频里的 AI 生成 BGM 判断不出来(见上);AI MV 样本只有 1 条。 ## 复现 ```bash export CAPSULE_CINEMA_ROOT=~/code/github/capsule-cinema rea-video eval eval/labels.yaml -o out/eval_main rea-video eval eval/holdout.yaml -o out/eval_hold rea-video eval eval/holdout2.yaml -o out/eval_hold2 rea-video eval eval/articles.yaml -o out/eval_articles # 视频需先放到 eval/media/articles/ rea-video eval eval/audio_mv.yaml -o out/eval_audio_mv --stems # 只评音频(--stems 先分离人声再测唱/说) # 加 VLM: rea-video --env-file $CAPSULE_CINEMA_ROOT/.env eval eval/labels.yaml -o out/eval_main_vlm --vlm ``` ## 2026-10-30:第一次用真实 Gemini 跑 VLM,并加入「agent 看图复核」 数据:`eval/articles.yaml`(10 条微信转码视频,**开发集**,规则看过这批视频)。VLM 结果来自 zcode 盲测第 2 轮(`gemini-3.1-pro-preview-pc`,每条都生效),agent 复核来自同一轮 zcode 的 `rea-video review / apply-review` 答案。用缓存结果重新融合,不再调用 API。 | 组合 | VLM 权重 1.0(旧) | VLM 权重 0.7(新) | |---|---|---| | 只用确定性取证 | 0.886 | 0.886 | | + Gemini VLM | 0.888 | 0.888 | | + agent 看图复核 | 0.988 | **1.000** | | + VLM + agent | 0.915 | 0.984 | (按时长加权的准确率;真实素材准确率四种组合都是 1.0) - Gemini 在 3D / UI 动效类视频上有帮助(v04 0.65→1.0、v08 0.8→1.0、v09 0.81→0.98),但会把卡通 3D 风格的 AI 视频判成 3D 渲染、把画进画面的游戏界面判成录屏(v01 1.0→0.13、v12 1.0→0.56、v13 1.0→0.44),而且置信度给到 0.9–1.0,压过了 24→30 重复帧等帧率证据。 - 改动:融合时 VLM 权重 1.0→0.7(`classify.VLM_WEIGHT`);融合结果必须是确定性层或模型排前两名的类别(修 v01 最后一镜三方都没投却得出"实拍");`review_tasks.json` 只给 agent 看确定性结果,不给 VLM 答案,避免被带偏。 - 只有 10 条开发集视频,权重没有往更低调(0.5 在这批上更高,但怀疑过拟合)。下一步:在 labels / holdout 上跑一次 `--vlm`,确认 0.7 不伤别的视频。 - labels 0.999 / holdout 0.996 / holdout2 0.998 不受影响(这些评测不开 VLM)。 ## 2026-10-30:留出集验证(zcode + Gemini VLM + agent 看图复核) 数据:`eval/holdout.yaml`(9 条)+ `eval/holdout2.yaml`(7 条),这 16 条没参与过 VLM 权重和复核流程的调参。zcode 按 JOB.md 盲测(视频改名 h01–h16,对照表在 `out/agent_eval/zcode/runs_holdout/mapping.tsv`),`--vlm`(16/16 生效)+ `review / apply-review`。h09(lulukong_b)zcode 自身报错中断,没写复核,只计工具 + VLM。 | 组合 | holdout | holdout2 | articles(开发集) | |---|---|---|---| | 只用确定性取证 | 0.996 | 0.998 | 0.886 | | + Gemini VLM | 0.989 | 0.965 | 0.888 | | + agent 看图复核 | 0.996 | 0.968 | 1.000 | | + VLM + agent(改前) | 0.998 | 0.988 | 0.984 | | + VLM + agent(加「工具 + 一方看图」多数规则后) | **0.998** | **0.998** | **0.988** | - 只开 VLM 在留出集上是负收益(holdout2 0.998→0.965):Gemini 把文字卡片判成静帧/截图推拉,把毛绒 AI 角色判成实拍/3D,置信度 0.85–1.0。 - 改前 holdout2 唯一的退步是 lulukong_c 最后一镜:工具判 AI(0.46)、zcode 判 AI(0.83),只有 Gemini 判实拍(0.85),结果却是实拍。原因是 VLM 和 agent 的意见先平均再融合,Gemini 给 AI 只有 0.05,把 zcode 那一票抵掉了。 - 改动:`pipeline._majority` + `classify.fuse(majority=...)`。工具首选和 VLM、agent 中恰好一方一致时,最终类别必须是它(帧冻结等硬约束仍优先)。反过来 VLM 和 agent 一致反对工具时**不**强制:试过三方任意多数,articles 从 0.984 掉到 0.919、dual_role_realcat 1.0→0.83,两个看图模型常把同一画面看错成同一类。 - 「证据不足,待确认」:转码 + 24fps 源 + 无 AIGC 标识的 AI 视频(capybara_a、lulukong_a/b/c)都被标出、置信度封顶 0.7;手机原生 30fps 的实拍(douyin_live_breakfast)、代码/3D 类视频不受影响。 - zcode 的 FINAL 结论:15 条完成的里 14 条制作方式正确;dual_role_realcat 写成"静态图推拉·真实截图 56% + AI 44%"(真值是代码模板卡片 + 真实截图 + AI),真实素材判断对。 - labels 0.999 / holdout 0.996 / holdout2 0.998(不开 VLM 的回归)不变。 - 结论:开 VLM + agent 复核在三组数据上都不低于只用工具,在开发集上大幅更高;只开 VLM、不做 agent 复核时会变差,SKILL.md 里"能看图的 agent 必须做 review"的要求要保留。 ## 2026-10-30:只有一个看图来源时加限制;加入用户记忆 问题:只开 VLM、不做 agent 复核时,比只用工具还差(holdout2 0.998→0.965);只有 agent 看图、没有 VLM 时,holdout2 也降到 0.968。 改动(`pipeline._vlm_gate`):只有一个看图来源时(只有 VLM 或只有 agent),它的首选必须在工具前两名里;工具对 AI / 实拍 / 数字人有把握(≥0.65 且领先 ≥0.25)时不采用;转码 24fps 素材、没有手机原生 30fps 证据时,不采用"实拍"。两个来源都有时不受影响,由 `_majority` 决定。 | 组合 | holdout | holdout2 | articles(开发集) | |---|---|---|---| | 只用确定性取证 | 0.996 | 0.998 | 0.886 | | + VLM(改前 → 改后) | 0.989 → **0.996** | 0.965 → **0.998** | 0.888 → **0.996** | | + agent(改前 → 改后) | 0.996 → 0.996 | 0.968 → **0.998** | 1.000 → 1.000 | | + VLM + agent | 0.996 | 0.998 | 0.988 | (holdout 的 VLM + agent 从 0.998 变为 0.996:h09 没有 agent 复核,现在按"只有 VLM"处理。) - 比较过的其他做法:只在工具没把握时用 VLM(holdout2 0.965)、只要求在前两名里(holdout 0.987)、把 VLM 概率摊平到 0.3(holdout2 0.974)。最终方案是"前两名 + AI/实拍轴保护"。 - 注意:这条规则是在这三组数据上选出来的,三组都不再是"没见过的视频"。需要一批新视频复核,用户纠正导出的样本(`rea-video memory --export-labels`)可以作为来源。 - labels 0.999 / holdout 0.996 / holdout2 0.998(不开 VLM 的回归)不变。 - 新增用户记忆(`rea_video/memory.py`,存在 `~/.rea-video`):`correct` 记录纠正并立即改结论,同一文件再拆时自动套用;同类纠正出现 2 次以上,会在复核任务和 `summary` 里提示;`prefs` 记默认参数和自由文字偏好;`memory --export-labels` 导出评测样本。评测(`rea-video eval`)不读用户记忆。 ## 2026-10-30:实拍口播(夜景 / 室内)+ 拍法与打光 新数据:`eval/koubo.yaml`(2 条抖音转码口播,人工逐镜标注,**开发集**:规则是看着这两条调的)。 问题(改前,不开 VLM):夜景公交站口播被判成「3D 渲染 82%」,人声判成 TTS;室内贴脸口播 33% 判成 3D。原因: 1. 转码把夜景暗部压成近黑平坦块、墙面和黑衣服也是平坦块,「平坦块多 / 用色少」被当成渲染特征。 2. **人脸检测一直没生效**:OpenCV 5.0 去掉了 `CascadeClassifier`,旧代码异常被吞掉,所有视频 faces=0(不只是这两条)。 3. Gemini 其实判对了(实拍 1.0),但「只有一个看图来源时必须在工具前两名里」把它挡掉了。 4. 人声来源跟着画面错:实拍占比 0% → 按「后期配音」判成 TTS。 改动: - `rea_video/faces.py`:YuNet 人脸检测(230 KB,首次自动下载),带五官关键点;没有模型时退回 Haar。 - 特征新增 `dark_ratio / dark_std / dark_flat / flat_lit / face_presence / face_area`。 - `classify.lowlight_photo`:大面积近黑但带颗粒(渲染的黑底是纯色)、亮部不平坦、有人脸 → 只按亮部算渲染纹理;`video_context.native30` 也把这类镜头算进来。 - 大人脸(占画面 ≥6%、≥50% 帧出现)→ 渲染纹理分 ×0.4;评测集里卡通/毛绒/插画脸都 <6%。 - OCR 读到 ≥5 行小字号文字 → 界面/文档截图,3D 降权(评测集里 3D 镜头最多 2 行)。 - 手持/移动机位时数字人分 ×0.3。 - `_vlm_gate`:看图来源判 实拍/AI/数字人、且镜头有大人脸或是弱光人物时,可以不在工具前两名里;工具对「渲染」有把握不再挡它(工具的把握只保护 AI/实拍轴)。转码 + 非原生 30fps 不改判实拍的保护不变。 - 新模块 `rea_video/cinematography.py`(同日改为 `rea_video/aspects/` 框架,见下一节):逐镜测景别、主光左右/上下、光比、软硬、色温、背景虚化、点光源;整片汇总布光方案(夜景环境光 / 正面柔光 / 侧前主光+补光 / 单侧硬光)、器材清单、机位数、跳切/推近切、插入素材占比。VLM 提示词和 review 模板加了 cinematography(机位角度、光源、眼神光、轮廓光)和 shooting。 - 实拍镜头的复刻路线改成拍摄方案(`replication.shoot`),AI 近似降为备选。 - 评测加 `cine:`(景别、布光)和 `audio.voice_source` 检查。 结果(按时长加权的制作方式准确率;VLM = gemini-3.1-pro-preview,agent = Claude 看图复核): | 组合 | koubo_night_street | koubo_indoor_closeup | |---|---|---| | 改前 · 只用工具 | ≈0.05(3D 82%,只有黑底文字卡对) | ≈0.65(33% 判成 3D) | | 改后 · 只用工具 | 0.51 | 0.99 | | 改后 · + VLM | 0.78 | 0.99 | | 改后 · + agent | 0.93 | 1.00 | | 改后 · + VLM + agent | **0.98** | **0.99** | - 拍法/打光(主景别、布光方案)四种组合都是 2/2:夜景 → 「夜景/弱光环境光,没有专门补光」,室内 → 「正面柔光(平光)」。人声来源(真人):只用工具 1/2,开 VLM 或 agent 后 2/2。 - 只用工具时夜景 0.51:剩下的主要是「实拍还是 AI」二选一(转码后按设计标「待确认」),要靠 VLM / agent 看图定。 - Gemini 的拍法描述和 agent 有出入(夜景站姿镜头 Gemini 说硬光、无轮廓光,agent 看到身后路灯的头发亮边),报告里测量值和看图结果并列,不融合。 - 回归 1(四组旧评测集全部重新解码,人脸和新特征生效后再分类):labels 0.999 / holdout 0.996 / holdout2 0.998 / articles 0.886,真实素材 0.976 / 0.996 / 0.981 / 1.0,逐条视频**与改前完全一致**;新规则在旧数据上触发了 9 次弱光、7 次大人脸、1 次小字截图,没有改错任何镜头。 - 回归 2(zcode 盲测缓存的 Gemini + agent 答案,用新规则重新融合;另做一版把答案挂到带人脸特征的重新解码结果上):holdout / holdout2 / articles 的 工具 / +VLM / +agent / 都开 = 0.996/0.996/0.996/0.996、0.998/0.998/0.998/0.998、0.886/0.996/1.000/0.988,和上一节一致。 中途一版「人物例外」不限范围时,holdout2 +VLM 掉到 0.991(dual_role_realcat 的 AI 人物被 Gemini 判成数字人并越过工具前两名),已收紧为「工具前两名里有渲染类标签时才放行」,并加了测试。 - 局限:两条口播都是同一个博主、都是开发集;软硬光和补光在转码夜景上偏保守;机位(手持 vs 支架)只靠运动统计,夜景里支架拍的半身镜头和手持自拍混在一起,没有标真值。需要更多不同博主、室内补光(环形灯/柔光箱)的口播做留出验证。 ## 2026-10-30:拍法分析改成可插拔维度(aspects),去掉只认人脸的限制 动机:上一版的拍法 / 打光只认人脸,桌拍、商品、手部这类没有人脸的实拍拆不了;拍法逻辑散在 pipeline / vlm / review / report / eval 各处,加一项分析要改五个地方。 改动: - `rea_video/aspects/`:每个维度(`framing` 取景、`camera` 机位、`lighting` 打光、`editing` 剪辑、`format` 形式)一个模块,统一走 测量 → 看图提问 → 逐镜解读 → 整片汇总 → 评测。VLM 提示词、`review_answers.json` 模板、报告「拍法、打光与剪辑」一节、`eval` 的 `aspects:` 校验都从注册表生成。说明见 `skills/rea-video/references/aspects.md`。 - 主体(`aspects/subject.py`):人脸 → 画面最清晰的区域(细节能量最高的连通块)→ 画面中心。打光、景别、机位聚类都在主体上测;没有人脸时景别标「估算」。 - 打光布光方案改成规则表 `lighting.SETUPS`(新增「逆光」),器材按「人物 / 物品」两套给。 - 剪辑新增「切点落在说话停顿处的比例」(剪气口)。 - 形式:人物口播 / 桌拍(物品为主体 + 固定或俯拍)/ 手持拍物品(开箱、带货、第一视角)/ vlog / 其他;看图结论优先。 - 测量、VLM、agent 三个来源逐项并列(`fields` 表),`prefer="seen"` 的项以看图为准,其余以测量为准,不做平均。旧的 `cinematography` 答案仍可读。 - 分类规则里这次加的阈值集中到 `classify.RULES`,注释写明来源分布,不再引用具体样片。 结果: - 口播两条(工具 / +VLM / +agent / 都开):夜景 0.51 / 0.78 / 0.93 / 0.98,室内 0.99 / 0.99 / 1.00 / 0.99,与重构前一致;`framing.shot_size`、`lighting.setup`、`format.format` 四种组合都是 2/2。 - 回归:四组旧评测集重新解码后 labels 0.999 / holdout 0.996 / holdout2 0.998 / articles 0.886,逐条与改前一致;zcode 缓存答案重新融合的 12 个组合数字也一致。 - 无人脸实拍:`art_v11_tiktok_original`(第一视角手持拍榨汁杯)走「清晰区域」路径,测得正面柔光、中性色温、下方台面反光、手持,和画面一致。它的形式起初被判成 vlog,于是加了「手持拍物品」一类(**看着这条加的**,算开发集)。新增目测标注 `aspects.format`:art_v11 → product,douyin_live_breakfast / douyin_live_street → talking_head,3/3。 - 还缺:俯拍桌面(固定机位、顶拍)的真样本,「桌拍」分支目前只有单元测试覆盖;室内补光灯口播、多人访谈也都还没有样本。 ## 2026-11-01:复刻方案按「生成单元 / 拍摄场次」组织 动机:逐镜拆解是对的,但复刻不是一镜一做。视频模型(Seedance 2.5、Kling 3.0 等)一次能出多个镜头、能吃多张参考图和参考视频;实拍时同一场景、同一机位的镜头要一起拍。原来的复刻计划是每个剪辑镜头一个任务,报告也只列证据,看不出"怎么做"。 改动: - 新增 `rea_video/production.py`,`finalize` 后写入 `breakdown.json` 的 `production_plan`,报告新增「复刻方案」一节(md / html)。 - AI 镜头(ai_video / cg_3d)→ 生成单元:硬切相连、同一场景(首尾帧 HSV 直方图距离 ≤ 0.5)的镜头合并;按所选模型的能力(`capabilities/models`:单次时长、是否 `video.multi_shot`、参考视频、原生音频)分组,单元内连续硬切尽量 ≤8s、最多 10s(S06),在叠化/淡入淡出和换场景处切开(S03),超长单镜切段(S02),硬切相连的同场景单元用上一单元尾帧衔接(S05)。用动态规划求最少单元数。每个单元输出参考素材(产品图、人物图、原片片段)、全片统一的风格句 + 多镜头提示词(中英)。 - 默认引擎不支持多镜头时(能力地图里 Seedance 2.0 没有 `video.multi_shot`),按 R11 首选的多镜头模型规划,并写明两种做法的调用次数。 - 实拍镜头 → 拍摄场次:按场景聚类(不要求相邻),场景内按景别 + 机位方式分机位,先大景别后特写,给建议拍摄时长。 - 代码渲染 / 录屏 → 连续的合成一段代码工程;静图推拉 → 本地重建。 - 阈值放进 `capabilities/routing.yaml` 的 `segmentation.defaults`(`multishot_hardcut_s`、`same_scene_distance`)。 - agent 看图复核的答案新增 `replication.image_prompt / video_prompt / video_prompt_en`,不开 VLM 也能产出提示词;同一镜头 agent 的提示词优先于 VLM。 结果: - 判断逻辑没动,四组评测与改前一致:labels 0.999 / holdout 0.996 / holdout2 0.998 / articles 0.886。`pytest` 58 项通过(新增 `tests/test_production.py` 6 项)。 - 样例(开 VLM 的 OiiOii 榨汁杯复刻 v12):8 镜 → 3 个 Seedance 2.5 生成单元(#1–#5、#6、#7–#8),逐镜要 8 次;TikTok 原片 v11:11 镜 → 1 个场景、2 个机位(中景手持 9 镜、近景 2 镜),与画面一致。 - 局限:场景相似度只看颜色分布,MV 这类同一人物、不同景别和道具来回切的视频会切得偏碎(AI 音乐 MV 67 个 AI 镜头 → 40 个单元,另有 19 个静图推拉镜头夹在中间把它们隔开);原作者实际分了几次生成,目前只在报告里推荐分法,不做断言——转码后 24→30 重复帧相位在切点处通常连续,分不出来。生成单元的分法还没有真值标注,也还没拿真实模型跑过一次验证。 - 补充(同日,看 README 案例时发现的问题): - 生成单元可以跨过插入画面:同一场景的 AI 镜头被代码界面 / 录屏 / 静图隔开时,仍合并为一次生成,剪辑时再插回插入画面。混合片(双角色对话 + 界面)从 4 次生成降到 1 次(5 镜、7.9s)。提示词时间按生成时的时间轴累加。 - 3D 渲染镜头的摘要不再写成"AI 画面",并给出第二条路线:LLM 写 Blender / Three.js 工程。代码渲染段统一为"1 个代码工程(N 段)"。 - 拍摄场次按归一化的景别(五档)和机位方式(测量枚举)分组;之前 VLM 的自由文字("近景(手持物品特写)")把 TikTok 原片的 2 个机位拆成了 6 个。 - 拼帧图底栏改成中文类名、21px 字,时间单独一行。 - 观察:开 VLM 重跑 TikTok 原片(art_v11)时,Gemini 把 3 个实拍镜头判成 AI(理由"挂钟数字乱码",实际清晰),工具只标了"证据不足"。agent 看图复核后改回实拍 100%。说明转码实拍上 VLM 单次结果不稳定(评测表里同一条是对的),看图复核这一步不能省。 - `pytest` 59 项通过。 ## 2026-11-01:先判大类再判细类;真实素材和参考素材分开;物体上的字、24p 实拍、VLM 分歧 动机(跑 README 案例时暴露的 5 个问题): 1. AI 音乐 MV 的 #26、#37:工具判 AI 视频、agent 判数字人、VLM 判实拍。三方里两方认为是生成的,但票分在两个细类上,结论是实拍。 2. AI 画面里的产品被标成「商品实拍图」、代码界面里播放的视频被标成「实拍视频素材」:画面里嵌入的真实像素,和复刻时要准备的参考,混成了一类。 3. VLM 单次结果会编证据(榨汁杯原片的「挂钟数字乱码」),流程里没有专门把这类镜头挑出来。 4. 24→30 重复帧被当成 AI 证据;24p 相机实拍导出 30fps 也会这样。 5. OCR 把杯身 Logo、牛奶盒上的字当成后期字幕。 改动: - `classify.GROUPS` / `fuse` / `decide`:AI 视频 + 数字人 = 生成,3D + 代码 = 渲染,其余各自一组。有看图来源参与时先按组融合、再在组内分细类,置信度报这一组的总概率。只用工具时仍按细类取最高(试过也按组:工具给数字人的分数是从 AI 视频里分出来的,合并后口播夜景 0.51→0.33,撤回)。 - `pipeline._majority`:先看细类多数(工具 + agent 判代码、VLM 判 3D → 代码),再看大类多数(工具判 AI、agent 判数字人 → 生成)。`fuse` 的多数约束同时按组生效(只按细类封顶时,AI + 数字人加起来仍会压过「工具 + agent 都判实拍」,口播 VLM+agent 0.985→0.963,已修)。 - `assets.material_summary`:`items` 只放画面里的真实像素;AI 视频 / 数字人 / 实拍里 VLM 说的商品、Logo、人物,以及 3D 里的商品、Logo、人物,进 `references`(报告「复刻要准备的参考素材」,生成单元仍引用 `@图片1`)。版式里 VLM 说的 `real_footage` 记为「嵌入视频片段」。 - `pipeline`:工具和 VLM 一方判实拍、一方不是,且没有 agent 复核过时,写 `base.disputed`,`review_tasks.json` 列为必看,`summary` 和报告里显示。 - `_ai_or_live_doubt`:判 AI 视频、证据是 24fps 源、没有 AIGC 标识、看图一方认为是实拍(≥0.5)时,标「AI 还是 24p 相机实拍待确认」,置信度封顶 0.7。 - `classify.drop_scene_text`:实拍 / AI / 数字人 / 3D 镜头上,VLM 的 `overlay_text`(只列后期文字)里没有的 OCR 文字轨算物体上的字,不进叠加层,记在 `base.scene_text`;没开 VLM 时,同一段字在画面里移动超过 4% 才算。匹配要求有一段连续相同的字(防止 "Aon" 凑巧匹配 "GAME CHANGER")。静图推拉不过滤(截图上的字就是内容)。 - 新增 `tests/test_fusion_groups.py`(6 项),`pytest` 65 项通过。 结果: - 只用工具:labels 0.999 / holdout 0.996 / holdout2 0.998 / articles 0.886 / koubo 0.755(夜景 0.512、室内 0.988),真实素材 0.976 / 0.996 / 0.981 / 1.0,与改前一致。 - zcode 缓存的 Gemini + agent 答案重新融合(工具 / +VLM / +agent / 都开):holdout 0.996 / 0.996 / 0.996 / 0.996,holdout2 0.998 ×4,articles 0.886 / 0.996 / 1.000 / 0.988,与改前一致。koubo +VLM 0.885、+agent 0.967、都开 0.985,与改前一致。 - 案例:MV #26、#37 改判 AI 视频(63%),整片不再有实拍;MV 另有 5 镜标「有分歧」待看图。榨汁杯复刻(v12)不再有「真实素材」,改为「复刻需准备参考:商品参考图、Logo」;原片(v11)的「字幕」叠加层去掉(是牛奶盒上的字)。OiiOii 宣传片(v10)的「实拍视频素材 33.4s」改为「嵌入视频片段」。 - 局限:24p 实拍的规则没有样本验证;「有分歧」只是把镜头挑出来,判对还要靠看图;物体文字的判断在不开 VLM 时只看移动,静止镜头里的商品文字仍会被当成叠加层。 - 补充(同日第二轮): - 24p 实拍模拟:把手机实拍原片(art_v11)先转 24fps 再转回 30fps,只用工具时 11 镜全部判成 AI 视频(置信度 0.89,没有任何提示)。像素特征上和真正的 AI 视频分不开(噪点、用色、重复帧几乎一样)。改为:判 AI 视频、只有 24fps 帧率证据、没有 AIGC 标识、又没有看图来源时,一律标「AI 还是 24p 相机实拍待确认」,置信度封顶 0.7,并进入 `review_tasks.json` 必看列表。模拟片现在结论带「96% 时长待确认」。评测准确率不受影响(只改置信度和提示)。 - 三方各执一词:MV #29 工具判 3D(次选 AI 视频 0.20)、agent 判 AI 视频、VLM 判实拍 0.95,结论成了实拍。`_majority` 增加一条:两个看图来源互相不一致时,只有一方和工具的次选(≥0.15)同组,就按它。加了测试。 - agent(Claude)复核了案例里所有「有分歧」的镜头:MV #27/#29/#36/#38/#46(奏折小字是伪汉字等,均为 AI 视频,原工具判 3D 的改为 AI 视频)、榨汁杯复刻 #1/#5/#8(AIGC 标识 + Logo 乱码)、混合片 #3。5 个案例现在没有「有分歧」或「待确认」的镜头。 - 回归:只用工具 labels 0.999 / holdout 0.996 / holdout2 0.998 / articles 0.886 / koubo 0.755;缓存答案重新融合各组合、koubo +VLM / +agent / 都开 0.885 / 0.967 / 0.985,均与改前一致。`pytest` 66 项通过。 ## 2026-11-01:覆盖面扩展——2D 动画、定格动画、实拍上的 AI 加工、更多布光、调色、速度 动机:盘点能拆的类型时缺了几类常见做法:实拍被 AI 二次加工(换脸、对口型、风格化)、2D 动画、定格动画;打光缺户外、低调/高调、彩色氛围光、产品静物;没有调色和拍摄速度。 改动: - 新类别 `anim_2d`(2D 动画)、`stop_motion`(定格动画),`classify.UNMEASURED`:工具没有像素测试(一拍二的保持帧和帧率转换分不开),只由看图来源判断。单一看图来源也可以给出(`_vlm_gate` 不再要求"在工具前两名"),但标「待确认」、置信度封顶 0.7。分组:2D 动画归渲染,定格归实拍。路由 R19(2D 动画:设定图 + 首尾帧,或 AE / Live2D / Spine)、R20(定格:首选真拍);复刻方案里 2D 动画进生成单元并给动画工程替代路线,定格进拍摄场次并写逐帧拍法。 - 实拍上的 AI 加工:VLM 和 agent 答案新增 `ai_edits`(face_swap / lip_sync / restyle / outfit_swap / bg_replace / object_edit / beautify)。实拍和定格镜头上转成后期步骤(`plan.AI_EDITS` → R12 视频编辑 / R13 口型重配 / R05 换装),拍摄场次里写"拍完后要 AI 加工",结论写"实拍经 AI 二次加工:换脸 N 镜"。agent 的答案(包括空列表)优先于 VLM。 - 新维度 `aspects/grade.py`(调色):全帧测饱和度、对比、黑位/白位、暗部和亮部的冷暖(只在低色度像素上测,避免深蓝物体伪造青橙)、亮度分布、亮部颜色数;归纳为自然 / 青橙 / 日系 / 胶片 / 黑白 / 暗调 / 高饱和。旧拆解没有这项测量时,`finalize` 用存好的首尾帧补测。 - 打光新增 7 种布光方案(共 12 种):户外逆光 / 户外直射 / 户外阴天(要看图来源在 `lighting.location` 写"户外")、低调、高调、彩色氛围光、产品静物(新测量 `bg_std`)。夜景环境光里出现多种饱和色时加"霓虹 / RGB"备注。 - 机位维度新增看图字段 `speed`(正常 / 慢动作 / 延时 / 变速 / 倒放)。 - 新增 `tests/test_coverage_ext.py`(6 项,合成图验证调色风格、深蓝物体不误判青橙、各新布光方案、新类别融合、AI 加工步骤),`pytest` 71 项通过。 结果: - 只用工具 labels 0.999 / holdout 0.996 / holdout2 0.998 / articles 0.886 / koubo 0.755,真实素材 0.976 / 0.996 / 0.981 / 1.0;koubo 取景 / 布光 / 形式 2/2;缓存答案重新融合各组合、koubo +VLM / +agent / 都开 0.885 / 0.967 / 0.985,均与改前一致。koubo 室内重新解码,新测量正常写入。 - 案例调色:MV 暗调低饱和、榨汁杯原片和复刻版自然、3D 科普片日系清新(明亮低对比),与画面一致。 - 局限:新类别、AI 加工、新布光、调色都没有真实标注视频,阈值来自合成图和经验值;数字人仍没有评测视频。下一步要收集:不同博主的实拍(室内外、RGB 灯、产品台)、数字人、2D 动画、定格、换脸 / 对口型视频各几条。 ## 2026-11-01:剪辑包装层——字幕时间轴与样式、花字、贴纸 / GIF、音效卡点 动机:之前只在每个镜头抽 4 帧做 OCR,知道「这镜有字幕」,但拆不出逐句时间、字幕样式、花字、贴纸 / 表情包 / GIF,音效也没和画面事件对上。复杂剪辑的包装层复刻不出来。 改动(`rea_video/packaging.py`,整片一条时间轴,不按镜头切): - 字幕时间轴:整片每秒 2 帧 OCR(最多 240 帧,画面里没有任何 8×8 块变化才沿用上一帧结果),多行字幕合成一块,同一位置同一段字跟踪成一句;再用每秒 10 帧的灰度帧把起止对齐(以相邻句的画面为对照,避免两句互相侵入)。导出 `packaging/subtitles.srt`。 - 文字样式(从像素量):只在文字框里聚类;字芯 = 被包住、碰不到背景的颜色里横跨整行的那个;描边 = 字芯外 2 像素一圈的主色且比背景里常见;底框 = 文字左右紧贴处颜色一致且和更远处不同;关键词高亮 = 另一个有实心笔画的颜色(和抗锯齿过渡色区分);渐变、字高、粗细、倾斜。同一条字幕轨的字色 / 描边按多数统一。 - 文字分类:字幕(同一位置连续换句)、花字(字大 / 彩色 / 倾斜 / 粗描边 / 多色 / 弹出,至少两条)、标题(顶部常驻、只有一段字)、文字标注(章节牌、跟着物体走的标签)、画面里的字(跟着画面动、无描边无底框)。 - 入场 / 出场:一帧到位 = 直接出现;否则按出现前后的差异区域判缩放弹出 / 逐字 / 滑入 / 淡入;句中弹跳、变色单独标。 - 贴纸 / GIF / 画中画,三条线索:① 在动的画面上,一块边界清楚、内部不动、四周都在动、不贴画面边的区域,保持 1.5 秒以上(口播上贴的表情包、头像、截图);② 切镜时画面几乎全变(没变的不超过 15%,排除同机位跳切)而这一块不变;③ 去掉镜头运动后,镜头中途某块整体突变并保持,后面又整块消失、原处纹理恢复。③ 在实拍 / AI 画面上常是画面本身(抬手、换装),所以除非里面在循环播放或完全静止,只标「疑似」、不进结论。3D / 动画 / 版式 / 录屏画面里只认跨切镜或循环的。贴边、过细的区域不算。有贴纸的镜头,制作方式特征只在贴纸外的区域测。 - 音效:每个音效对齐到最近的画面事件(±0.2 秒);没开 VLM 时在花字 / 标签 / 贴纸出现时刻补找瞬态声,作为低置信候选。 - VLM 整片提示词增加 `text_effects`、`stickers`;`rea-video review` 增加 `packaging`(确认 / 否定贴纸、改文字类型、补漏)。导出 `packaging/overlays.ass`(颜色、描边、底框、位置、弹出动画)。`--no-packaging` 可跳过。 - 新增 `tests/test_packaging.py`(8 项:合成视频上的字幕时间轴和白字黑描边、弹出花字、循环 GIF 贴纸位置和时间、音效对齐、ASS 导出、贴纸区域剔除、复核覆盖、流水线输出),`pytest` 79 项通过。 真值:从 capsule-cinema 的叠字代码导出(`eval/*_text.json`)——salted_egg / birdnest 的 overlay.py(字幕逐句时间、说到关键词变黄弹跳、常驻标题、章节牌、跟着物体走的标签、大号贴字),monkey_wine_v3 的 subtitles.json(双行字幕)。**这三条在开发时反复看过,不是独立测试集。** | 视频 | 字幕句数 | 召回 | 精确 | 起 / 止误差中位 | 起止都在 0.25s 内 | 文字相似度 | 字色 / 描边 | 关键词高亮 | |---|---|---|---|---|---|---|---|---| | salted_egg_plush | 40 | 0.975 | 1.000 | 0.063 / 0.056s | 74% | 0.989 | 100% / 100% | 84% | | birdnest_plush | 32 | 1.000 | 1.000 | 0.066 / 0.045s | 66% | 0.988 | 100% / 97% | 100% | | monkey_wine_v3 | 42 | 1.000 | 0.933 | 0.070 / 0.042s | 86% | 0.990 | 93%(无描边,0 误报) | — | 其他文字:标题 3/3、章节牌 12/12 找到且归类正确;跟着物体走的标签 11 个找到 7 个(只出现 0.5 秒左右的常被 OCR 漏掉),其中 2 个被分成了花字;大号贴字(「流油咸鸭蛋!」「燕窝!」)2/2 判为花字。 贴纸: - 三条真值视频都没有图片贴纸,最终 0 处。birdnest 里「蛋突然孵化」被像素层当成贴纸,靠「3D 画面里只认跨切镜或循环」排除。 - 合成视频:循环 GIF(两帧表情、0.4 秒一循环、背景在平移)能找到,位置、起止、循环都对。 - 真实视频(articles 10 条 + koubo 2 条,人工看图核对,没有逐帧真值):进结论的检出 9 处,6 处是真贴纸(口播室内的猫猫表情包、机器人「Got it!」、4 个名人头像圆贴纸),3 处误报(v10 界面里播放的视频、v12 带货实拍、口播夜景片尾);另有 1 处「疑似」(v07 换装,确实不是)。漏检明显:口播夜景里人在动时贴上的「豆包」图标、点赞截图卡片、圈注截图,口播室内的聊天截图都没找到——估计召回约一半。这些要靠 VLM(整片提示词已要求列出贴纸)或 agent 看图补。 - 第一版只靠「镜头中途突变」时,这 12 条视频上报了 30 多处,几乎全是误报(抬手、换装、跳切背景、画面边缘),所以才改成上面三条线索。 音效:在 salted_egg / birdnest 上,花字 / 标签 / 贴纸出现时刻补出的候选 17 个,对上 cue sheet 的 7 个(41%)。这两条的真值音效很密(每秒约 1.7 个),随机落点也有约 28% 能对上,所以提升有限,只作为低置信候选;开了 VLM 时不补。 回归:只用工具 labels 0.999 / holdout 0.996 / holdout2 0.998,真实素材 0.976 / 0.996 / 0.981,声音各项与改前一致。**更正(2026-11-02)**:这组数字是复用缓存特征重新分类得到的,没有重新解码,漏掉了这次改动带来的回归,见下一节。 耗时:包装层每分钟视频约 30–50 秒(主要是 OCR)。 ## 2026-11-02:重新解码后的回归 起因:整理仓库时用新的输出目录跑评测,所有视频都从头解码,分数和记录对不上。`rea-video eval` 在输出目录里已有 `breakdown.json` 时会复用缓存特征、只重新分类,所以之前几次「与改前一致」都没覆盖到解码阶段的改动。 | 集合 | 复用旧缓存特征 | 从头解码 | 真实素材(从头解码) | |---|---|---|---| | labels | 0.999 | **0.983** | 0.976 | | holdout | 0.996 | **0.996** | 0.996 | | holdout2 | 0.998 | **0.989** | 0.972(原 0.981) | | articles | 0.886 | **0.886** | 1.0 | | koubo | 0.755 | **0.755** | 0.771 | - 从头解码结果稳定:monkey_wine_v1、dual_role_human 再解码一次,分数不变。 - 改判的 3 个镜头:monkey_wine_v1 #2(4.8–10.1s)静帧 → 代码渲染(0.69);dual_role_human #4(3.9–5.8s)代码渲染 → 3D(0.50);dual_role_realcat #4(3.9–5.9s)代码渲染 → AI 视频(0.35)。 - 二分定位:在 8ae09ce / e8c7f99 / c7122a4 上从头解码,这两条都是 1.0;到 cdc7eeb(剪辑包装层)变成 0.89 / 0.897。是剪辑包装层引入的。 - 原因:这 3 个镜头上都有只靠「跨切镜不变」检出的静态贴纸(实际是连续插画里的同一个角色、版式卡片上的标题),`clean_region` 据此只量画面的一部分(monkey_wine_v1 只剩左 55%,dual_role 去掉上方 23%),帧冻结、局部运动这些证据被裁掉。评测集里被裁剪测量的 41 个镜头,没有一个因此改对。 - 修复:`clean_region` 只认镜头内有证据的贴纸(中途出现或循环播放);只跨切镜不变的照样报告,但不再裁剪测量。口播室内的表情包(中途出现)仍会裁剪。**还没重新解码评测**,上表和 README 的分数仍是修复前的。 - README 的「准不准」表已改成从头解码的数字;加 VLM / agent 的两行是 11-01 的结果,还没在新解码上重测。 - 以后回归要用新的输出目录(或 `--only` 指定视频)强制重新解码,不要只复用缓存。 ## 2026-11-04:实拍带货 + AI 与真人混合(eval/daihuo.yaml,目测真值) 两条抖音视频(HEVC 1080x1920 30fps,TikHub 下载),真值是人工逐镜目测 + 视频作者自述的制作流程,没有生产记录。规则没改,这一组是**现有规则第一次跑**。 - `daihuo_unboxing`:沉浸式开箱,72 秒 29 镜,全部实拍(头顶俯拍支架,无口播)。 - `daihuo_ai_tutorial`:AI 带货教程,58 秒 21 镜。实拍 75%(口播 3 秒、口播叠商品照片 4 秒、相机拍真实手机屏幕 37 秒)+ AI 25%(即梦 Seedance 2.0 用作者本人出镜视频做主体参考生成的 13 秒带货片段,首尾各用一次)。 | 制作方式(时长加权) | 只用工具 | + Gemini VLM | + agent 看图复核 | |---|---|---|---| | daihuo_unboxing | 65.2% | 96.9% | 97.4% | | daihuo_ai_tutorial | 22.9% | **22.9%** | 97.7% | | 两条合计 | 46.4% | 63.9% | 97.5% | | 真实素材 | 62.4% | 86.8% | 97.5% | 拍法:形式(开箱 → 桌拍/手持物品;教程 → 桌拍/口播)只用工具 1/2,开 VLM 后 2/2;机位角度(顶拍/俯拍)开 VLM 后 1/1;布光方案 1/1。声音:开箱片只有拆包同期声没有口播,工具判成有人声(1/2)。 发现: - 转码后静止的俯拍手部镜头会被工具判成 AI(开箱片 35% 时长),Gemini 能纠回来。 - **相机拍真实手机屏幕**(不是录屏)37 秒,工具判成 3D 渲染 / AI(屏幕 UI 的平坦色块像渲染画面),Gemini 判实拍是对的,但融合规则在「工具判 3D、VLM 判实拍」时跟了工具,所以开 VLM 分数没变。这类画面(教程里拍手机、拍电脑屏)需要在融合或确定性规则里单独处理,待做。 - agent 复核后仍有残留:教程片 #4(1.3 秒口播)融合后 AI 54%;开箱片 2 镜共 1.9 秒仍留 AI。原因都是工具端 AI 概率太高、单个看图来源压不过。 - 两段即梦成片文件里没有 AIGC 标识,抖音接口的 `show_ai_corner` 也是 false;认出 AI 靠的是画面里的即梦水印和礼盒英文乱码。 复现:`rea-video eval eval/daihuo.yaml -o out/eval_daihuo`(工具)、`--vlm -o out/eval_daihuo_vlm`(Gemini);agent 复核的结果是把 `rea-video apply-review` 后的输出目录复制到 `out/eval_daihuo_review//` 再 `eval --vlm` 复用。 ## 2026-11-04:混合结构视频里,看图复核的实拍判断按镜头放行(issue #8) issue #8 的口红带货片(抖音转码,HEVC 1080x1920 30fps,98 秒 38 镜):AI 猫店员开场 23 秒(24→30 重复帧)+ 2 秒促销版式卡 + 75 秒真人试色素材(没有重复帧)。工具把真人部分全判成 AI 低置信,agent 看图复核判实拍后**一个都没改**:`_vlm_gate` 在转码视频上只认整片的 `native30`,而整片因为混了 AI 开场只有 64% 时长原生 30fps(阈值 70%),于是「转码 24fps 素材不改实拍」这条挡住了所有镜头,报告写成「AI 86%」、复刻方案给了 20 个生成单元。 改动: - `classify.deterministic` 新增逐镜 `facts["native_cadence"]`:30fps 文件里这一镜 `dup_ratio < 0.02`、没有 pulldown(转码文件不看 GOP 清晰度周期)。只是事实,不参与打分。 - `pipeline._vlm_gate`:转码视频上看图判实拍时,整片 `native30` 或**这一镜** `native_cadence` 二者有一即放行;另外工具前三名都不到 0.4、且看图类别只比次选差 ≤0.08 时(唇部微距没有人脸,工具给 3D 0.35 / AI 0.27 / 实拍 0.22),看图结果也计入。 - `pipeline._ai_or_live_doubt`:实拍「待确认」文案按这一镜有没有重复帧区分,镜头有相机节奏且看图判实拍(≥0.5)时不再标待确认。 - 这条视频并入后:实拍 75% + AI 25%,改判 31 镜;残留 #4 促销卡(2 秒)仍判 AI(工具 0.46,看图的版式类不在前两名)。 回归(重新解码;labels / holdout2 只剩本机有文件的 7 / 3 条,capsule-cinema 的产出已不在): | 集合 | 只用工具 | 说明 | |---|---|---| | labels(7 条) | 1.000 | 真实素材 0.958,与改前逐条一致 | | holdout(7 条) | 0.995 | lulukong_b 0.962,与改前一致 | | holdout2(3 条) | 0.995 | — | | articles(10 条) | 0.886 | 与 11-02 一致 | | koubo(2 条) | 0.755 | 0.51 / 0.99,与改前一致 | | daihuo(2 条) | 0.464 | 与 11-04 一致 | 只用工具的分数不受影响(新事实不参与打分)。用缓存的看图答案重新融合 daihuo: | 组合 | daihuo_unboxing | daihuo_ai_tutorial | 真实素材 | |---|---|---|---| | + Gemini VLM(改前 → 改后) | 96.9% → 96.9% | 22.9% → **37.2%** | 86.8% → **92.6%** | | + agent 看图复核 | 97.4% → 97.4% | 97.7% → 97.7% | 97.5% → 97.5% | 教程片里「相机拍真实手机屏幕」的镜头有一部分因为镜头自身没有重复帧被 Gemini 的实拍判断纠回来了,剩下的仍是「工具判 3D、看图判实拍」跟了工具(待做)。issue #8 的视频作者未勾选公开,没有加进评测集。 ## 2026-11-05:健壮性修复(深度审查) - `probe`:容器字节扫描跳过 mdat(压缩帧数据里随机出现的 `vEo` 等会被认成「Google Veo?」,整片每个镜头 AI +1.0;8 条新编码 mp4 里 2 条中招)。字节里的生成器名只记为 `generator_weak`,不参与打分;C2PA 只有和生成器名同时出现才算 AI 证据(相机也会签 C2PA)。 - 低帧率(< 12.5fps)视频抽尾帧会越过最后一帧导致 decompose 中止,改为退回取最后一帧;损坏视频解码时 ffmpeg 报错写满管道会卡死,改为写临时文件。 - 整片 VLM 答案先做结构清洗(`narration` 不是对象、`sfx.t` 写成 `"00:03"` 等不再让 finalize 崩溃,旧缓存也会清洗);`choices` 为空 / `content` 为空时换下一个模型。 - 复刻引擎写进 breakdown,`apply-review` / `correct` / 评测重算不再重置成 seedance2.0;`remake-plan --engine` 生效。 - 只用工具的评测复用输出目录时去掉之前 `--vlm` / 复核 / 纠正留下的答案。 - SRT 时间戳进位、旋转视频的 ASS 分辨率、ASS 文本转义、镜头缩略图改存 uint8(长视频内存约 1/4,切点逐条一致)。 回归(复用缓存特征重新分类): | 集合 | 只用工具 | 说明 | |---|---|---| | labels(7 条) | 1.000 | 真实素材 0.958,与 11-04 一致 | | holdout(7 条) | 0.995 | 一致 | | holdout2(3 条) | 0.995 | 一致 | | articles(10 条) | 0.886 | 一致 | | koubo(2 条) | 0.755 | 一致 | | daihuo(2 条) | 0.464 | 一致;+ Gemini 0.703 / 真实素材 0.926,+ agent 复核 0.975,均与 11-04 一致 | 8 条案例视频的镜头切点在改动前后逐条一致。 ### 同日追加:可变帧率切点、换语言重出报告 - 可变帧率视频(录屏、手机暗光)的镜头时间原来按「帧序号 / 平均帧率」算,会错位:30fps + 10fps + 30fps 各 2 秒的片子,切点报成 2.571s / 3.429s。现在读容器里每帧的时间戳(不解码,每条约 0.04 秒),和均匀时间差超过半帧时才改用,切点为 2.0s / 4.0s。案例和评测集里的视频都是恒定帧率,不走这条路。 - `--lang` 换语言重出报告时,包装层里存下来的文字类型、动画、颜色、字高说明按新语言重新生成;VLM 和复核者写的描述保持原文。 回归:6 个集合 + daihuo 的 Gemini / agent 复核两组分数与上表一致;8 条案例视频切点逐条一致。