hot_video_analyse/code/api_video_template_analyzer.py

255 lines
7.1 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from openai import OpenAI
import os
import base64
import json
import time
from datetime import datetime
def encode_video(video_path):
"""编码视频文件为base64"""
with open(video_path, "rb") as video_file:
return base64.b64encode(video_file.read()).decode("utf-8")
def encode_audio(audio_path):
"""编码音频文件为base64"""
with open(audio_path, "rb") as audio_file:
return base64.b64encode(audio_file.read()).decode("utf-8")
def analyze_douyin_template(video_path, audio_path=None, output_file=None):
"""
专门分析抖音热门视频模板的函数
"""
STREAM_MODE = True
# 编码视频文件
print("正在编码视频文件...")
base64_video = encode_video(video_path)
# 编码音频文件(如果提供)
content_list = [
{
"type": "video_url",
"video_url": {"url": f"data:video/mp4;base64,{base64_video}"},
}
]
if audio_path and os.path.exists(audio_path):
print("正在编码音频文件...")
base64_audio = encode_audio(audio_path)
content_list.append({
"type": "audio_url",
"audio_url": {"url": f"data:audio/wav;base64,{base64_audio}"},
})
# 专业的抖音模板分析提示词
template_analysis_prompt = """🎯 **抖音热门视频模板分析专家**
请按照以下专业框架分析这个视频的热门模板和套路
## 📱 一、Hook勾子分析前3-5秒
### 勾子类型识别:
1. **好奇类勾子**
- "**是一种什么体验"
- "如何不**也能**"
- "如果你**,你会怎么样"
2. **借势类勾子**
- "曾经被某人**,如今却**"
- "某**大火,我却关心**"
- "某明星都在用的**"
3. **痛点式勾子**
- "为什么**,却**"
- "不知道**?一定要**"
- "最新**,你不会不知道吧"
4. **极限式勾子**
- "这是全网最**"
- "**一定要**"
- "99%的人都不知道的**"
5. **恐吓式勾子**
- "**揭密,千万不要**"
- "如果你再不**,就会**"
- "**将迎来**,赶紧**"
## 🎵 二、BGM模板分析
- 是否使用热门音乐
- 音乐类型和情绪
- 与内容的匹配度
## 🎬 三、视频结构模板
- **知识类**: 问题解决方案效果引导
- **剧情类**: 冲突发展反转结局
- **测评类**: 展示使用对比推荐
- **生活类**: 日常亮点感悟互动
## 📝 四、文案套路
- 标题党元素
- 互动引导语
- 情绪触发词
## 🔥 五、爆款元素
- 反差萌
- 共鸣点
- 争议性
- 实用性
- 娱乐性
请严格按照以下JSON格式输出分析结果不要添加```json```标记
{
"hook_analysis": {
"hook_type": "具体的勾子类型",
"hook_formula": "使用的具体公式",
"hook_content": "视频中实际的勾子内容",
"hook_timing": "勾子出现的时间段",
"effectiveness_score": 8
},
"bgm_analysis": {
"has_bgm": true,
"bgm_type": "热门音乐/原创/无音乐",
"music_style": "音乐风格",
"emotion_match": "与内容情绪匹配度",
"trend_alignment": "是否符合当前热门趋势"
},
"video_structure": {
"category": "知识类/剧情类/测评类/生活类",
"structure_pattern": "具体的结构模板",
"time_breakdown": {
"0-3s": "开头内容",
"3-10s": "主体内容",
"10-15s": "结尾内容"
}
},
"copywriting_strategy": {
"title_elements": ["标题中的关键元素"],
"interaction_guides": ["互动引导语"],
"emotional_triggers": ["情绪触发词"]
},
"viral_elements": {
"key_factors": ["主要爆款因素"],
"uniqueness": "独特性分析",
"shareability": "分享传播价值"
},
"template_summary": {
"main_template": "主要模板类型",
"success_probability": "85%",
"replication_difficulty": "复制难度评估",
"optimization_suggestions": ["具体优化建议"]
}
}
请开始分析"""
content_list.append({
"type": "text",
"text": template_analysis_prompt
})
# 初始化客户端
client = OpenAI(
api_key="EMPTY",
base_url="http://localhost:8000/v1",
)
print(f"\n开始分析抖音视频模板...")
print(f"Content项目数量: {len(content_list)}")
print("="*60)
start_time = time.time()
# 发送请求
completion = client.chat.completions.create(
model="/root/autodl-tmp/llm",
messages=[
{
"role": "system",
"content": [{"type":"text","text": "You are a professional Douyin/TikTok viral video template analyzer."}]
},
{
"role": "user",
"content": content_list
}
],
stream=STREAM_MODE,
stream_options={"include_usage": True} if STREAM_MODE else None,
)
# 处理流式响应
if STREAM_MODE:
full_response = ""
usage_info = None
print("🎯 抖音模板分析结果:")
print("-" * 40)
for chunk in completion:
if chunk.choices:
delta = chunk.choices[0].delta
if delta.content:
full_response += delta.content
print(delta.content, end='', flush=True)
else:
usage_info = chunk.usage
end_time = time.time()
print("\n" + "="*60)
print("✅ 分析完成!")
print(f"⏱️ 耗时: {end_time - start_time:.2f}")
if usage_info:
print(f"📊 Token使用: {usage_info}")
# 保存结果
if output_file:
result_data = {
"timestamp": datetime.now().isoformat(),
"video_path": video_path,
"analysis_result": full_response,
"usage": str(usage_info) if usage_info else None,
"processing_time": end_time - start_time
}
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(result_data, f, ensure_ascii=False, indent=2)
print(f"💾 结果已保存到: {output_file}")
return full_response
else:
result = completion.choices[0].message.content
print("🎯 抖音模板分析结果:")
print("="*50)
print(result)
return result
def main():
"""主函数"""
# 配置文件路径
video_path = "/root/autodl-tmp/hot_video_analyse/source/sample_demo_2.mp4"
audio_path = "/root/autodl-tmp/hot_video_analyse/source/transcription/sample_demo_1_audio.wav"
# 输出文件
output_file = f"douyin_template_analysis_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
# 执行分析
result = analyze_douyin_template(
video_path=video_path,
audio_path=audio_path,
output_file=output_file
)
print(f"\n{'='*60}")
print("🎉 抖音热门视频模板分析完成!")
if __name__ == "__main__":
main()