Ryanus commited on
Commit
c8fb47a
·
verified ·
1 Parent(s): 391a9d8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -254
app.py CHANGED
@@ -1,258 +1,23 @@
1
  import gradio as gr
2
- import os
3
- import tempfile
4
- import shutil
5
- from datetime import datetime
6
- from openai import OpenAI
7
-
8
- # 配置 OpenAI API
9
- client = OpenAI(
10
- api_key=os.getenv("sk-ZYyxdh3NexC863OUdicSlKrunXEPlRlsLBMwc1vXMGEVwZdb")
 
 
 
 
 
 
 
 
 
11
  )
12
 
13
- def analyze_video_content(video_count):
14
- """使用 OpenAI 分析视频内容(不依赖 MoviePy)"""
15
- try:
16
- prompt = f"""作为专业视频内容分析师,请为用户准备处理的 {video_count} 个视频文件生成详细指导建议。
17
-
18
- 请提供:
19
- 1. 📹 视频混剪的最佳实践方法
20
- 2. 🎵 音频匹配和同步技巧
21
- 3. ✂️ 推荐的剪辑软件和工具
22
- 4. 🎯 不同平台的视频规格要求
23
- 5. 📈 提升播放量的优化建议
24
-
25
- 用中文回答,格式清晰。"""
26
-
27
- response = client.chat.completions.create(
28
- model="gpt-4o-mini",
29
- messages=[
30
- {"role": "system", "content": "你是一位资深的视频制作专家。"},
31
- {"role": "user", "content": prompt}
32
- ],
33
- max_tokens=600,
34
- temperature=0.7
35
- )
36
-
37
- return response.choices[0].message.content
38
- except Exception as e:
39
- return f"❌ AI 分析失败: {str(e)}"
40
-
41
- def generate_creative_titles(video_count):
42
- """生成创意标题"""
43
- try:
44
- prompt = f"""为 {video_count} 个视频混剪作品生成吸引人的标题:
45
-
46
- 要求:
47
- - 🔥 包含热门关键词
48
- - 📱 适合短视频平台
49
- - 💯 15-25字最佳长度
50
- - 🎭 风格多样化
51
-
52
- 请给出 {video_count} 个标题,每行一个。"""
53
-
54
- response = client.chat.completions.create(
55
- model="gpt-4o-mini",
56
- messages=[
57
- {"role": "system", "content": "你是新媒体内容创作专家。"},
58
- {"role": "user", "content": prompt}
59
- ],
60
- max_tokens=400,
61
- temperature=0.9
62
- )
63
-
64
- return response.choices[0].message.content
65
- except Exception as e:
66
- return f"❌ 标题生成失败: {str(e)}"
67
-
68
- def process_files(video_files, audio_file, clip_duration=2, num_output_videos=3):
69
- """处理文件(展示版本,不实际处理视频)"""
70
-
71
- if not video_files:
72
- return "❌ 请上传视频文件", "", "", ""
73
-
74
- # 获取文件信息
75
- video_info = []
76
- for i, video_file in enumerate(video_files):
77
- file_size = os.path.getsize(video_file.name) / (1024*1024) # MB
78
- video_info.append(f"视频{i+1}: {os.path.basename(video_file.name)} ({file_size:.1f}MB)")
79
-
80
- audio_info = ""
81
- if audio_file:
82
- audio_size = os.path.getsize(audio_file.name) / (1024*1024)
83
- audio_info = f"音频: {os.path.basename(audio_file.name)} ({audio_size:.1f}MB)"
84
-
85
- # 生成 AI 分析
86
- video_analysis = analyze_video_content(len(video_files))
87
- ai_titles = generate_creative_titles(num_output_videos)
88
-
89
- # 生成处理建议
90
- processing_guide = f"""
91
- ✨ 文件上传成功!
92
-
93
- 📊 上传统计:
94
- {chr(10).join(video_info)}
95
- {audio_info}
96
-
97
- 🔧 建议的处理方法:
98
-
99
- 1. **使用专业软件**:
100
- - 推荐:DaVinci Resolve (免费)
101
- - 或者:Adobe Premiere Pro
102
- - 轻量级:OpenShot
103
-
104
- 2. **处理参数**:
105
- - 切片时长:{clip_duration}秒
106
- - 输出数量:{num_output_videos}个
107
- - 分辨率:1080p 建议
108
-
109
- 3. **导出设置**:
110
- - 格式:MP4
111
- - 编码:H.264
112
- - 帧率:30fps
113
-
114
- 4. **上传平台优化**:
115
- - 抖音:9:16竖屏
116
- - 小红书:1:1方形
117
- - B站:16:9横屏
118
-
119
- 💡 由于 Hugging Face CPU 环境限制,建议下载文件后使用本地软件处理。
120
- """
121
-
122
- project_summary = f"""
123
- 📋 项目分析总结:
124
-
125
- 本次上传了 {len(video_files)} 个视频文件,计划生成 {num_output_videos} 个混剪作品。
126
-
127
- 🎯 制作建议:
128
- • 保持统一的视觉风格
129
- • 音频节拍匹配视频切换
130
- • 添加转场效果增强观感
131
- • 考虑平台特定的尺寸要求
132
-
133
- 📈 优化建议:
134
- • 封面图设计要吸引眼球
135
- • 标题包含热门关键词
136
- • 发布时间选择高峰期
137
- • 积极互动提升算法推荐
138
-
139
- ⚡ 下一步:请使用推荐的视频编辑软件进行实际处理。
140
- """
141
-
142
- return processing_guide, video_analysis, ai_titles, project_summary
143
-
144
- # 创建 Gradio 界面
145
- with gr.Blocks(
146
- title="pyTovideo2 + OpenAI (Guide Mode)",
147
- theme=gr.themes.Soft()
148
- ) as demo:
149
-
150
- gr.HTML("""
151
- <div style="text-align: center; margin-bottom: 20px; padding: 20px; background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); border-radius: 10px; color: white;">
152
- <h1>🎬 pyTovideo2 + OpenAI GPT</h1>
153
- <p style="margin: 0;">智能视频混剪指导助手 | 文件分析 + AI 建议</p>
154
- <p style="margin: 5px 0 0 0; font-size: 0.9em; opacity: 0.8;">⚠️ CPU 环境限制,提供专业指导和 AI 分析</p>
155
- </div>
156
- """)
157
-
158
- with gr.Row():
159
- with gr.Column(scale=1):
160
- gr.Markdown("### 📤 文件上传")
161
-
162
- video_input = gr.File(
163
- label="🎥 选择视频文件",
164
- file_count="multiple",
165
- file_types=[".mp4", ".mov", ".avi"],
166
- height=120
167
- )
168
-
169
- audio_input = gr.File(
170
- label="🎵 选择背景音频",
171
- file_types=[".mp3", ".wav", ".m4a"],
172
- height=80
173
- )
174
-
175
- gr.Markdown("### ⚙️ 处理参数")
176
- with gr.Row():
177
- clip_duration = gr.Number(
178
- label="切片时长(秒)",
179
- value=2,
180
- minimum=1,
181
- maximum=8
182
- )
183
- num_videos = gr.Number(
184
- label="输出数量",
185
- value=3,
186
- minimum=1,
187
- maximum=6
188
- )
189
-
190
- analyze_btn = gr.Button(
191
- "🔍 AI 分析文件",
192
- variant="primary",
193
- size="lg"
194
- )
195
-
196
- with gr.Column(scale=1):
197
- gr.Markdown("### 📊 处理指导")
198
- guide_output = gr.Textbox(
199
- label="📋 处理建议",
200
- lines=10,
201
- interactive=False,
202
- show_copy_button=True
203
- )
204
-
205
- gr.Markdown("---")
206
- gr.Markdown("## 🤖 OpenAI GPT 智能分析")
207
-
208
- with gr.Row():
209
- with gr.Column():
210
- analysis_output = gr.Textbox(
211
- label="📈 内容分析",
212
- lines=6,
213
- interactive=False,
214
- show_copy_button=True
215
- )
216
-
217
- with gr.Column():
218
- titles_output = gr.Textbox(
219
- label="🏷️ 创意标题",
220
- lines=6,
221
- interactive=False,
222
- show_copy_button=True
223
- )
224
-
225
- summary_output = gr.Textbox(
226
- label="📋 项目总结",
227
- lines=5,
228
- interactive=False,
229
- show_copy_button=True
230
- )
231
-
232
- analyze_btn.click(
233
- fn=process_files,
234
- inputs=[video_input, audio_input, clip_duration, num_videos],
235
- outputs=[guide_output, analysis_output, titles_output, summary_output]
236
- )
237
-
238
- gr.Markdown("""
239
- ---
240
- ### 💡 使用说明
241
-
242
- **当前模式**:AI 分析和指导模式
243
- - ✅ 文件信息分析
244
- - ✅ AI 内容建议
245
- - ✅ 创意标题生成
246
- - ✅ 专业处理指导
247
-
248
- **推荐工具**:
249
- - 🆓 DaVinci Resolve (专业免费)
250
- - 💰 Adobe Premiere Pro (付费专业)
251
- - 🔧 OpenShot (简单免费)
252
- - 📱 手机端:剪映、快影
253
-
254
- **获取完整功能**:建议在本地环境安装 MoviePy 进行实际视频处理。
255
- """)
256
-
257
  if __name__ == "__main__":
258
- demo.launch()
 
1
  import gradio as gr
2
+ from split_video import split_video
3
+
4
+ def process_video(input_video, segment_duration):
5
+ if not input_video:
6
+ return "請上傳影片"
7
+ output_dir = "temp_segments"
8
+ outputs = split_video(input_video, output_dir, int(segment_duration))
9
+ return outputs # Gradio 自動顯示檔案下載連結
10
+
11
+ iface = gr.Interface(
12
+ fn=process_video,
13
+ inputs=[
14
+ gr.File(label="上傳長影片 (MP4)"),
15
+ gr.Number(label="每段長度 (秒)", value=60)
16
+ ],
17
+ outputs=gr.Files(label="下載短影片"),
18
+ title="影片切割器 (基於 pyToVideo2)",
19
+ description="上傳長影片,切割成多段短片。"
20
  )
21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  if __name__ == "__main__":
23
+ iface.launch()