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] + "...") |