一、整体流程(精炼版)
- 视频输入 → Shot detection(只在场景切换处抽帧)
- 每个 shot 抽取 1–3 个 keyframes + 提取该 shot 的 ASR 文本 → 生成 scene.description
- 每 5 分钟做镜头摘要(shot-level → 5min summary)→ 汇总为文档并带影视名送 LLM 生成整片解说稿(按句拆分)
- Embedding 阶段:对所有 scene.description 与每条解说句做 embedding,存入向量库 → 对每句检索 Top-K 候选
- 大模型精筛:把句子 + Top-K 候选(含 time/span & desc & ASR)交给 LLM,返回最终连续 time-range
- 后处理:合并相邻/重叠片段、平衡每句时长 → 生成 mapping.json
- 合成:按 mapping 裁片段(FFmpeg) + TTS(或真人配音) + 字幕/画面特效 → 输出成品
二、每步详细实现
0) 通用约定
- 时间格式:HH:MM:SS.mmm(毫秒保留)
- 向量相似度用余弦相似度(normalize vectors)
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
