Skip to main content

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 GitHub
This SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub