Ryanus commited on
Commit
746bc44
·
verified ·
1 Parent(s): 70a1728

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +439 -168
app.py CHANGED
@@ -1,222 +1,493 @@
1
  import gradio as gr
2
  import os
3
  import tempfile
4
- import subprocess
5
- import shutil
6
- from pathlib import Path
7
- import sys
8
 
9
- def setup_environment():
10
- """設置環境"""
 
 
 
 
 
11
  try:
12
- # 確保系統包已安裝
13
- subprocess.run(["which", "ffmpeg"], check=True, capture_output=True)
14
- print("✅ FFmpeg已安裝")
15
- except subprocess.CalledProcessError:
16
- print("⚠️ FFmpeg未找到,但Docker鏡像應該已包含")
17
 
18
- def clone_repo():
19
- """克隆項目倉庫"""
20
- repo_url = "https://github.com/SamurAIGPT/AI-Youtube-Shorts-Generator.git"
21
- repo_dir = "./AI-Youtube-Shorts-Generator"
22
-
23
- if os.path.exists(repo_dir):
24
- shutil.rmtree(repo_dir)
25
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  try:
27
- subprocess.run(["git", "clone", repo_url, repo_dir],
28
- check=True, capture_output=True, text=True)
29
- return repo_dir, "✅ 項目克隆成功"
30
- except subprocess.CalledProcessError as e:
31
- return None, f"❌ 克隆失敗: {e.stderr}"
32
-
33
- def install_project_deps(repo_dir):
34
- """安裝項目依賴"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  try:
36
- # 進入項目目錄安裝依賴
37
- original_dir = os.getcwd()
38
- os.chdir(repo_dir)
39
-
40
- # 檢查是否有requirements.txt
41
- if os.path.exists("requirements.txt"):
42
- result = subprocess.run([
43
- sys.executable, "-m", "pip", "install", "-r", "requirements.txt"
44
- ], capture_output=True, text=True, timeout=180)
45
-
46
- if result.returncode != 0:
47
- os.chdir(original_dir)
48
- return False, f"依賴安裝失敗: {result.stderr}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
 
50
- os.chdir(original_dir)
51
- return True, "✅ 項目依賴安裝成功"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
 
 
53
  except Exception as e:
54
- if 'original_dir' in locals():
55
- os.chdir(original_dir)
56
- return False, f"安裝過程出錯: {str(e)}"
57
 
58
- def process_video(youtube_url, openai_api_key, progress=gr.Progress()):
59
- """處理YouTube視頻"""
60
-
61
- if not youtube_url.strip():
62
- return None, "❌ 請輸入YouTube URL"
63
-
64
- if not openai_api_key.strip():
65
- return None, "❌ 請輸入OpenAI API Key"
66
 
67
- # 驗證URL格式
68
- if not any(domain in youtube_url for domain in ['youtube.com', 'youtu.be']):
69
- return None, "❌ 請輸入有效的YouTube URL"
70
 
71
- progress(0.1, desc="初始化環境...")
72
- setup_environment()
73
 
74
- progress(0.2, desc="克隆項目代碼...")
75
- repo_dir, clone_msg = clone_repo()
76
- if not repo_dir:
77
- return None, clone_msg
 
 
 
 
78
 
79
- progress(0.3, desc="安裝項目依賴...")
80
- deps_ok, deps_msg = install_project_deps(repo_dir)
81
- if not deps_ok:
82
- return None, deps_msg
83
 
84
- # 設置環境變量
85
- env = os.environ.copy()
86
- env["OPENAI_API_KEY"] = openai_api_key
87
 
88
  try:
89
- progress(0.5, desc="處理視頻中...")
90
-
91
- original_dir = os.getcwd()
92
- os.chdir(repo_dir)
93
-
94
- # 創建輸入文件
95
- with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as f:
96
- f.write(f"{youtube_url}\n")
97
- input_file = f.name
98
-
99
- # 執行主程序
100
- with open(input_file, 'r') as f:
101
- result = subprocess.run(
102
- [sys.executable, "main.py"],
103
- stdin=f,
104
- capture_output=True,
105
- text=True,
106
- env=env,
107
- timeout=600 # 10分鐘超時
108
- )
109
 
110
- # 清理輸入文件
111
- os.unlink(input_file)
112
 
113
- progress(0.8, desc="查找生成的視頻...")
 
 
114
 
115
- # 查找輸出視頻
116
- video_files = []
117
- for pattern in ['*.mp4', '*.avi', '*.mov']:
118
- video_files.extend(Path('.').rglob(pattern))
 
 
 
 
 
 
 
 
 
 
 
 
 
119
 
120
- os.chdir(original_dir)
 
121
 
122
- progress(1.0, desc="處理完成!")
 
 
123
 
124
- if video_files:
125
- # 復制視頻到當前目錄以便訪問
126
- output_video = str(video_files[0])
127
- local_video = f"./output_{os.path.basename(output_video)}"
128
- shutil.copy2(os.path.join(repo_dir, output_video), local_video)
 
 
 
 
 
 
129
 
130
- return local_video, f"✅ 成功生成視頻! 找到 {len(video_files)} 個文件。"
131
- else:
132
- error_msg = f"處理完成但未找到視頻文件。\n\n標準輸出:\n{result.stdout}\n\n錯誤輸出:\n{result.stderr}"
133
- return None, error_msg
134
 
135
- except subprocess.TimeoutExpired:
136
- os.chdir(original_dir)
137
- return None, "❌ 處理超時 (10分鐘)。請嘗試較短的視頻。"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
  except Exception as e:
139
- if 'original_dir' in locals():
140
- os.chdir(original_dir)
141
- return None, f"❌ 處理失敗: {str(e)}"
142
 
143
- # 創建Gradio界面
144
- with gr.Blocks(title="AI YouTube Shorts Generator", theme=gr.themes.Soft()) as demo:
145
- gr.Markdown("""
146
- # 🎬 AI YouTube Shorts Generator
147
-
148
- 自動將長視頻轉換為吸引人的YouTube Shorts!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
 
150
- ## ✨ 功能特點
151
- - 🎯 **智能內容分析**: 使用GPT-4識別視頻亮點
152
- - 🗣️ **說話者檢測**: 自動檢測不同說話者
153
- - ✂️ **垂直裁剪**: 轉換為Shorts格式 (9:16)
154
- - 🎵 **語音轉錄**: 基於Whisper的高質量轉錄
 
155
  """)
156
 
 
157
  with gr.Row():
 
158
  with gr.Column(scale=1):
159
- youtube_url = gr.Textbox(
160
- label="📺 YouTube視頻URL",
161
- placeholder="https://www.youtube.com/watch?v=dQw4w9WgXcQ",
162
- info="輸入要處理的YouTube視頻鏈接"
 
 
 
163
  )
164
 
165
- openai_key = gr.Textbox(
166
- label="🔑 OpenAI API Key",
167
- type="password",
168
- placeholder="sk-proj-...",
169
- info="需要GPT-4/GPT-4o訪問權限"
170
  )
171
 
 
 
172
  with gr.Row():
173
- process_btn = gr.Button("🚀 開始生成", variant="primary", size="lg")
174
- clear_btn = gr.Button("🗑️ 清除", variant="secondary")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  with gr.Column(scale=1):
177
- output_video = gr.Video(label="🎥 生成的Shorts")
178
- output_status = gr.Textbox(
179
- label="📊 處理狀態",
180
- lines=8,
181
- max_lines=10,
182
- show_copy_button=True
 
 
 
 
 
 
 
 
 
 
 
 
183
  )
184
 
185
- gr.Markdown("""
186
- ## 📋 使用說明
187
-
188
- 1. **輸入URL**: 粘貼YouTube視頻鏈接
189
- 2. **API Key**: 提供OpenAI API密鑰 (需GPT-4權限)
190
- 3. **開始處理**: 點擊生成按鈕,等待5-10分鐘
191
- 4. **下載視頻**: 處理完成後下載生成的Shorts
192
-
193
- ## ⚠️ 注意事項
194
 
