video-style-analysis
完美复刻原视频的完整内容(画面+声音),通过智能体分析原视频的视觉风格和音频特征,生成风格提示词,使用TTS复刻配音,基于原画面重新生成相似视频并合成;当用户需要完美复刻视频内容、语音克隆、视频风格迁移时使用
Source facts
- Repository
- huangserva/skill_video-style-analysis
- Last source activity
- April 21, 2026 at 04:00
- Detected SKILL.md language
- Chinese
- Stars
- 35
- Forks
- 9
Install options
The review-first prompt is selected by default. You can switch to a direct command or download a local copy.
Review the source files
Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.
Showing SKILL.md
SKILL.md
Source instructions · Read-only preview- name
- video-style-analysis
- description
- 完美复刻原视频的完整内容(画面+声音),通过智能体分析原视频的视觉风格和音频特征,生成风格提示词,使用TTS复刻配音,基于原画面重新生成相似视频并合成;当用户需要完美复刻视频内容、语音克隆、视频风格迁移时使用
- dependency
- {"python":["opencv-python","numpy","moviepy","Pillow","openai-whisper","edge-tts","aiohttp","pyyaml","insightface","onnxruntime"]}
# 视频完美复刻(智能体分析+TTS配音+音视频合成)
## 任务目标
- 本 Skill 用于:完美复刻原视频的完整内容,包括重新生成画面(保持高相似度)和克隆原视频的配音风格(音色、语调、节奏),并合成最终视频
- 能力包含:智能体视频分析(视觉+音频)、风格提示词生成、TTS配音生成、音视频合成
- 触发条件:用户需要完美复刻视频内容、克隆原视频配音风格、保持原故事情节和画面风格时使用
## 前置准备
- 依赖说明:确保已安装以下Python包
```
opencv-python
numpy
moviepy
Pillow
openai-whisper
```
---
## 核心理念
### ⭐ 多层视频语义分析:先粗判,再抽丝剥茧
**这套 Skill 不应该一上来就把视频压缩成一句 prompt。**
无论有没有 ASR,都必须先完成一个**逐层收敛**的分析过程:先判断视频属于什么内容机制,再判断画面里发生了什么,再抽取能帮助进一步判定的证据,最后才生成复刻约束。
**强制顺序:**
1. **媒体基线**:分辨率、横竖屏、时长、帧率、是否有音轨、是否有 OCR/字幕
2. **内容粗分类**:剧情 / 口播 / 纪录 / 教程 / 表演 / 训练 / 商品展示 / 氛围片
3. **场景语义骨架**:地点类型、空间结构、人数规模、主体组织方式、光线与环境
4. **主体与行为分析**:谁在画面里、在做什么、动作是同步还是对抗、是训练还是表演
5. **判别性证据提取**:服装、鞋子、道具、器材、文字、标识、屏幕内容
6. **子类收敛与复刻约束**:把“像运动”继续收敛到“训练 / 表演 / 比赛 / 排练”等,再写 prompt 和负约束
**原则**:
- 不允许从“多人 + 室内”直接跳成“多人活动现场”
- 不允许从“像跳舞”直接停住,必须继续检查动作、队形、服装、鞋子、文字、道具
- 先写**事实层**,再写**解释层**,最后才写**生成层**
- 每一层都要回答:`我看到了什么`、`这说明什么`、`还缺什么证据`
### 语义分析 6 层 16 维(通用)
#### Layer 0:媒体基线
- `媒体规格`:分辨率、比例、横竖屏、时长、帧率、清晰度
- `音频角色`:无人声 / 解说 / 对话 / 环境音 / 音乐主导 / 混合
#### Layer 1:内容机制判断
- `内容类型`:剧情、纪实、教程、舞台、训练、广告、旅行、产品、纯氛围
- `叙事驱动力`:ASR 驱动、视觉驱动、字幕驱动、音乐驱动,或混合驱动
#### Layer 2:场景语义骨架
- `地点与空间`:室内/室外、建筑类型、空间用途、景深与站位关系
- `时间与光线`:白天/夜晚、自然光/人工光、冷暖、硬光/漫射
- `主体规模`:单人、双人、小群体、大型群像
- `主体组织关系`:对话、协作、对抗、列队、围观、表演、教学
#### Layer 3:主体与行为
- `核心行为`:走、跑、跳、练、演、讲、做、展示、互动、操作
- `动作结构`:静态、重复动作、连续动作链、强爆发动作、同步动作
- `外观线索`:年龄段、性别倾向、服装类别、制服程度、发型、妆造
#### Layer 4:判别性证据
- `道具/器材/鞋服细节`:最能帮助子类判断的具体物件或穿着细节
- `文字与符号线索`:字幕、招牌、屏幕 UI、墙面文字、衣物印字、徽标
#### Layer 5:生成约束
- `构图与摄影`:景别、机位、构图、运镜、节奏
- `风格与氛围`:色调、质感、真实度、年代感、文化风格、情绪气候
- `复刻硬约束`:哪些必须保留,哪些不能错,哪些允许近似
**示例(抽象方法,不是写死舞蹈模板)**:
- 粗分类:室内多人同步活动
- 行为判断:重复抬步、队列训练、节奏一致
- 证据提取:统一服装、分趾舞鞋、木地板、墙面文字
- 子类收敛:群体基础舞步训练 / 民俗舞排练,而不是泛化成“多人运动”
### ⭐ ASR优先 + 分级容错机制
**关键洞察**:ASR语音识别不仅仅是"语音转文字",更是**理解视频叙事的关键步骤**。
**对比**:
| 方法 | 只看图像 | 图像+ASR |
|------|----------|----------|
| 角色数量 | 可能误判(如数出7个) | 准确(如实际2个) |
| 主角识别 | 不确定 | 立刻知道 |
| 叙事线 | 需要猜测 | 文本直接说明 |
| 角色关系 | 不清楚 | 明确 |
**因此**:当 ASR 有效时,ASR结果**指导**角色识别和叙事理解;但它不替代视觉语义分析,更不能跳过“粗分类 → 证据提取 → 子类收敛”。
**执行方式**:ASR步骤如主session环境无法安装Whisper,会自动启动sub-agent session执行。
---
### ⚠️ 分级容错机制
**问题**:不是所有视频都有音频,也不是所有音频都能提取到有效的叙事线。
**解决方案**:三级容错机制,自动降级处理。
#### Level 1:ASR成功 + 叙事线清晰(最佳)✅
**触发条件**:
- 视频有音频轨道
- ASR成功提取文本
- 文本包含明确的角色信息和叙事线
**处理方式**:
- 按标准流程:ASR → 叙事线分析 → 角色识别 → 视觉验证
- 输出高质量叙事分析
**示例**:完整剧情类短视频(含明确角色关系与叙事线)
---
#### Level 2:ASR成功但叙事线不清晰(次佳)⚠️
**触发条件**:
- 视频有音频轨道
- ASR成功提取文本
- 文本缺少明确角色信息或叙事线(如:环境音、音乐、片段式对话)
**处理方式**:
- **ASR辅助模式**:使用ASR时间戳作为场景边界
- **文本辅助**:提取关键词作为风格提示
- **降级到视觉分析**:主要依靠关键帧视觉分析
- **角色识别**:纯视觉推断 + ASR关键词辅助
**示例场景**:
- 旅游纪录片:ASR可能只有环境音,但时间戳可用于场景分割
- 美食视频:ASR可能只有烹饪声音,但可以提取场景节奏
---
#### Level 3:无ASR或ASR失败(兜底)🛡️
**触发条件**:
- 视频无音频轨道
- ASR完全失败(音频损坏、格式不支持等)
- 纯视觉视频
**处理方式**:
- **纯视觉分析模式**
- **场景分割**:完全依赖关键帧视觉差异
- **角色识别**:使用步骤1.5的 `character_detection.json`(InsightFace人脸嵌入聚类,即使换装也能匹配同一角色)
- **逐层视觉语义分析**:按“内容粗分类 → 主体行为 → 证据提取 → 子类判定 → 生成约束”执行
- **叙事线推断**:基于场景变化和动作序列推断,而不是直接猜主题
**风险提示**:
- 角色数量可能误判(如之前的7个 vs 实际2个)
- 叙事线可能不准确
- 需要用户确认角色识别结果
**示例场景**:
- 无声视频、动画视频、纯画面展示视频
---
### 自动降级流程
```python
def analyze_with_fallback(video_path):
"""
带容错的视频分析流程
"""
# 尝试提取音频
audio = extract_audio(video_path)
if audio is None:
# Level 3: 无音频
return pure_visual_analysis(video_path)
# 尝试ASR
asr_result = perform_asr(audio)
if asr_result is None or not asr_result["full_text"]:
# Level 3: ASR失败
return pure_visual_analysis(video_path)
# 尝试叙事线分析
narrative = analyze_narrative(asr_result["full_text"])
if narrative["clarity_score"] < 0.5:
# Level 2: 叙事线不清晰
return hybrid_analysis(video_path, asr_result, narrative)
# Level 1: 完整流程
return full_analysis_with_narrative(video_path, asr_result, narrative)
```
**输出标识**:
- 每个分析结果需包含 `analysis_level` 字段("level_1" / "level_2" / "level_3")
- Level 2/3 需增加 `confidence_warning` 字段,提示用户验证
---
## 操作步骤
### 阶段1:叙事理解(ASR优先)
#### 步骤1:智能关键帧提取
**执行方式:调用Python脚本**
```bash
python scripts/smart_keyframe_extractor.py \
--video_path <原视频路径> \
--output_dir output/keyframes/ \
--min_fps 2.0
```
**核心功能**:
- **场景切换检测**:识别场景边界(帧间像素差异阈值15%)
- **动作密度分析**:动作密集区域多提取,静态区域适度提取
- **均匀提取兜底**:每秒至少2帧,确保不遗漏重要镜头
**输出**:
- `output/keyframes/*.jpg` - 关键帧图像
- `output/keyframes/extraction_result.json` - 提取结果(场景列表、关键帧列表、视频信息)
---
#### 步骤1.5:角色检测与跨帧聚类
**执行方式:调用Python脚本(InsightFace)**
```bash
python scripts/character_detector.py \
--keyframes_dir output/keyframes/ \
--output_path output/analysis/character_detection.json \
--extraction_result output/keyframes/extraction_result.json \
--similarity_threshold 0.4
```
**核心功能**:
- **人脸检测**:使用InsightFace (buffalo_l) 检测每帧中的人脸及位置
- **特征提取**:提取512维人脸嵌入向量(ArcFace)
- **跨帧聚类**:余弦相似度贪心聚类(默认阈值0.4),即使换装也能通过人脸特征匹配同一角色
- **角色档案**:生成每个角色的出现帧列表、人脸/身体区域bbox、代表性面部裁切图
- **ASR整合**(可选):步骤3.5完成后,可带 `--narrative_path` 重新运行以将视觉角色与文本角色名关联
**为什么需要这一步**:
- 纯图像分析中,同一角色换装后会被误判为不同人
- ASR失败时,没有角色检测就只能靠Claude看图猜测
- 人脸嵌入在换装、换场景时仍然稳定,是最可靠的跨帧角色匹配方式
**输出**:
- `output/analysis/character_detection.json` - 角色检测与聚类结果
- `output/analysis/characters/char_N_face.jpg` - 每个角色的代表性面部裁切
**人数字段的正确理解**:
- `unique_characters` = **跨帧人脸聚类数**,它表示底层检测里聚成了多少张“可能是不同人”的脸,**不能直接当成现场人数**
- `frame_visible_people` = 对步骤1提取出的每张关键帧做一次 `单帧可见人数估计`
- `visible_people_stats.stable_visible_people_estimate` = 复刻链路默认使用的 **稳定可见人数估计**
- `scene_visible_people_stats` = 每个场景的人数统计,后续判断主体规模、群像策略、prompt 人数关系时优先用它
**输出示例**:
```json
{
"total_keyframes_analyzed": 10,
"total_faces_detected": 15,
"unique_characters": 2,
"visible_people_stats": {
"stable_visible_people_estimate": 2,
"min_visible_people": 1,
"max_visible_people": 2
},
"scene_visible_people_stats": [
{
"scene_id": 0,
"time_range": "0.0-5.0s",
"stable_visible_people_estimate": 2
}
],
"characters": [
{
"character_id": 0,
"label": "char_0",
"matched_name": null,
"appearance_count": 7,
"keyframe_indices": [0, 2, 3, 5, 6, 8, 9],
"scene_ids": [0, 1, 2, 3],
"face_bboxes": {"frame_0000.jpg": [120, 50, 220, 180]},
"body_bboxes": {"frame_0000.jpg": [80, 50, 260, 440]},
"representative_face_path": "output/analysis/characters/char_0_face.jpg",
"avg_det_score": 0.92
}
]
}
```
---
#### 步骤2:色彩与运动分析
**执行方式:调用Python脚本**
```bash
python scripts/video_analyzer.py \
--video_path <原视频路径> \
--output_path output/analysis/color_analysis.json
```
**分析内容**:
- **技术规格**:分辨率、帧率、时长、编码格式
- **色彩分布**:RGB均值、HSV特征、亮度、对比度
- **色调识别**:warm_red_orange, warm_yellow, green, cyan, blue, purple等
- **运动特征**:static, slow_movement, normal_movement, dynamic_fast等
**输出**:
- `output/analysis/color_analysis.json` - 色彩分析结果
---
#### 步骤3:ASR语音识别 ⭐ 核心步骤
**执行方式:调用Python脚本(自动提取音频+语音识别)**
```bash
python scripts/asr_transcriber.py \
--video_path <原视频路径> \
--output_path output/analysis/asr_result.json \
--model_size base \
--language zh \
--word_level
```
**自动执行流程**:
1. **音频提取**:使用ffmpeg从视频中提取音频轨道(16kHz, mono, WAV格式)
2. **语音识别**:使用Whisper模型将音频转为文本
3. **时间戳提取**:生成段落级和词级时间戳
**⚠️ 重要说明**:
- 如果主session环境无法安装Whisper库,会**自动启动sub-agent session执行**
- sub-agent session有独立环境,可以安装依赖并执行完整流程
- ASR结果返回后,主session继续后续步骤
**分析内容**:
- **语音转文本**:提取完整解说文本
- **时间戳提取**:段落级和词级时间戳(用于音画对齐)
- **叙事内容**:文本中包含的角色、身份、关系、叙事主题
**输出**:
- `output/audio/extracted_audio.wav` - 提取的音频文件
- `output/analysis/asr_result.json` - ASR识别结果
**输出示例**:
```json
{
"video_path": "原视频.mp4",
"language": "zh",
"full_text": "大家好,今天要分享的是...",
"duration": 45.2,
"segments": [
{
"id": 0,
"start": 0.0,
"end": 3.5,
"text": "大家好,今天要分享的是",
"words": [
{"word": "大家好", "start": 0.0, "end": 0.8, "confidence": 0.95}
]
}
],
"voice_style": {
"speed": {"chars_per_second": 3.2, "level": "中等"},
"pause": {"count": 5, "frequency": 1.1},
"estimated_tone": "温柔",
"estimated_emotion": "温暖"
}
}
```
---
#### 步骤3.5:叙事线分析 + 内容粗分类 ⭐ 关键步骤
**执行方式:审核初稿 + 智能体补充**
> **初稿已自动生成**:`output/analysis/narrative_analysis.json` 由 `draft_generator.py` 在阶段1结束时自动生成,包含从ASR文本提取的人名和按时间三等分的叙事弧线骨架。Claude 只需阅读 ASR 文本后,补充所有 `[TODO]` 占位符。
**核心理念**:先判断这条视频是“什么类型的内容”,再用 ASR 文本识别角色和叙事线,指导后续图像验证。
**分析内容**:
##### 3.5.1 内容粗分类(必须先做)
- 判断视频属于:剧情 / 口播 / 纪录 / 教程 / 表演 / 训练 / 商品展示 / 纯氛围
- 判断当前视频的主导理解方式:ASR 驱动 / 视觉驱动 / 字幕驱动 / 音乐驱动
- 如果 ASR 文本很弱,只把它当辅助信号,不允许强行编造完整剧情
##### 3.5.2 叙事主题识别
- 从文本识别故事类型(爱情/励志/纪录片/广告等)
- 识别叙事视角(第一人称"我"/第三人称)
- 识别情感基调(温暖/紧张/幽默/治愈等)
##### 3.5.3 角色识别(从文本)
- **主角识别**:文本中明确提到的主角是谁?
- **角色关系**:角色之间是什么关系?(情侣/朋友/家人等)
- **角色身份**:角色的真实身份是什么?(富豪/普通人/企业家等)
##### 3.5.4 叙事弧线
- **起**:故事的开端(0-?秒)
- **承**:故事的发展(?-?秒)
- **转**:故事的转折(?-?秒)
- **合**:故事的结局(?-?秒)
**输出**:
- `output/analysis/narrative_analysis.json` - 叙事线分析结果
**示例输出**(中性占位示例,仅演示结构):
```json
{
"narrative_theme": "都市人物关系变化故事",
"narrator": "第一人称主角(女性)",
"characters_from_text": [
{
"name": "角色甲",
"role": "主要对手戏角色,表面身份普通",
"identity": "隐藏真实背景"
},
{
"name": "叙述者(我)",
"role": "第一人称主角",
"identity": "故事推动者"
}
],
"narrative_arc": {
View on GitHubThis SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub