视频广告素材审核一站式工具。下载广告视频、使用FunASR进行音频转写、使用RapidOCR提取字幕,并结合大模型(Gemini)进行多模态的音频逐字核验、字幕核验、流畅性口播分析、以及音画同步与爆点元素视觉核验。 使用场景:当业务需要进行广告视频合规审核、剧本还原率核验、或者自动化素材判级时。 关键词:广告素材审核、多模态校验、FunASR精准锚定、OCR一致性、Gemini Agent视觉判定
一站式视频广告内容多模态合规审核及一致性校验,支持本地素材与远端拉取。
# 1. 基础系统工具
brew install ffmpeg # macOS
# 2. 基础 Python 依赖
pip install yt-dlp requests python-dotenv google-generativeai
# 3. 核心语音引擎与视觉依赖 (FunASR & RapidOCR)
pip install funasr modelscope torch torchaudio rapidfuzz rapidocr-onnxruntime
FunASR 首次运行时会自动下载约 2-3GB 模型文件到 ~/.cache/modelscope/:
# 验证所有依赖
python scripts/check_environment.py
# 或手动检查关键组件
ffmpeg -version
python -c "from funasr import AutoModel; print('FunASR OK')"
python -c "from rapidocr_onnxruntime import RapidOCR; print('RapidOCR OK')"
python -c "import google.generativeai as genai; print('Gemini SDK OK')"
.env 文件,并写入:
GEMINI_API_KEY="AIzaSy..."assets/templates/template_alias_zh.json 已正确提供并可建立模板映射,同时有相应的 key_sentences.json 及关联视觉参考图配置。重要:你必须严格按照以下 Stage 0 - 7 顺序执行,每个阶段生成固化的 schema JSON 和目录文件后再进入下一个阶段。绝不允许跨阶段读取未授权文件(详见 INTEGRATION_BOUNDARY)。所有生成资产将被强制存入
runs/<run_id>下。
目标:拉取/存入素材,锁定唯一基准模板。 输入:用户视频 URL/本地路径,以及从用户对话提取或手工指定的模板名称。 执行步骤:
runs/<run_id> 沙盒目录。yt-dlp 将文件下载至 runs/<run_id>/raw.mp4;或将本地拷贝过来。如果视频时长 < 30s 阻断执行。template_alias_zh.json 中查询匹配的模板ID,并将绝对映射路径及基础属性锁定,输出成为 template_lock.json。产生 video_meta.json 记录 duration_ms 等媒体属性。预期输出:
✅ runs/<run_id>/raw.mp4
✅ runs/<run_id>/template_lock.json
✅ runs/<run_id>/video_meta.json
(失败阻断主线并退出)
目标:全局建立带有时间锚的听写地图,并定位广告真正发生的核心时间轴 (core 窗)。 执行步骤:
ffmpeg 将全片提纯出音频 runs/<run_id>/raw.aac。start_ms/end_ms 的 full.srt。所有 ASR 将作为绝对底表禁止在下游重跑。RapidFuzz token_set_ratio 方法 (>=65分) 比对字幕文件和已锁定的正文模板起始和结尾语句,找出广告发生的精确 core_start_ms 与 core_end_ms。预期输出:
✅ runs/<run_id>/raw.aac
✅ runs/<run_id>/full.srt
✅ runs/<run_id>/ad_segment.json
(无法框选则标记 indeterminate,阻断向下执行除报告外的环节)
目标:进行前置铺垫扩窗物理截断,生成专供视觉与衔接分析的素材 ad_clip.mp4。
执行步骤:
work_start_ms = max(core_start_ms - 15000, 0),work_end_ms = core_end_ms。ffmpeg -ss <XX> -t <YY> -c copy 截取出包含 15 秒前传铺垫的短视频素材。这为流转核心。预期输出:
✅ runs/<run_id>/ad_clip.mp4
(若失败记入 indeterminate,流转到大模型视觉审核时一并跳过)
目标:修剪字幕映射范围并定点关键视觉发生句的精确位置。 执行步骤:
full.srt 中提取落在 [work_start_ms, work_end_ms] 期间的断句,输出纯前端机器使用的 funasr_align.json。template_lock.json 指向的 key_sentences.json 抽出视觉期望动作特征组。并在 funasr_align 中执行 Fuzzy Match,标注出每个关键动作的物理发生戳 t_start,整合出 key_sentence_timecodes.json。预期输出:
✅ runs/<run_id>/funasr_align.json
✅ runs/<run_id>/key_sentence_timecodes.json
(若无提取锚点则关键画面的 Agent 检查阻断跳过)
目标:严格检查音频侧口播内容与 OCR 提取画面侧内容,是否忠实于源模板文字。本环节音频与OCR可并跑。 执行步骤:
python scripts/stage04_audio_diff.py <run_dir>。这会生成 audio_diff_raw.json 及 smoothness_features.json。assets/prompts/agent_audio.md, 结合 audio_diff_raw.json 的内容进行分析。<run_dir>/ 下写出 agent_audio_diff_reviewed.json。必须严格参照 assets/schemas/agent_audio_diff_reviewed.json 的结构填充。python scripts/stage04_ocr_diff.py <run_dir>。这会生成 subtitle_diff_raw.json。assets/prompts/agent_subtitle.md, 结合 subtitle_diff_raw.json 分析字词差异。<run_dir>/ 下写出 agent_subtitle_diff_reviewed.json。必须严格参照 assets/schemas/agent_subtitle_diff_reviewed.json 的结构填充。预期输出:
✅ runs/<run_id>/audio_diff_raw.json & agent_audio_diff_reviewed.json
✅ runs/<run_id>/subtitle_diff_raw.json & agent_subtitle_diff_reviewed.json
✅ runs/<run_id>/rapidocr_align.json & smoothness_features.json
目标:通过多模态感知评测“广告开始铺垫是否自然顺畅”、“口播是否卡顿严重”。 执行步骤:
python scripts/stage05_fluency.py <run_dir>。这会抽取对应音频片段 ad_clip.aac。assets/prompts/agent_fluency.md,将抽取的音频 ad_clip.aac 输入自身的多模态听觉分析能力,结合 funasr_align.json 分析口播质量与衔接过渡。<run_dir>/ 下写出 agent_fluency.json。必须严格参照 assets/schemas/agent_fluency.json 配置所有字段,包括建议重写或重录动作。预期输出:
✅ runs/<run_id>/agent_fluency.json
目标:不仅核对字幕发生时间,同时核查对于模板要求重点表现的镜头物品(如手机、运动鞋等)是否在关键句时间点物理出现。 执行步骤:
python scripts/stage06_vision.py <run_dir>。脚本会比对生成基础同步报表 ocr_result.json,并在突发关键帧处抽帧输出 frames_index.json 与实体图片至 frames/。assets/prompts/agent_ocr.md,审核刚才脚本生成的 ocr_result.json 对于同句的物理判定是否过度死板,过滤并容差伪问题。agent_ocr_result.json 依照 assets/schemas/agent_ocr_result.json。assets/prompts/agent_vision.md。查看 frames/ 下的所有三连爆发抽帧,并与模板视觉资产对比,判定物体是否实际露面。agent_vision_result.json 依照 assets/schemas/agent_vision_result.json。预期输出:
✅ runs/<run_id>/frames/*.jpg 及 frames_index.json
✅ runs/<run_id>/ocr_result.json 及 agent_ocr_result.json
✅ runs/<run_id>/agent_vision_result.json
目标:将所有前置评判数据全部聚合,如果有疑似“违规”和“建议返工”的点位,一并打碎物理切割留证,最终聚合出业务报表面板。 执行步骤:
python scripts/stage07_report.py <run_dir>。此脚本主要负责切割报错片段并存放至 clips/,生成 clips_tasks.json 与 clips_index.json。assets/prompts/agent_master.md,你将读取 Stage 1至 Stage 6 以及 Clips 的所有最终态 JSON 审阅件(凡遇断帧未果,遵由 indeterminate 继承链)。report.md 以及底层归档标准物 final.json,还有给技术看的 archive_index.json。参考对应的 schemas 确保没有结构缺失。预期输出:
✅ runs/<run_id>/clips_tasks.json & clips_index.json
✅ runs/<run_id>/clips/*.aac(mp4)
✅ runs/<run_id>/report.md & final_text.md
✅ runs/<run_id>/final.json & archive_index.json
整个管线流采取最严格容错的 Indeterminate 保护机制:
Indeterminate 状态存放到各业务模块。Indeterminate 供终验。完成所有 Stage 后,主控制台应输出日志播报:
✅ 视频广告素材分析全部完成!
📁 输出沙盒目录: runs/202611.../
📄 核心凭证清单:
- report.md (业务核读面板:Markdown 格式总览报告)
- final.json (被机器直接吸收用的标准汇总终态契约)
- clips/* (问题片段自动隔离留存区)
🔗 流转下一步: 请打开 report.md 参考处理建议,或将 final.json 脱水传往主数据系统。
我们为所有 Agent/模型设计的所有提示词与交互限制均从脚本内脱离并在 assets/prompts 下统管:
绝不允许任何开发成员私下把 Prompt 硬编码至 .py 环境逻辑链中。作为 IDE 的内联分析单元 (Agent),你需要负责亲自读取这些 Markdown, 查阅对应输出 JSON 容器 schemas,结合计算出的物理资产输出判决定级。