SuperAPI AI 工具集

review-finished-ad

测试与质量

查看项目

更新于 10-21 13:08

技能介绍

用途

review-finished-ad 是渲染完成的 9:16 竖屏视频广告在发布前的最终质检关卡。它位于渲染成片与用户之间,负责判断一条广告是否既像品牌自己的广告,又像一条广告那样播放,而不是一堆片段的堆砌。该技能同时检查机器可判定的部分和需要人工看图确认的部分,修复由调用方完成,之后重新运行关卡直到通过。

该技能已被取代:视频工具包现在通过 check-layer 部分(版本 1.2.0,位于本仓库的 parts 文件夹)完成同样的事情。此原子技能为工具包之外的技能保留,行为不变,其脚本仍可运行。

主要能力

脚本执行以下机器检查:

  • ratio:输出必须精确为 1080x1920,否则失败。
  • hook:开头 1.0 秒内没有声音,或开场画面静止超过 1.5 秒则失败。
  • pacing:在片尾卡之前画面冻结超过 2.5 秒,或音频超出最后一个视频帧超过 --max-freeze-s 与 --endcard-s 两者(超过 0.5 秒警告)则失败。
  • dead_air:视频中段静音超过 1.0 秒失败(使用 --no-speech 时跳过)。
  • black_frames:黑场超过 0.3 秒失败。
  • logo_asset:logo 文件为 favicon 尺寸(长边小于 256px,或面积小于 40,000 px²)则失败。
  • logo:在片尾卡上找不到工具包 logo 则失败。
  • palette:片尾卡主色中没有工具包颜色时仅警告。

脚本还输出一张质检图 finished-ad-sheet.png,展示视频主体采样、镜头中点与片尾卡,并用红色标出平台 UI 区域,下方附品牌参考。人工需确认:安全区(顶部 220px、底部 400px、右侧 140px 内不得有字幕、CTA、价格、logo 或产品名)、字体是否为品牌字体、产品外观是否与参考图一致、产品在各场景是否一致、logo 是否未被拉伸/改色/裁剪/重绘。任何一项失败等同于机器检查失败。

使用方式

需要 ffmpeg 与 ffprobe 在 PATH 中,并执行 pip install --quiet numpy pillow。

运行示例:

python3 scripts/review_finished_ad.py
--video working/final.mp4
--json working/review/finished-ad.json
--sheet working/review/finished-ad-sheet.png
--logo working/brand/logo.png
--palette "#0b3d2e,#f4efe6"
--product-images working/brand/product-1.png,working/brand/product-2.png
--font working/brand/font.ttf --brand-name "Acme"

关键参数说明:

  • --logo 是视频实际合成的 logo 文件(工具包的 logoUrl / logos[0],或配方片尾卡使用的字标文件),支持 PNG、JPEG 或 SVG(SVG 通过 cairosvg 或 rsvg-convert 栅格化),绝不使用生成的 logo。若视频中没有 logo 图片(品牌名以品牌字体文字呈现),则省略 --logo,在质检图上判断文字字标。
  • --endcard-s 是片尾卡长度(默认 3.0),应设为真实长度。
  • --logo-at 3.2(可重复)添加 logo 在视频中段出现的时间戳;片尾卡(最后约 1.6 秒)始终检查。
  • --no-speech 用于没有旁白或对白的格式(纯音乐),这样静音不会被判定。
  • --format-profile silent-text 用于声明的静音、文字主导格式(动态文字),仅在配方命名时使用。它隐含 --no-speech 并改变三项检查。
  • --expect-size 默认为 1080x1920。

退出码:0 表示通过(发布前仍需阅读质检图);2 表示失败(failed 列出检查项,每条 note 说明如何修复);3 表示错误(检查无法运行,如文件缺失、无 ffmpeg,修复后重跑,绝不盲目发布)。

适用场景

适用于渲染完成的 9:16 竖屏视频广告在发布前的最终质检,包括有旁白/对白的常规广告、纯音乐格式、以及声明的静音文字主导格式(动态文字)。也适用于连续无剪辑格式,需要对视频早、中、晚段进行覆盖采样。

限制

  • 需要 ffmpeg、ffprobe 以及 numpy、pillow 依赖。
  • 运动检测基于 ffmpeg 冻结检测器读取 270px 副本,细、低对比度文字变化可能被误判为冻结;可疑静止段会以 540px 重读并按真实画面变化拆分。
  • 约 1px 宽的笔画在 1080px 下仍低于可检测范围,需在质检图上人工判断。
  • 编码比特不足导致持续锐化的静止帧可能逃过 ffmpeg 冻结检测;若质检图各帧看起来相同,应视为冻结。
  • 无法快速 seek 的文件(单关键帧的 MPEG-TS)从头读取一次。
  • 修复循环最多 2 轮;若仍失败,不得将视频作为成品呈现,调用方应以失败检查项报告为阻塞。
  • 该技能已被视频工具包的 check-layer 部分取代,仅为工具包之外的技能保留。

输出

--json 写入 { verdict, failed[], format_profile, video{width,height,duration,has_audio,cuts,picture_duration?}, checks{<name>: {status, note, data}}, sheet, judge_on_sheet[] }。status 为 pass、fail、warn、not_applicable 之一。