🎬 视频切片智能匹配逻辑

完整文档 · 2026-07-29 · 涵盖火山知识库切片规则、Layer1脚本分析、Layer2 LLM匹配、硬过滤、品牌规则、字幕高亮

目录
  1. 系统总体架构
  2. 火山知识库切片规则(控制台 Prompt)
  3. 阶段 A:关键词动态生成
  4. 阶段 B:Layer1 脚本叙事结构分析
  5. 阶段 C:素材搜索与匹配(核心链路)
  6. 阶段 D:Layer2 权重打分体系
  7. 品牌规则(8 类)
  8. 字幕重点高亮(红色标注)
  9. 视频标题模糊背景
  10. 关键文件索引

1. 系统总体架构

脚本输入
[A] 关键词生成
task.py · 动态数量 5~30
[B] Layer1 脚本分析
llm.py · 叙事结构 → 素材需求画像
[C] 素材搜索与匹配
volcano_kb.py · search_and_download()
┌─ 搜索(limit=100) ─ 硬过滤(人物/横竖屏/品牌) ─ Layer2 LLM重打分 ─ 去重排序 ─┐
最终切片路径列表 → 视频合成
关键设计:火山知识库(KB)负责视频切分 + 内容描述生成(服务端);客户端负责搜索召回 + 硬过滤 + LLM 智能匹配 + 排序。两端分工明确,互不耦合。

2. 火山知识库切片规则(控制台 Prompt)

以下 Prompt 配置在 火山方舟控制台 → 知识库 → 增强策略 → 视频切片规则,由 KB 服务端执行,控制每个视频如何切分以及生成什么样的 content_summary

2.1 切片规则 Prompt

### 任务:工业仪表产品视频智能切片与多维描述 你是一个专业的工业仪表视频内容分析师。你需要基于提供的视频分镜抽帧和音频ASR文本,将视频拆分为多个小切片,并为每个切片生成多维度的内容描述。视频内容为工业自动化仪表产品展示(电磁流量计、压力变送器、液位计、pH计、信号隔离器、温度传感器等)。 ### 切片规则: 1. 时长:每个切片控制在 10-45 秒之间,不允许超过 60 秒 2. 第一个片段的 <start_time> 与视频开始时间一致,最后一个片段的 <end_time> 与视频结束时间一致 3. 所有小片段连贯无间隔(<end_time> = 下一段 <start_time>),每个片段必须满足 <start_time> < <end_time> 4. 拆分断点优先选择视频转场点、画面场景切换点、产品展示切换点 5. 一个切片内尽量只包含一个完整表达单元(一个产品镜头组 / 一个操作演示 / 一段完整文字说明) ### content_summary 字段填写规范: <content_summary> 字段是对该视频切片的内容分析总结,使用一段自然语言描述,禁止使用 JSON 格式。在这段描述中必须涵盖以下 7 个维度(用中文分号分隔,简洁清晰): 【场景】画面中看到的场景(实拍/3D动画/图表/实验室/工厂车间/产品特写等) 【产品】出现的主要产品名称、型号(如 美控电磁流量计、美仪压力变送器 等;无产品则填 无) 【动作】画面中的动作或操作(产品旋转展示/接线演示/安装过程/数值变化/水流流动/人工操作等) 【画面文字】画面中出现的文字、字幕、标签、参数标注(逐条列出;无则填 无) 【核心卖点】该片段传达的核心卖点或信息点(如精度高/价格实惠/耐腐蚀/安装方便/出厂标定等;无则填 无) 【画面风格】画面风格描述(科技蓝/工业灰/白底产品图/实景工厂/明亮实验室/暗色背景+发光产品等) 【情绪基调】画面情绪基调(专业严谨/高端大气/实用亲民/科技感/稳重可靠等) 每个维度都要认真填写,不存在的字段填"无"。在描述的最后另起一行以"关键词:"开头,列出 3-5 个核心搜索关键词(如 关键词:电磁流量计、产品展示、精度)。 ### 重要约束: 1. content_summary 必须使用纯文本,禁止使用 JSON 格式或花括号包裹 2. 7 个维度必须全部填写,不存在的字段填"无",不可省略 3. 关键词 行必须以"关键词:"开头,后面用顿号分隔 3-5 个核心搜索词 4. 产品 维度要尽可能精确识别产品名称和品牌(如 美控电磁流量计 而非 流量计) 5. 画面文字 维度要逐条列出画面中出现的所有文字信息 6. 如果某个切片同时包含多个产品,产品 维度用顿号分隔列出 7. 尽量识别画面中出现的品牌Logo、公司名称(如美控/美仪/Meacon等) ### 输出要求(JSON格式,紧凑排列、无多余空格): 请输出一个JSON数组,每个元素代表一个切片,包含: - <start_time>:切片开始时间(格式:HH:MM:SS.sss) - <end_time>:切片结束时间(格式:HH:MM:SS.sss) - <content_summary>:小片段的内容摘要,需包含上述7个维度及关键词行
7 维度 content_summary 示例输出
【场景】白色背景下产品特写;【产品】美控电磁流量计;【动作】产品360度旋转展示;【画面文字】精度±0.5% | 口径DN15-DN300;【核心卖点】高精度计量;【画面风格】白底产品图,科技蓝光效;【情绪基调】专业严谨\n关键词:电磁流量计、产品展示、精度、美控

