一、整体流程(精炼版)

  1. 视频输入 → Shot detection(只在场景切换处抽帧)
  2. 每个 shot 抽取 1–3 个 keyframes + 提取该 shot 的 ASR 文本 → 生成 scene.description
  3. 每 5 分钟做镜头摘要(shot-level → 5min summary)→ 汇总为文档并带影视名送 LLM 生成整片解说稿(按句拆分)
  4. Embedding 阶段:对所有 scene.description 与每条解说句做 embedding,存入向量库 → 对每句检索 Top-K 候选
  5. 大模型精筛:把句子 + Top-K 候选(含 time/span & desc & ASR)交给 LLM,返回最终连续 time-range
  6. 后处理:合并相邻/重叠片段、平衡每句时长 → 生成 mapping.json
  7. 合成:按 mapping 裁片段(FFmpeg) + TTS(或真人配音) + 字幕/画面特效 → 输出成品

二、每步详细实现

0)  通用约定

  • 时间格式:HH:MM:SS.mmm(毫秒保留)
  • 向量相似度用余弦相似度(normalize vectors)
  • AI自动剪辑软件设计(影视解说)Top-K 默认为 10(可配置)
  • Embedding 模型推荐:text-embedding-3-large(或本地部署的 BGE),维度约 3072
  • 向量库推荐:Faiss(嵌入后离线索引)或 Milvus(在线可扩展)

1)镜头切分(Shot Detection)

目标:把视频分成 shot(镜头),每个 shot 包含 start/end timestamp。

工具:PySceneDetect / OpenCV + 自定义阈值(色彩直方图差、结构相似度SSIM、关键点匹配)

输出数据结构(shots.json)

[
  { "id":"scene_0001", "start":"00:00:00.000", "end":"00:00:03.200", "duration":3.2 },
  { "id":"scene_0002", "start":"00:00:03.200", "end":"00:00:06.500", "duration":3.3 }
]

注意:调参(阈值)决定短镜头 vs 长镜头比,推荐对长片先 run 一次默认阈值,再统计平均镜头时长并微调。


2)关键帧 + ASR → 生成镜头描述

步骤

  • 对每个 shot,抽 1–3 个关键帧(start / mid / end 或基于运动量选择)
  • 用视觉大模型(CLIP/BLIP2/LLaVA)对关键帧生成文本描述(每帧一句)
  • 提取该 shot 对应的音轨段,运行 ASR(Whisper / 商业 ASR)得到对白(可能为空)
  • 合并帧描述 + ASR 生成 description(合并策略见下)


 

合并策略(示例):

description = "<visual_summary>。对白:<asr_text>。"

示例 scene.json(每个镜头)

{
  "id":"scene_001",
  "start":"00:01:20.000",
  "end":"00:01:35.000",
  "duration":15.0,
  "keyframes":[ "kf1.jpg", "kf2.jpg