hot_video_analyse/code/director_prompt.py

194 lines
6.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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