3. 阶段 A:关键词动态生成

文件app/services/task.pygenerate_terms()
数量动态计算:按脚本句子数,最少 5 个,最多 30 个
顺序match_materials_to_script=True 时,LLM 按脚本叙事顺序生成关键词
重排顺序匹配模式下 跳过 TwelveLabs 语义重排(保持叙事顺序)

数量计算公式

sentences = re.split(r"[。!?!?\n]+", video_script)  ← 过滤空行
amount = max(5, min(len(sentences), 30))         ← 5~30 之间
例如:13 句脚本 → 生成 13 个关键词,确保每句都有对应的搜索主题。

4. 阶段 B:Layer1 脚本叙事结构分析

文件app/services/llm.pyanalyze_script_structure()
触发search_and_download() 首次调用时自动触发
目的LLM 分析整段脚本,逐句标注素材需求画像

每句标注字段(7 维)

字段含义示例值
sentence脚本原句"像美仪建有专业标定实验室..."
narrative_role叙事角色品牌背书
expected_scene期望画面场景实验室
required_product必须出现的产品电磁流量计
brand_requirement品牌要求必须美仪
expected_mood期望情绪基调专业严谨
must_have_keywords必须包含的视觉关键词["标定实验室","精度"]

叙事角色枚举

开场钩子 问题引入 对比分析 解决方案 数据论证 品牌背书 行动号召 产品介绍 过渡句

5. 阶段 C:素材搜索与匹配(核心链路)

文件:app/services/volcano_kb.pysearch_and_download()

5.1 第一步:关键词搜索

for each_term in search_terms:
    hits = search_slices(term, limit=100)  # KB API 检索
limit100 每次检索 100 个切片
返回格式[{point_id, start_ms, end_ms, summary, filename, score}, ...]
summary可能是纯文本或 7 维结构化文本(由 KB 切片规则生成)

5.2 第二步:硬过滤(代码层,无 LLM)

KB 检索结果
① 排除人物出镜
② 横竖屏过滤
③ 品牌过滤

① 排除人物出镜

规则详情
文件名关键词含"人物出镜 / 真人出镜 / 真人口播 / 胡雅清 / 人物出境 / 讲解 / 口播" → 排除
summary 关键词含"人物出镜 / 真人讲解 / 口播 / 人物讲解" → 排除

② 横竖屏过滤

目标比例文件名匹配模式
16:9(横屏)16∶9, 16:9, 16bi9, 16比9, 横屏
9:16(竖屏)3∶4, 3:4, 3比4, 竖屏, 9:16, 9∶16
1:1(方形)1∶1, 1:1, 1比1

③ 品牌过滤

根据 Layer1 标注的 brand_requirement 过滤,详见 品牌规则

5.3 第三步:增强匹配(LLM 介入)

触发条件KB 原始最高分 < 0.7

Step 1:文件名加权

文件名命中搜索关键词 → score = min(原始分 × 1.2, 1.0)

Step 2:Layer2 LLM 重打分

rerank_slices(script_context, hits, language=language, script_annotation=anno)

将 Layer1 标注信息传入,LLM 按权重打分(见阶段 D)。

Step 3:打分结果

c["score"] = llm_score  ← 纯 LLM 分数,不再混合 KB 原始分

5.4 第四步:排序输出

  1. 按最终 score 降序排列
  2. point_id 去重(同一切片只取一次)
  3. 过滤 score < 0.3 的低分切片
  4. resolve_local_path() 获取本地 MP4 文件路径
  5. 累计时长 > audio_duration 时停止

6. 阶段 D:Layer2 权重打分体系

文件:app/services/llm.pyrerank_slices()

基于 Layer1 标注信息,LLM 按 5 维度加权 为每个候选切片打分。

维度权重满分条件部分得分
产品精准匹配 30% 切片产品 = required_product 同领域不同产品 → +0.15
场景/叙事匹配 25% 切片场景 = expected_scene 部分相关 → +0.12
品牌要求匹配 20% 品牌一致 / 中性+无品牌 中性但有品牌 → +0.05
品牌冲突 → 0
卖点/信息点匹配 15% 切片核心卖点呼应句子 同领域 → +0.07
情绪/风格匹配 10% 切片情绪 = expected_mood 可接受 → +0.05
最终得分 = 产品(30%) + 场景(25%) + 品牌(20%) + 卖点(15%) + 情绪(10%)
所有分数都是 LLM 分,不再混入 KB 原始搜索分。