195
- - **處理時間**: 取決於視頻長度,通常5-10分鐘
196
- - **視頻要求**: 確保YouTube視頻公開可訪問
197
- - **API用量**: 會消耗OpenAI API額度用於內容分析
198
- - **格式支持**: 輸出為MP4格式的豎向視頻 (9:16)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
 
200
- ---
201
- 💡 **提示**: 較短的源視頻 (10-30分鐘) 處理效果更佳
202
- """)
 
 
 
 
 
 
203
 
204
- # 事件綁定
205
  process_btn.click(
206
- fn=process_video,
207
- inputs=[youtube_url, openai_key],
208
- outputs=[output_video, output_status],
209
  show_progress=True
210
  )
211
 
212
- clear_btn.click(
213
- lambda: ("", "", None, ""),
214
- outputs=[youtube_url, openai_key, output_video, output_status]
215
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
 
 
217
  if __name__ == "__main__":
218
  demo.launch(
219
- server_name="0.0.0.0",
220
- server_port=7860,
221
- show_error=True
222
  )
 
1
  import gradio as gr
2
  import os
3
  import tempfile
4
+ import random
5
+ from datetime import datetime
6
+ from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip, vfx
7
+ from openai import OpenAI
8
 
9
+ # 配置 OpenAI API
10
+ client = OpenAI(
11
+ api_key=os.getenv("sk-ZYyxdh3NexC863OUdicSlKrunXEPlRlsLBMwc1vXMGEVwZdb")
12
+ )
13
+
14
+ def analyze_video_content(video_path, video_count):
15
+ """使用 OpenAI 分析视频内容"""
16
  try:
17
+ prompt = f"""作为专业视频内容分析师,请为用户上传的 {video_count} 个视频文件生成详细分析报告。
 
 
 
 
18
 
