MingGatsby commited on
Commit
809a7cb
·
verified ·
1 Parent(s): 8858de6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +29 -13
app.py CHANGED
@@ -1,3 +1,8 @@
 
 
 
 
 
1
  import gradio as gr
2
  from moviepy.editor import VideoFileClip
3
  import cv2
@@ -5,9 +10,8 @@ import base64
5
  from openai import OpenAI
6
  import os
7
 
8
- def process_video(video_path, seconds_per_frame=2):
9
  base64Frames = []
10
- base_video_path, _ = os.path.splitext(video_path)
11
  video = cv2.VideoCapture(video_path)
12
  total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
13
  fps = video.get(cv2.CAP_PROP_FPS)
@@ -23,21 +27,37 @@ def process_video(video_path, seconds_per_frame=2):
23
  base64Frames.append(base64.b64encode(buffer).decode("utf-8"))
24
  curr_frame += frames_to_skip
25
  video.release()
 
26
 
 
 
27
  audio_path = f"{base_video_path}.mp3"
28
  clip = VideoFileClip(video_path)
29
- clip.audio.write_audiofile(audio_path, bitrate="32k")
30
- clip.audio.close()
31
  clip.close()
 
32
 
 
 
 
33
  return base64Frames, audio_path
34
 
 
 
 
 
 
 
 
 
35
  def summarize_video(file_path, summary_detail):
36
- api_key = os.getenv("OPENAI_API_KEY")
 
37
  client = OpenAI(api_key=api_key)
38
 
39
  # 抽取幀和音頻(每0.5秒一幀)
40
- base64Frames, audio_path = process_video(file_path, seconds_per_frame=0.5)
41
 
42
  # 使用Whisper進行音頻轉錄
43
  transcription = client.audio.transcriptions.create(
@@ -45,12 +65,7 @@ def summarize_video(file_path, summary_detail):
45
  )
46
 
47
  # 根據用戶選擇的詳細程度設置提示
48
- if summary_detail == "簡短":
49
- summary_prompt = "生成一個簡短的摘要,不超過50字。"
50
- elif summary_detail == "中等":
51
- summary_prompt = "生成一個中等長度的摘要,概述影片的主要內容。"
52
- else: # 詳細
53
- summary_prompt = "生成一個詳細的摘要,包括影片的主要內容和關鍵細節。"
54
 
55
  # 使用GPT-4o生成摘要
56
  response = client.chat.completions.create(
@@ -95,7 +110,8 @@ demo = gr.Interface(
95
  outputs="markdown",
96
  title="影片摘要生成器",
97
  description="上傳影片,將生成影片的摘要。",
 
98
  )
99
 
100
  if __name__ == "__main__":
101
- demo.launch()
 
1
+ import warnings
2
+
3
+ # 過濾 SyntaxWarning 警告
4
+ warnings.filterwarnings("ignore", category=SyntaxWarning)
5
+
6
  import gradio as gr
7
  from moviepy.editor import VideoFileClip
8
  import cv2
 
10
  from openai import OpenAI
11
  import os
12
 
13
+ def extract_frames(video_path, seconds_per_frame):
14
  base64Frames = []
 
15
  video = cv2.VideoCapture(video_path)
16
  total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
17
  fps = video.get(cv2.CAP_PROP_FPS)
 
27
  base64Frames.append(base64.b64encode(buffer).decode("utf-8"))
28
  curr_frame += frames_to_skip
29
  video.release()
30
+ return base64Frames
31
 
32
+ def extract_audio(video_path):
33
+ base_video_path, _ = os.path.splitext(video_path)
34
  audio_path = f"{base_video_path}.mp3"
35
  clip = VideoFileClip(video_path)
36
+ clip.audio.write_audiofile(filename=audio_path, codec="mp3", bitrate="32k")
37
+ # Remove the line that closes the audio
38
  clip.close()
39
+ return audio_path
40
 
41
+ def process_video(video_path, seconds_per_frame=2):
42
+ base64Frames = extract_frames(video_path, seconds_per_frame)
43
+ audio_path = extract_audio(video_path)
44
  return base64Frames, audio_path
45
 
46
+ def get_summary_prompt(summary_detail):
47
+ if summary_detail == "簡短":
48
+ return "生成一個簡短的摘要,不超過50字。"
49
+ elif summary_detail == "中等":
50
+ return "生成一個中等長度的摘要,概述影片的主要內容。"
51
+ else: # 詳細
52
+ return "生成一個詳細的摘要,包括影片的主要內容和關鍵細節。"
53
+
54
  def summarize_video(file_path, summary_detail):
55
+ api_key = "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"
56
+ # api_key = os.getenv("OPENAI_API_KEY")
57
  client = OpenAI(api_key=api_key)
58
 
59
  # 抽取幀和音頻(每0.5秒一幀)
60
+ base64Frames, audio_path = process_video(file_path, seconds_per_frame=int(0.5))
61
 
62
  # 使用Whisper進行音頻轉錄
63
  transcription = client.audio.transcriptions.create(
 
65
  )
66
 
67
  # 根據用戶選擇的詳細程度設置提示
68
+ summary_prompt = get_summary_prompt(summary_detail)
 
 
 
 
 
69
 
70
  # 使用GPT-4o生成摘要
71
  response = client.chat.completions.create(
 
110
  outputs="markdown",
111
  title="影片摘要生成器",
112
  description="上傳影片,將生成影片的摘要。",
113
+ flagging_dir="" # 這會移除 Flag 功能
114
  )
115
 
116
  if __name__ == "__main__":
117
+ demo.launch()