7. 品牌规则(8 类)

7.1 Layer1 标注值

标注值触发条件(脚本中提到)
必须美仪美仪 / Supmea
必须美控美控 / Meacon
必须米科米科
必须联测联测
必须丰控丰控
必须MROMRO
必须OEMOEM
中性无品牌信息
不限制不应用品牌过滤(极少使用)

7.2 硬过滤关键词映射

品牌文件名匹配关键词
美仪美仪 / meiyi / supmea
美控美控 / meacon
米科米科 / miko / meco
联测联测
丰控丰控 / fengkong
MROmro
OEMoem

7.3 过滤逻辑

brand_requirement行为
中性排除所有已知品牌(美仪/美控/米科/联测/丰控/MRO/OEM)的切片
必须XX只保留文件名含该品牌关键词的切片
不限制不过滤

8. 字幕重点高亮(红色标注)

文件:app/services/video.py_build_segmented_text_clip()

annotate_core_info (llm.py)

LLM 标注脚本中的核心信息,用 **...** 包裹:

"采购电磁流量计别只盯单价,需要**综合长期运维****计量稳定**"

渲染规则(video.py _render_line)

片段类型文字颜色描边颜色
普通文本白色 #FFFFFF黑色 #000000
加粗文本 (核心信息)鲜红 #FF3C3C深红 #780000
实现方式:PIL 逐行渲染,通过正则 \*\*(.+?)\*\* 解析标记,分段绘制。加粗片段用红色正文字体 + 深红色描边,保证在各种背景下清晰可见。

9. 视频标题毛玻璃背景

文件:app/services/video.pyapply_title_blur_to_video() + _build_title_overlay()

效果

降级策略:如果高斯模糊失败(VideoFileClip 不可用或 frame 获取失败),降级为纯黑色半透明背景(alpha=150)。

10. 关键文件索引

文件职责核心函数
app/services/task.py 任务编排层 generate_terms() 动态关键词生成
generate_final_videos() 合成触发 annotate_core_info
app/services/llm.py LLM 交互层 analyze_script_structure() Layer1 脚本分析
rerank_slices() Layer2 权重打分
annotate_core_info() 核心信息标注
generate_terms() 关键词生成
app/services/volcano_kb.py 火山 KB 集成层 search_and_download() 全链路编排
_hard_filter_person_talking() 排除人物
_hard_filter_by_aspect() 横竖屏
_hard_filter_by_brand() 品牌
search_slices() KB API 调用
app/services/material.py 素材下载路由 download_videos() 路由→ volcano_kb
app/services/video.py 视频合成层 apply_title_blur_to_video() 毛玻璃标题
_build_title_overlay() 标题文字叠加
_build_segmented_text_clip() 红色高亮字幕
app/models/schema.py 数据模型 VideoParams.match_materials_to_script 开关

附录:日志输出示例

============================================================
[Layer1] 脚本叙事结构分析 - 开始
============================================================
[Layer1] 句1: 进口的电磁流量计牌子嫌贵... | 角色=问题引入 | 产品=电磁流量计 | 品牌=中性
[Layer1] 句2: 那采购国产电磁流量计... | 角色=开场钩子 | 产品=电磁流量计 | 品牌=中性
...
[Layer1] 句10: 像美仪建有专业标定实验室... | 角色=品牌背书 | 产品=电磁流量计 | 品牌=必须美仪
============================================================

generate_terms: 脚本约 13 句,生成 13 个关键词

volcano_kb keyword[0] '电磁流量计 采购选型' 检索到 87 个切片 (limit=100)
[硬过滤-排除人物出镜] 87 → 82 (过滤掉 5 个)
[硬过滤-横竖屏] 9:16: 82 → 61 (过滤掉 21 个)
[硬过滤-品牌] 中性: 61 → 38 (过滤掉 23 个)

volcano_kb keyword '电磁流量计 采购选型' max_score=0.523 < 0.7, 启用增强匹配

[Layer2] 开始匹配句子: "进口的电磁流量计牌子嫌贵..." | 角色=问题引入 | 场景=产品对比 | 产品=电磁流量计 | 品牌=中性 | 候选数=38
[Layer2] 匹配结果 TOP 5:
  #1 | score=0.920 | 12.20美控电磁流量计3∶4.mp4 | 【场景】白色背景下产品特写...
  #2 | score=0.850 | ...
  ✓ 选中切片 | score=0.920 | 时长=12.3s | 累计=12.3s
  ✓ 选中切片 | score=0.850 | 时长=10.8s | 累计=23.1s

volcano_kb 最终返回 14 个切片 (总时长 52.3s)