19
+ 分析要点:
20
+ 1. 📹 视频内容推测(基于用户上传行为)
21
+ 2. 🎵 推荐的背景音乐风格和节奏
22
+ 3. ✂️ 最佳剪辑策略和转场效果
23
+ 4. 🎯 目标受众和传播渠道建议
24
+ 5. 📈 内容优化和提升建议
25
+
26
+ 请用中文回答,格式清晰,每个要点用emoji标识。"""
27
+
28
+ response = client.chat.completions.create(
29
+ model="gpt-4o-mini", # 使用性价比高的模型
30
+ messages=[
31
+ {
32
+ "role": "system",
33
+ "content": "你是一位资深的视频内容策划和分析专家,擅长为创作者提供专业的视频制作建议。"
34
+ },
35
+ {
36
+ "role": "user",
37
+ "content": prompt
38
+ }
39
+ ],
40
+ max_tokens=600,
41
+ temperature=0.7
42
+ )
43
+
44
+ return response.choices[0].message.content
45
+ except Exception as e:
46
+ return f"❌ AI 分析失败: {str(e)}\n💡 请检查 OpenAI API Key 是否正确设置"
47
+
48
+ def generate_creative_titles(video_count, content_theme="创意混剪"):
49
+ """使用 OpenAI 生成创意标题"""
50
  try:
51
+ prompt = f"""请为 {video_count} 个{content_theme}视频生成吸引眼球的标题。
52
+
53
+ 要求:
54
+ - 🔥 热门关键词和流行元素
55
+ - 📱 适合抖音、小红书等平台
56
+ - 💯 每个标题15-25字最佳
57
+ - 🎭 风格多样化(搞笑、治愈、励志等)
58
+ - 🚀 包含动作词汇增加点击欲望
59
+
60
+ 请直接给出 {video_count} 个标题,每行一个,前面加上序号。"""
61
+
62
+ response = client.chat.completions.create(
63
+ model="gpt-4o-mini",
64
+ messages=[
65
+ {
66
+ "role": "system",
67
+ "content": "你是一位专业的新媒体内容创作者,精通各种平台的标题优化技巧。"
68
+ },
69
+ {
70
+ "role": "user",
71
+ "content": prompt
72
+ }
73
+ ],
74
+ max_tokens=400,
75
+ temperature=0.9 # 提高创意度
76
+ )
77
+
78
+ return response.choices[0].message.content
79
+ except Exception as e:
80
+ return f"❌ 标题生成失败: {str(e)}"
81
+
82
+ def generate_project_summary(video_count, processing_time):
83
+ """生成项目处理总结"""
84
  try:
85
+ prompt = f"""请为刚完成的视频混剪项目生成专业总结报告:
86
+
87
+ 项目信息:
88
+ - 处理视频数量: {video_count} 个
89
+ - 处理用时: {processing_time}
90
+ - 使用技术: MoviePy + OpenAI GPT
91
+
92
+ 请包含:
93
+ 1. 🎬 项目执行概况
94
+ 2. ⚡ 技术亮点和特色
95
+ 3. 📊 质量评估和优势
96
+ 4. 🔮 后续优化方向
97
+ 5. 💼 商业应用价值
98
+
99
+ 用专业但易懂的语言,中文回答。"""
100
+
101
+ response = client.chat.completions.create(
102
+ model="gpt-4o", # 使用更强的模型做总结
103
+ messages=[
104
+ {
105
+ "role": "system",
106
+ "content": "你是一位技术项目管理专家,擅长撰写项目总结和技术方案评估报告。"
107
+ },
108
+ {
109
+ "role": "user",
110
+ "content": prompt
111
+ }
112
+ ],
113
+ max_tokens=700,
114
+ temperature=0.6
115
+ )
116
 
117
+ return response.choices[0].message.content
118
+ except Exception as e:
119
+ return f"❌ 总结生成失败: {str(e)}"
120
+
121
+ def get_ai_processing_suggestions(file_count, audio_duration):
122
+ """获取处理建议"""
123
+ try:
124
+ prompt = f"""基于用户上传情况给出处理建议:
125
+ - 视频文件数: {file_count}
126
+ - 音频时长: {audio_duration:.1f}秒
127
+
128
+ 请提供:
129
+ 1. 最佳切片时长建议
130
+ 2. 推荐输出视频数量
131
+ 3. 效果和滤镜建议
132
+ 4. 注意事项提醒
133
+
134
+ 简洁回答,3-4条建议即可。"""
135
+
136
+ response = client.chat.completions.create(
137
+ model="gpt-4o-mini",
138
+ messages=[
139
+ {"role": "user", "content": prompt}
140
+ ],
141
+ max_tokens=300,
142
+ temperature=0.5
143
+ )
144
 
145
+ return response.choices[0].message.content
146
  except Exception as e:
147
+ return "无法获取AI建议,将使用默认参数处理"
 
 
148
 
149
+ def process_videos_with_openai(video_files, audio_file, clip_duration=2, num_output_videos=3):
150
+ """集成 OpenAI GPT 的视频处理主函数"""
 
 
 
 
 
 
151
 
152
+ if not video_files or not audio_file:
153
+ return "❌ 请上传视频文件和音频文件", [], "", "", ""
 
154
 
155
+ start_time = datetime.now()
 
156
 
157
+ # 获取 AI 处理建议
158
+ audio_duration = 0
159
+ try:
160
+ temp_audio = AudioFileClip(audio_file.name)
161
+ audio_duration = temp_audio.duration
162
+ temp_audio.close()
163
+ except:
164
+ audio_duration = 30 # 默认值
165
 
166
+ ai_suggestions = get_ai_processing_suggestions(len(video_files), audio_duration)
 
 
 
167
 
168
+ # 开始视频分析
169
+ status_updates = "🤖 OpenAI GPT 正在分析视频内容...\n"
170
+ video_analysis = analyze_video_content(video_files[0].name if video_files else "", len(video_files))
171
 
172
  try:
173
+ # 创建输出目录
174
+ temp_dir = tempfile.mkdtemp()
175
+ output_dir = os.path.join(temp_dir, f"openai_output_{datetime.now().strftime('%m%d_%H%M')}")
176
+ os.makedirs(output_dir, exist_ok=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
 
178
+ status_updates += "🎬 开始处理视频文件...\n"
 
179
 
180
+ # 处理视频逻辑
181
+ video_clips = []
182
+ total_source_duration = 0
183
 
184
+ # 加载并切割所有视频
185
+ for i, video_file in enumerate(video_files):
186
+ status_updates += f"📹 处理第 {i+1}/{len(video_files)} 个视频...\n"
187
+
188
+ clip = VideoFileClip(video_file.name)
189
+ total_source_duration += clip.duration
190
+
191
+ # 按时长切割视频
192
+ for start_time_clip in range(0, int(clip.duration), clip_duration):
193
+ end_time = min(start_time_clip + clip_duration, clip.duration)
194
+ if end_time - start_time_clip >= 0.5: # 至少0.5秒的片段
195
+ sub_clip = clip.subclip(start_time_clip, end_time).without_audio()
196
+ video_clips.append(sub_clip)
197
+
198
+ # 加载音频
199
+ audio = AudioFileClip(audio_file.name)
200
+ target_duration = audio.duration
201
 
202
+ # 智能打乱视频片段
203
+ random.shuffle(video_clips)
204
 
205
+ status_updates += f"🎵 音频时长: {target_duration:.1f}秒\n"
206
+ status_updates += f"📊 生成 {len(video_clips)} 个视频片段\n"
207
+ status_updates += f"🔄 准备输出 {num_output_videos} 个混剪视频...\n"
208
 
209
+ # 生成输出视频
210
+ output_files = []
211
+ clips_per_video = max(1, len(video_clips) // num_output_videos)
212
+
213
+ for i in range(num_output_videos):
214
+ start_idx = i * clips_per_video
215
+ end_idx = start_idx + clips_per_video
216
+
217
+ # 最后一个视频包含剩余片段
218
+ if i == num_output_videos - 1:
219
+ end_idx = len(video_clips)
220
 
221
+ selected_clips = video_clips[start_idx:end_idx]
 
 
 
222
 
223
+ if selected_clips:
224
+ # 拼接视频片段
225
+ final_video = concatenate_videoclips(selected_clips)
226
+
227
+ # 调整视频长度匹配音频
228
+ if final_video.duration > target_duration:
229
+ final_video = final_video.subclip(0, target_duration)
230
+ elif final_video.duration < target_duration:
231
+ # 循环播放直到匹配音频长度
232
+ loops_needed = int(target_duration / final_video.duration) + 1
233
+ looped_video = concatenate_videoclips([final_video] * loops_needed)
234
+ final_video = looped_video.subclip(0, target_duration)
235
+
236
+ # 添加音频和效果
237
+ final_video = final_video.set_audio(audio)
238
+
239
+ # 添加镜像效果(防止版权检测)
240
+ final_video = final_video.fx(vfx.mirror_x)
241
+
242
+ # 保存视频
243
+ output_filename = f"openai_mixcut_{i+1:02d}.mp4"
244
+ output_path = os.path.join(output_dir, output_filename)
245
+
246
+ final_video.write_videofile(
247
+ output_path,
248
+ codec='libx264',
249
+ audio_codec='aac',
250
+ temp_audiofile='temp-audio.m4a',
251
+ remove_temp=True,
252
+ verbose=False,
253
+ logger=None
254
+ )
255
+
256
+ output_files.append(output_path)
257
+
258
+ # 清理内存
259
+ final_video.close()
260
+
261
+ # 清理资源
262
+ for clip in video_clips:
263
+ clip.close()
264
+ audio.close()
265
+
266
+ # 计算处理时间
267
+ end_time = datetime.now()
268
+ processing_time = (end_time - start_time).total_seconds()
269
+
270
+ # 生成 AI 标题和总结
271
+ status_updates += "🎯 生成创意标题...\n"
272
+ ai_titles = generate_creative_titles(num_output_videos)
273
+
274
+ status_updates += "📋 生成项目总结...\n"
275
+ project_summary = generate_project_summary(num_output_videos, f"{processing_time:.1f}秒")
276
+
277
+ # 最终状态
278
+ final_status = f"""✅ 处理完成!OpenAI GPT 增强版
279
+
280
+ 📊 处理统计:
281
+ • 输入视频: {len(video_files)} 个
282
+ • 生成片段: {len(video_clips)} 个
283
+ • 输出视频: {len(output_files)} 个
284
+ • 处理时长: {processing_time:.1f} 秒
285
+ • 音频匹配: {target_duration:.1f} 秒
286
+
287
+ 🤖 AI 增强功能已完成:
288
+ • ✓ 内容智能分析
289
+ • ✓ 创意标题生成
290
+ • ✓ 专业项目总结
291
+ • ✓ 处理建议优化
292
+
293
+ ⏰ 完成时间: {end_time.strftime('%H:%M:%S')}"""
294
+
295
+ return final_status, output_files, video_analysis, ai_titles, project_summary
296
+
297
  except Exception as e:
298
+ error_msg = f"""❌ 处理出现错误: {str(e)}
 
 
299
 
