194 lines
6.2 KiB
Python
194 lines
6.2 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
"""
|
|||
|
|
导演编辑提示词生成器
|
|||
|
|
整合OCR字幕和Whisper口播时间轴,生成专业视频脚本
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
def generate_director_prompt(ocr_timeline, whisper_timeline, video_info=None):
|
|||
|
|
"""
|
|||
|
|
生成导演编辑提示词
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
ocr_timeline: OCR字幕时间轴数据
|
|||
|
|
whisper_timeline: Whisper口播时间轴数据
|
|||
|
|
video_info: 视频基本信息(可选)
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
str: 导演编辑提示词
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
prompt = f"""
|
|||
|
|
# 导演编辑任务:视频脚本整合与优化
|
|||
|
|
|
|||
|
|
## 任务背景
|
|||
|
|
您是一位经验丰富的视频导演和编辑,需要基于以下两个时间轴数据,为视频创作一个完整、流畅的脚本。
|
|||
|
|
|
|||
|
|
## 输入数据
|
|||
|
|
|
|||
|
|
### OCR字幕时间轴(视觉文字内容)
|
|||
|
|
{ocr_timeline}
|
|||
|
|
|
|||
|
|
### Whisper口播时间轴(音频内容)
|
|||
|
|
{whisper_timeline}
|
|||
|
|
|
|||
|
|
{video_info if video_info else ""}
|
|||
|
|
|
|||
|
|
## 导演编辑要求
|
|||
|
|
|
|||
|
|
### 1. 内容整合策略
|
|||
|
|
- **时间同步**:将OCR字幕与Whisper口播按时间轴精确对齐
|
|||
|
|
- **内容互补**:识别字幕与口播的重复、补充和差异部分
|
|||
|
|
- **信息完整性**:确保重要信息不遗漏,避免重复冗余
|
|||
|
|
|
|||
|
|
### 2. 脚本结构设计
|
|||
|
|
- **开场设计**:基于前3秒内容设计引人入胜的开场
|
|||
|
|
- **节奏控制**:根据时间轴密度调整内容节奏
|
|||
|
|
- **高潮设置**:识别关键信息点,设计内容高潮
|
|||
|
|
- **结尾收束**:基于最后内容设计有力结尾
|
|||
|
|
|
|||
|
|
### 3. 语言风格优化
|
|||
|
|
- **口语化处理**:将OCR识别文字转换为自然口语表达
|
|||
|
|
- **情感表达**:根据内容调整语调、语速和情感色彩
|
|||
|
|
- **文化适配**:考虑目标受众,调整表达方式
|
|||
|
|
|
|||
|
|
### 4. 视觉与音频协调
|
|||
|
|
- **字幕时机**:优化字幕出现时机,与音频节奏配合
|
|||
|
|
- **重点突出**:识别关键信息,在脚本中重点标注
|
|||
|
|
- **转场设计**:设计自然的内容转场和过渡
|
|||
|
|
|
|||
|
|
## 输出格式要求
|
|||
|
|
|
|||
|
|
请按以下格式输出脚本:
|
|||
|
|
|
|||
|
|
### 完整脚本
|
|||
|
|
```
|
|||
|
|
[时间戳] [角色/场景] [内容]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 脚本分析
|
|||
|
|
- **内容概览**:简要总结视频核心内容
|
|||
|
|
- **关键信息点**:列出3-5个最重要的信息
|
|||
|
|
- **目标受众**:分析适合的观众群体
|
|||
|
|
- **传播建议**:提供传播和推广建议
|
|||
|
|
|
|||
|
|
### 技术参数
|
|||
|
|
- **总时长**:基于时间轴计算
|
|||
|
|
- **内容密度**:评估信息密度是否合适
|
|||
|
|
- **节奏分析**:分析内容节奏变化
|
|||
|
|
|
|||
|
|
## 创作原则
|
|||
|
|
1. **真实性**:保持原始内容的真实性,不添加虚构信息
|
|||
|
|
2. **流畅性**:确保脚本逻辑清晰,表达流畅
|
|||
|
|
3. **吸引力**:增强内容的吸引力和传播性
|
|||
|
|
4. **专业性**:体现专业导演的编辑水平
|
|||
|
|
|
|||
|
|
请基于以上要求,创作一个完整、专业的视频脚本。
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
return prompt
|
|||
|
|
|
|||
|
|
def format_timeline_for_prompt(timeline_data, timeline_type):
|
|||
|
|
"""
|
|||
|
|
格式化时间轴数据用于提示词
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
timeline_data: 时间轴数据
|
|||
|
|
timeline_type: 时间轴类型 ("OCR" 或 "Whisper")
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
str: 格式化的时间轴文本
|
|||
|
|
"""
|
|||
|
|
if timeline_type == "OCR":
|
|||
|
|
formatted = "OCR字幕识别结果:\n"
|
|||
|
|
for entry in timeline_data:
|
|||
|
|
timestamp = entry.get('timestamp', 0)
|
|||
|
|
contents = entry.get('contents', [])
|
|||
|
|
formatted += f"时间点 {timestamp:.2f}s:\n"
|
|||
|
|
for content in contents:
|
|||
|
|
text = content.get('text', '')
|
|||
|
|
bbox = content.get('bbox', [])
|
|||
|
|
formatted += f" - 文字: '{text}'\n"
|
|||
|
|
if bbox:
|
|||
|
|
formatted += f" 位置: {bbox}\n"
|
|||
|
|
formatted += "\n"
|
|||
|
|
|
|||
|
|
elif timeline_type == "Whisper":
|
|||
|
|
formatted = "Whisper语音识别结果:\n"
|
|||
|
|
for i, entry in enumerate(timeline_data):
|
|||
|
|
start_time = entry.get('start', 0)
|
|||
|
|
end_time = entry.get('end', 0)
|
|||
|
|
text = entry.get('text', '')
|
|||
|
|
formatted += f" id:{i}, start:{start_time:.2f}, end:{end_time:.2f}, text:{text}\n"
|
|||
|
|
|
|||
|
|
return formatted
|
|||
|
|
|
|||
|
|
def create_video_script_prompt(ocr_json_path, whisper_data=None):
|
|||
|
|
"""
|
|||
|
|
创建完整的视频脚本提示词
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
ocr_json_path: OCR JSON文件路径
|
|||
|
|
whisper_data: Whisper识别数据(可选)
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
str: 完整的导演编辑提示词
|
|||
|
|
"""
|
|||
|
|
# 读取OCR数据
|
|||
|
|
from pre_data_1 import read_json_file, format_ocr_json
|
|||
|
|
|
|||
|
|
ocr_data = read_json_file(ocr_json_path)
|
|||
|
|
if not ocr_data:
|
|||
|
|
return "错误:无法读取OCR数据文件"
|
|||
|
|
|
|||
|
|
# 格式化OCR时间轴
|
|||
|
|
_, subtitle_array = format_ocr_json(ocr_data)
|
|||
|
|
ocr_timeline = format_timeline_for_prompt(subtitle_array, "OCR")
|
|||
|
|
|
|||
|
|
# 格式化Whisper时间轴(如果有)
|
|||
|
|
whisper_timeline = ""
|
|||
|
|
if whisper_data:
|
|||
|
|
whisper_timeline = format_timeline_for_prompt(whisper_data, "Whisper")
|
|||
|
|
else:
|
|||
|
|
whisper_timeline = "(暂无Whisper数据)"
|
|||
|
|
|
|||
|
|
# 视频基本信息
|
|||
|
|
video_info = f"""
|
|||
|
|
### 视频基本信息
|
|||
|
|
- 文件路径: {ocr_json_path}
|
|||
|
|
- OCR引擎: {ocr_data.get('ocr_engine', 'Unknown')}
|
|||
|
|
- 视频时长: {ocr_data.get('duration', 0):.2f}秒
|
|||
|
|
- 视频分辨率: {ocr_data.get('frame_width', 0)}x{ocr_data.get('frame_height', 0)}
|
|||
|
|
- 视频帧率: {ocr_data.get('fps', 0):.2f}FPS
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
# 生成导演提示词
|
|||
|
|
prompt = generate_director_prompt(ocr_timeline, whisper_timeline, video_info)
|
|||
|
|
|
|||
|
|
return prompt
|
|||
|
|
|
|||
|
|
# 示例使用
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
# 示例Whisper数据(实际使用时应该从文件读取)
|
|||
|
|
example_whisper_data = [
|
|||
|
|
{"start": 0.00, "end": 1.80, "text": "潑水街不只有云南"},
|
|||
|
|
{"start": 1.80, "end": 3.56, "text": "老窝更远更传统"},
|
|||
|
|
{"start": 3.56, "end": 5.64, "text": "快来接触这份湿身快乐"},
|
|||
|
|
# ... 更多数据
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
# 生成提示词
|
|||
|
|
prompt = create_video_script_prompt(
|
|||
|
|
"/root/autodl-tmp/new_cnocr/老挝泼水节_subtitles.json",
|
|||
|
|
example_whisper_data
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 保存提示词到文件
|
|||
|
|
import os
|
|||
|
|
output_path = "/root/autodl-tmp/new_cnocr/director_prompt.txt"
|
|||
|
|
with open(output_path, 'w', encoding='utf-8') as f:
|
|||
|
|
f.write(prompt)
|
|||
|
|
|
|||
|
|
print(f"导演编辑提示词已保存到: {output_path}")
|
|||
|
|
print("\n提示词预览(前500字符):")
|
|||
|
|
print(prompt[:500] + "...")
|