更新文档系统归并优化方案
This commit is contained in:
375
tools/content-generation/short_video_generator.py
Normal file
375
tools/content-generation/short_video_generator.py
Normal file
@@ -0,0 +1,375 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
短视频脚本生成器 - 胡汉三千年项目
|
||||
自动生成适合短视频平台的科普内容
|
||||
"""
|
||||
|
||||
import json
|
||||
import random
|
||||
from datetime import datetime
|
||||
|
||||
class ShortVideoGenerator:
|
||||
def __init__(self):
|
||||
self.sound_roots = {
|
||||
'K': {'meaning': '空性', 'examples': ['空', '孔', '恐', '哭'], 'color': '#FF6B6B'},
|
||||
'M': {'meaning': '母性', 'examples': ['母', '妈', '妹', '妙'], 'color': '#4ECDC4'},
|
||||
'Y': {'meaning': '秩序', 'examples': ['玉', '约', '仪', '义'], 'color': '#45B7D1'},
|
||||
'L': {'meaning': '流动', 'examples': ['流', '路', '旅', '龙'], 'color': '#96CEB4'},
|
||||
'D': {'meaning': '父权', 'examples': ['爹', '大', '帝', '德'], 'color': '#FFEAA7'}
|
||||
}
|
||||
|
||||
self.story_templates = [
|
||||
{
|
||||
"title": "震惊!摩西和墨子竟是'兄弟'?",
|
||||
"hook": "一个在中东,一个在中国,相隔万里却惊人相似!",
|
||||
"content": "他们都姓'M'音,都主张'逃离压迫',都创立了自己的思想体系...这不是巧合,而是文明密码在起作用!",
|
||||
"reveal": "原来他们都属于'逃离K文明'的同一模式!",
|
||||
"conclusion": "文明密码理论告诉我们:人类各文明其实有共同的'基因'!"
|
||||
},
|
||||
{
|
||||
"title": "北魏皇帝为什么都活不长?",
|
||||
"hook": "平均年龄只有29岁!这背后隐藏着惊人的历史密码...",
|
||||
"content": "北魏皇帝普遍年轻死亡,生育压力巨大,催生了生殖崇拜文化...",
|
||||
"reveal": "这种文化通过政治、宗教渠道传播到日本,影响了整个东亚!",
|
||||
"conclusion": "这就是文明传播的力量:一个帝国的悲剧,改变了整个地区的文化!"
|
||||
},
|
||||
{
|
||||
"title": "Kashmir和Jerusalem有什么联系?",
|
||||
"hook": "两个看似不相关的地方,地名里却藏着相同的密码!",
|
||||
"content": "Kashmir的'K'音,Jerusalem的'J'音,都代表着某种文明的原型...",
|
||||
"reveal": "它们都是文明冲突的焦点,因为都处在音根文明的交汇点上!",
|
||||
"conclusion": "理解文明密码,就能理解为什么这些地方总是冲突不断!"
|
||||
}
|
||||
]
|
||||
|
||||
self.platform_configs = {
|
||||
'douyin': {
|
||||
'max_duration': 60,
|
||||
'style': '快节奏、强情绪、视觉冲击',
|
||||
'hashtags': ['#文明密码', '#历史揭秘', '#文化研究', '#惊人发现'],
|
||||
'target_audience': '年轻用户,喜欢新奇内容'
|
||||
},
|
||||
'bilibili': {
|
||||
'max_duration': 180,
|
||||
'style': '知识性强、逻辑清晰、有深度',
|
||||
'hashtags': ['#文明密码理论', '#音韵考古学', '#文化传播', '#历史研究'],
|
||||
'target_audience': '知识青年,学生群体'
|
||||
},
|
||||
'xiaohongshu': {
|
||||
'max_duration': 120,
|
||||
'style': '文艺范、视觉冲击、生活方式',
|
||||
'hashtags': ['#文化分享', '#历史美学', '#知识科普', '#文明对话'],
|
||||
'target_audience': '文艺青年,女性用户'
|
||||
}
|
||||
}
|
||||
|
||||
def generate_script(self, topic=None, platform='douyin', style='story'):
|
||||
"""生成短视频脚本"""
|
||||
|
||||
if topic is None:
|
||||
topic = random.choice(list(self.sound_roots.keys()))
|
||||
|
||||
if style == 'story':
|
||||
template = random.choice(self.story_templates)
|
||||
else:
|
||||
template = self.create_educational_template(topic)
|
||||
|
||||
config = self.platform_configs[platform]
|
||||
|
||||
script = {
|
||||
'metadata': {
|
||||
'topic': topic,
|
||||
'platform': platform,
|
||||
'style': style,
|
||||
'duration': config['max_duration'],
|
||||
'created_at': datetime.now().isoformat()
|
||||
},
|
||||
'content': self.build_script_content(template, config),
|
||||
'visual_instructions': self.generate_visual_instructions(template, config),
|
||||
'engagement_elements': self.add_engagement_elements(config)
|
||||
}
|
||||
|
||||
return script
|
||||
|
||||
def create_educational_template(self, topic):
|
||||
"""创建教育性模板"""
|
||||
sound_info = self.sound_roots.get(topic, self.sound_roots['K'])
|
||||
|
||||
return {
|
||||
"title": f"揭秘{sound_info['meaning']}文明密码:{topic}音的奥秘",
|
||||
"hook": f"为什么世界上很多语言都有'{topic}'音?这不是偶然!",
|
||||
"content": f"'{topic}'音代表{sound_info['meaning']},在{', '.join(sound_info['examples'][:2])}等字中都能看到...",
|
||||
"reveal": f"这种音根分布全球,说明人类文明有共同的'基因密码'!",
|
||||
"conclusion": "理解音根理论,就能理解为什么不同文化有这么多相似之处!"
|
||||
}
|
||||
|
||||
def build_script_content(self, template, config):
|
||||
"""构建脚本内容"""
|
||||
content = []
|
||||
|
||||
# 标题和钩子
|
||||
content.append(f"【标题】{template['title']}")
|
||||
content.append(f"【开场钩子】{template['hook']}")
|
||||
content.append("")
|
||||
|
||||
# 主要内容
|
||||
content.append("【正文内容】")
|
||||
content.append(template['content'])
|
||||
content.append("")
|
||||
|
||||
# 揭秘时刻
|
||||
content.append("【反转揭秘】")
|
||||
content.append(template['reveal'])
|
||||
content.append("")
|
||||
|
||||
# 结论
|
||||
content.append("【总结升华】")
|
||||
content.append(template['conclusion'])
|
||||
content.append("")
|
||||
|
||||
# 平台特定元素
|
||||
platform = config.get('platform', 'douyin')
|
||||
if platform == 'douyin':
|
||||
content.append("【抖音特效建议】")
|
||||
content.append("- 开场:快速切换的历史地图动画")
|
||||
content.append("- 中段:文明传播路径的动态线条")
|
||||
content.append("- 结尾:音根字母飞入画面的特效")
|
||||
elif platform == 'bilibili':
|
||||
content.append("【B站元素建议】")
|
||||
content.append("- 添加弹幕互动点")
|
||||
content.append("- 插入历史纪录片片段")
|
||||
content.append("- 评论区引导讨论")
|
||||
elif platform == 'xiaohongshu':
|
||||
content.append("【小红书风格】")
|
||||
content.append("- 配图文案要文艺")
|
||||
content.append("- 添加emoji表情")
|
||||
content.append("- 结尾要有互动提问")
|
||||
|
||||
content.append("")
|
||||
content.append("【标签建议】")
|
||||
content.append("#文明密码 #历史揭秘 #音根理论 #文明传播 #冷知识")
|
||||
|
||||
return "\n".join(content)
|
||||
|
||||
|
||||
# 根据平台调整语速和停顿
|
||||
if config['platform'] == 'douyin':
|
||||
pace = "快速、有冲击力"
|
||||
pauses = "短暂停顿,保持节奏"
|
||||
else:
|
||||
pace = "适中、清晰表达"
|
||||
pauses = "适当停顿,让观众思考"
|
||||
|
||||
content = {
|
||||
'opening': {
|
||||
'time': "0-3秒",
|
||||
'text': template['hook'],
|
||||
'delivery': f"{pace},{pauses}",
|
||||
'visual': "震撼画面,快速切换"
|
||||
},
|
||||
'body': {
|
||||
'time': "3-45秒",
|
||||
'text': template['content'],
|
||||
'delivery': f"{pace},重点词重读",
|
||||
'visual': "图表展示,动画效果"
|
||||
},
|
||||
'reveal': {
|
||||
'time': "45-55秒",
|
||||
'text': template['reveal'],
|
||||
'delivery': "神秘语气,制造悬念",
|
||||
'visual': "高潮画面,音乐配合"
|
||||
},
|
||||
'conclusion': {
|
||||
'time': "55-60秒",
|
||||
'text': template['conclusion'],
|
||||
'delivery': "坚定有力,引发思考",
|
||||
'visual': "总结画面,品牌露出"
|
||||
}
|
||||
}
|
||||
|
||||
return content
|
||||
|
||||
def generate_visual_instructions(self, template, config):
|
||||
"""生成视觉指导"""
|
||||
platform = config.get('platform', 'douyin')
|
||||
duration = config.get('duration', 60)
|
||||
|
||||
instructions = []
|
||||
instructions.append("=== 视觉指导 ===")
|
||||
instructions.append(f"平台:{platform}")
|
||||
instructions.append(f"时长:{duration}秒")
|
||||
instructions.append("")
|
||||
|
||||
if platform == 'douyin':
|
||||
instructions.append("【抖音视觉风格】")
|
||||
instructions.append("- 快节奏剪辑,每3-5秒一个画面切换")
|
||||
instructions.append("- 使用动态地图展示文明传播路径")
|
||||
instructions.append("- 添加音效增强悬疑感")
|
||||
instructions.append("- 文字要大而醒目")
|
||||
|
||||
elif platform == 'bilibili':
|
||||
instructions.append("【B站视觉风格】")
|
||||
instructions.append("- 可以稍慢节奏,注重内容深度")
|
||||
instructions.append("- 添加学术图表和数据可视化")
|
||||
instructions.append("- 鼓励弹幕互动")
|
||||
instructions.append("- 结尾引导关注和讨论")
|
||||
|
||||
elif platform == 'xiaohongshu':
|
||||
instructions.append("【小红书视觉风格】")
|
||||
instructions.append("- 文艺清新的配色")
|
||||
instructions.append("- 手写风格的文字")
|
||||
instructions.append("- 添加emoji和装饰元素")
|
||||
instructions.append("- 营造知识分享的温暖氛围")
|
||||
|
||||
return "\n".join(instructions)
|
||||
|
||||
|
||||
instructions = {
|
||||
'color_scheme': "暖色调为主,营造神秘感",
|
||||
'text_style': "大字体,关键词高亮",
|
||||
'animation': "渐变、缩放、旋转等动态效果",
|
||||
'transitions': "快节奏切换,保持视觉冲击",
|
||||
'sound_effects': "神秘音乐,关键时刻音效",
|
||||
'visual_elements': [
|
||||
"世界地图动画",
|
||||
"音根分布图",
|
||||
"历史人物对比",
|
||||
"文明传播路径",
|
||||
"密码破译效果"
|
||||
]
|
||||
}
|
||||
|
||||
if config['platform'] == 'douyin':
|
||||
instructions['special_effects'] = "抖音特效,滤镜使用"
|
||||
elif config['platform'] == 'bilibili':
|
||||
instructions['special_effects'] = "科普动画,数据可视化"
|
||||
|
||||
return instructions
|
||||
|
||||
def add_engagement_elements(self, config):
|
||||
"""添加互动元素"""
|
||||
|
||||
elements = {
|
||||
'call_to_action': "点赞关注,了解更多文明密码",
|
||||
'interactive_questions': [
|
||||
"你还知道哪些相似的历史人物?",
|
||||
"你觉得这个理论有道理吗?",
|
||||
"想看哪个文明的密码解析?"
|
||||
],
|
||||
'hashtags': config['hashtags'],
|
||||
'comment_prompts': [
|
||||
"评论区分享你的看法",
|
||||
"@好友一起来看历史真相",
|
||||
"留言告诉我你还想了解什么"
|
||||
]
|
||||
}
|
||||
|
||||
return elements
|
||||
|
||||
def batch_generate_scripts(self, count=5, platform='douyin'):
|
||||
"""批量生成脚本"""
|
||||
|
||||
scripts = []
|
||||
topics = list(self.sound_roots.keys())
|
||||
|
||||
for i in range(count):
|
||||
topic = topics[i % len(topics)]
|
||||
style = random.choice(['story', 'educational'])
|
||||
script = self.generate_script(topic, platform, style)
|
||||
scripts.append(script)
|
||||
|
||||
return scripts
|
||||
|
||||
def export_scripts(self, scripts, filename_prefix='civilization_password'):
|
||||
"""导出脚本到文件"""
|
||||
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
|
||||
|
||||
# 导出JSON格式
|
||||
json_filename = f"{filename_prefix}_scripts_{timestamp}.json"
|
||||
with open(json_filename, 'w', encoding='utf-8') as f:
|
||||
json.dump(scripts, f, ensure_ascii=False, indent=2)
|
||||
|
||||
# 导出文本格式
|
||||
txt_filename = f"{filename_prefix}_scripts_{timestamp}.txt"
|
||||
with open(txt_filename, 'w', encoding='utf-8') as f:
|
||||
for i, script in enumerate(scripts, 1):
|
||||
f.write(f"=== 脚本 {i} ===\n")
|
||||
f.write(f"主题: {script['metadata']['topic']}\n")
|
||||
f.write(f"平台: {script['metadata']['platform']}\n")
|
||||
f.write(f"风格: {script['metadata']['style']}\n\n")
|
||||
|
||||
for section, content in script['content'].items():
|
||||
f.write(f"【{section}】\n")
|
||||
f.write(f"时间: {content['time']}\n")
|
||||
f.write(f"内容: {content['text']}\n")
|
||||
f.write(f"表现: {content['delivery']}\n")
|
||||
f.write(f"视觉: {content['visual']}\n\n")
|
||||
|
||||
f.write("-" * 50 + "\n\n")
|
||||
|
||||
print(f"✅ 脚本已导出:")
|
||||
print(f" JSON格式: {json_filename}")
|
||||
print(f" 文本格式: {txt_filename}")
|
||||
|
||||
return json_filename, txt_filename
|
||||
|
||||
def create_content_calendar():
|
||||
"""创建内容发布日历"""
|
||||
|
||||
calendar = {
|
||||
"周一": "音根理论科普日 - 介绍不同音根的含义",
|
||||
"周二": "历史人物对比日 - 展示相似人物的模式",
|
||||
"周三": "地名密码解析日 - 分析地名的音根含义",
|
||||
"周四": "文明传播路径日 - 展示文化传播过程",
|
||||
"周五": "互动问答日 - 回答粉丝问题",
|
||||
"周六": "深度解析日 - 详细讲解复杂理论",
|
||||
"周日": "总结回顾日 - 总结一周内容"
|
||||
}
|
||||
|
||||
return calendar
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 创建生成器
|
||||
generator = ShortVideoGenerator()
|
||||
|
||||
# 生成示例脚本
|
||||
print("=== 生成示例脚本 ===")
|
||||
sample_script = generator.generate_script(platform='douyin', style='story')
|
||||
print(f"主题: {sample_script['metadata']['topic']}")
|
||||
print(f"平台: {sample_script['metadata']['platform']}")
|
||||
print(f"风格: {sample_script['metadata']['style']}")
|
||||
print("\n脚本内容:")
|
||||
print(sample_script['content'])
|
||||
print("\n" + "="*50)
|
||||
|
||||
# 生成批量内容
|
||||
print("\n=== 生成批量内容 ===")
|
||||
batch_scripts = generator.generate_batch_scripts(platforms=['douyin', 'bilibili'], count=2)
|
||||
|
||||
for i, script in enumerate(batch_scripts, 1):
|
||||
print(f"\n脚本 {i}:")
|
||||
print(f"主题: {script['topic']}")
|
||||
print(f"平台: {script['platform']}")
|
||||
print(f"风格: {script['style']}")
|
||||
print("内容预览:")
|
||||
# 显示内容的前几行
|
||||
content_lines = script['content'].split('\n')[:5]
|
||||
for line in content_lines:
|
||||
print(f" {line}")
|
||||
print(" ...")
|
||||
|
||||
# 生成内容日历
|
||||
print("\n=== 内容日历 ===")
|
||||
calendar = generator.generate_content_calendar(days=7)
|
||||
for day, content in calendar.items():
|
||||
print(f"{day}: {content}")
|
||||
|
||||
print(f"\n🎉 短视频脚本生成完成!")
|
||||
print(f"共生成 {len(scripts)} 个脚本")
|
||||
print(f"文件已保存到: {json_file} 和 {txt_file}")
|
||||
print("\n💡 使用建议:")
|
||||
print("1. 根据平台特点调整脚本长度和风格")
|
||||
print("2. 结合热点话题增加关注度")
|
||||
print("3. 定期分析数据优化内容策略")
|
||||
print("4. 与粉丝互动提高参与度")
|
||||
Reference in New Issue
Block a user