300
+ 🔧 可能的解决方案:
301
+ 1. 检查视频文件格式是否支持
302
+ 2. 确认音频文件完整性
303
+ 3. 减少输出视频数量
304
+ 4. 检查系统资源使用情况"""
305
+
306
+ return error_msg, [], ai_suggestions, "", ""
307
+
308
+ # 创建增强版 Gradio 界面
309
+ with gr.Blocks(
310
+ title="pyTovideo2 + OpenAI GPT",
311
+ theme=gr.themes.Soft(),
312
+ css="""
313
+ .gradio-container {
314
+ font-family: 'Arial', sans-serif;
315
+ }
316
+ .main-header {
317
+ text-align: center;
318
+ margin-bottom: 25px;
319
+ padding: 20px;
320
+ background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
321
+ border-radius: 10px;
322
+ color: white;
323
+ }
324
+ """
325
+ ) as demo:
326
 
327
+ # 主标题区域
328
+ gr.HTML("""
329
+ <div class="main-header">
330
+ <h1 style="margin-bottom: 10px;">🎬 pyTovideo2 + OpenAI GPT</h1>
331
+ <p style="margin: 0; opacity: 0.9;">AI 驱动的智能视频混剪工具 | GPT-4 内容分析与创意生成</p>
332
+ </div>
333
  """)
334
 
335
+ # 主要操作区域
336
  with gr.Row():
337
+ # 左侧:文件上传和参数设置
338
  with gr.Column(scale=1):
339
+ gr.Markdown("### 📤 素材上传")
340
+
341
+ video_input = gr.File(
342
+ label="🎥 选择视频文件 (支持批量上传)",
343
+ file_count="multiple",
344
+ file_types=[".mp4", ".mov", ".avi", ".mkv"],
345
+ height=130
346
  )
347
 
348
+ audio_input = gr.File(
349
+ label="🎵 选择背景音频",
350
+ file_types=[".mp3", ".wav", ".m4a", ".aac"],
351
+ height=90
 
352
  )
353
 
354
+ gr.Markdown("### ⚙️ 处理参数")
355
+
356
  with gr.Row():
357
+ clip_duration = gr.Number(
358
+ label="⏱️ 切片时长(秒)",
359
+ value=2,
360
+ minimum=1,
361
+ maximum=8,
362
+ step=0.5,
363
+ info="每个视频片段的长度"
364
+ )
365
+
366
+ num_videos = gr.Number(
367
+ label="📊 输出数量",
368
+ value=3,
369
+ minimum=1,
370
+ maximum=6,
371
+ step=1,
372
+ info="生成混剪视频的数量"
373
+ )
374
 
375
+ # 处理按钮
376
+ process_btn = gr.Button(
377
+ "🚀 开始 AI 智能处理",
378
+ variant="primary",
379
+ size="lg",
380
+ scale=1
381
+ )
382
+
383
+ # AI 模型信息
384
+ gr.Markdown("""
385
+ <div style="background: #f0f8ff; padding: 10px; border-radius: 8px; margin-top: 15px;">
386
+ <b>🤖 AI 模型信息:</b><br>
387
+ • 内容分析: GPT-4o-mini<br>
388
+ • 标题生成: GPT-4o-mini<br>
389
+ • 项目总结: GPT-4o<br>
390
+ • 成本优化: 智能模型选择
391
+ </div>
392
+ """)
393
+
394
+ # 右侧:状态显示和文件下载
395
  with gr.Column(scale=1):
396
+ gr.Markdown("### 📊 处理状态")
397
+
398
+ status_output = gr.Textbox(
399
+ label="🔥 实时处理状态",
400
+ lines=8,
401
+ max_lines=12,
402
+ interactive=False,
403
+ show_copy_button=True,
404
+ placeholder="等待开始处理..."
405
+ )
406
+
407
+ gr.Markdown("### 📁 输出文件")
408
+
409
+ video_output = gr.File(
410
+ label="⬇️ 下载混剪视频",
411
+ file_count="multiple",
412
+ height=120,
413
+ interactive=False
414
  )
415
 
416
+ # AI 分析结果展示区域
417
+ gr.Markdown("---")
418
+ gr.HTML("<h2 style='text-align: center; color: #4a90e2;'>🧠 OpenAI GPT 智能分析结果</h2>")
 
 
 
 
 
 
419
 
420
+ with gr.Row():
421
+ with gr.Column():
422
+ gr.Markdown("### 📈 内容分析报告")
423
+ analysis_output = gr.Textbox(
424
+ label="🎯 GPT-4 视频内容分析",
425
+ lines=6,
426
+ interactive=False,
427
+ show_copy_button=True,
428
+ placeholder="AI 分析结果将在这里显示..."
429
+ )
430
+
431
+ with gr.Column():
432
+ gr.Markdown("### 🏷️ 创意标题推荐")
433
+ titles_output = gr.Textbox(
434
+ label="💡 GPT 生成创意标题",
435
+ lines=6,
436
+ interactive=False,
437
+ show_copy_button=True,
438
+ placeholder="创意标题将在这里显示..."
439
+ )
440
 
441
+ # 项目总结区域
442
+ gr.Markdown("### 📋 AI 项目分析总结")
443
+ summary_output = gr.Textbox(
444
+ label="📊 GPT-4 专业项目总结",
445
+ lines=5,
446
+ interactive=False,
447
+ show_copy_button=True,
448
+ placeholder="详细的项目分析总结将在这里显示..."
449
+ )
450
 
451
+ # 绑定处理函数
452
  process_btn.click(
453
+ fn=process_videos_with_openai,
454
+ inputs=[video_input, audio_input, clip_duration, num_videos],
455
+ outputs=[status_output, video_output, analysis_output, titles_output, summary_output],
456
  show_progress=True
457
  )
458
 
459
+ # 使用指南
460
+ gr.Markdown("""
461
+ ---
462
+ ### 📖 使用指南
463
+
464
+ **🎯 支持格式:**
465
+ - 视频: MP4, MOV, AVI, MKV
466
+ - 音频: MP3, WAV, M4A, AAC
467
+
468
+ **💾 建议规格:**
469
+ - 单个视频 < 200MB
470
+ - 音频文件 < 50MB
471
+ - 总处理时间 < 5分钟
472
+
473
+ **🤖 AI 功能特色:**
474
+ - ✨ GPT-4 智能内容分析
475
+ - 🎨 创意标题自动生成
476
+ - 📊 专业项目评估报告
477
+ - 💡 个性化优化建议
478
+
479
+ **⚡ 处理流程:**
480
+ 1. 上传视频和音频文件
481
+ 2. 调整处理参数
482
+ 3. 点击开始处理
483
+ 4. 等待 AI 分析完成
484
+ 5. 下载结果文件
485
+ """)
486
 
487
+ # 启动应用
488
  if __name__ == "__main__":
489
  demo.launch(
490
+ share=False,
491
+ show_error=True,
492
+ show_tips=True
493
  )