Politrees commited on
Commit
be474de
1 Parent(s): 56f79c2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -8
app.py CHANGED
@@ -8,10 +8,15 @@ import librosa.display
8
  import soundfile as sf
9
  import gradio as gr
10
  import tempfile
 
 
 
 
11
 
12
  # Function for displaying progress
13
  def display_progress(percent, message, progress=gr.Progress()):
14
  progress(percent, desc=message)
 
15
 
16
  # Function for extracting audio from video
17
  def extract_audio(video_path, progress):
@@ -19,13 +24,16 @@ def extract_audio(video_path, progress):
19
  try:
20
  video = VideoFileClip(video_path)
21
  if video.audio is None:
22
- raise ValueError("No audio found in the video")
23
  audio_path = "extracted_audio.wav"
24
  video.audio.write_audiofile(audio_path)
25
  display_progress(0.2, "Audio extracted", progress)
 
26
  return audio_path
27
  except Exception as e:
28
- display_progress(0.2, f"Failed to extract audio: {e}", progress)
 
 
29
  return None
30
 
31
  # Function for dividing video into frames
@@ -33,6 +41,8 @@ def extract_frames(video_path, progress):
33
  display_progress(0.3, "Extracting frames from video", progress)
34
  try:
35
  video = cv2.VideoCapture(video_path)
 
 
36
  frames = []
37
  success, frame = video.read()
38
  while success:
@@ -40,9 +50,12 @@ def extract_frames(video_path, progress):
40
  success, frame = video.read()
41
  video.release()
42
  display_progress(0.4, "Frames extracted", progress)
 
43
  return frames
44
  except Exception as e:
45
- display_progress(0.4, f"Failed to extract frames: {e}", progress)
 
 
46
  return None
47
 
48
  # Convert frame to spectrogram
@@ -50,12 +63,14 @@ def frame_to_spectrogram(frame, sr=22050):
50
  gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
51
  S = np.flipud(gray_frame.astype(np.float32) / 255.0 * 100.0)
52
  y = librosa.griffinlim(S)
 
53
  return y
54
 
55
  # Saving audio
56
  def save_audio(y, sr=22050):
57
  audio_path = 'output_frame_audio.wav'
58
  sf.write(audio_path, y, sr)
 
59
  return audio_path
60
 
61
  # Saving frame spectrogram
@@ -66,6 +81,7 @@ def save_spectrogram_image(S, frame_number, temp_dir):
66
  image_path = os.path.join(temp_dir, f'spectrogram_frame_{frame_number}.png')
67
  plt.savefig(image_path)
68
  plt.close()
 
69
  return image_path
70
 
71
  # Processing all video frames
@@ -79,7 +95,9 @@ def process_video_frames(frames, sr=22050, temp_dir=None, progress=gr.Progress()
79
  processed_frame = cv2.imread(image_path)
80
  processed_frames.append(processed_frame)
81
  display_progress(0.5 + int((i + 1) / total_frames * 0.7), f"Frame processing {i + 1}/{total_frames}", progress)
 
82
  display_progress(0.8, "All frames processed", progress)
 
83
  return processed_frames
84
 
85
  # Saving video from frames
@@ -89,6 +107,7 @@ def save_video_from_frames(frames, output_path, fps=30):
89
  for frame in frames:
90
  video.write(frame)
91
  video.release()
 
92
 
93
  # Adding audio back to video
94
  def add_audio_to_video(video_path, audio_path, output_path, progress):
@@ -99,17 +118,33 @@ def add_audio_to_video(video_path, audio_path, output_path, progress):
99
  final_video = video.set_audio(audio)
100
  final_video.write_videofile(output_path, codec='libx264', audio_codec='aac')
101
  display_progress(1, "Video's ready", progress)
 
102
  except Exception as e:
103
- display_progress(1, f"Failed to add audio to video: {e}", progress)
 
 
104
 
105
  # Gradio interface
106
  def process_video(video_path, progress=gr.Progress()):
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  audio_path = extract_audio(video_path, progress)
108
  if audio_path is None:
109
- return "Failed to extract audio from video."
110
  frames = extract_frames(video_path, progress)
111
  if frames is None:
112
- return "Failed to extract frames from video."
113
 
114
  # Creating a temporary folder for saving frames
115
  with tempfile.TemporaryDirectory() as temp_dir:
@@ -139,14 +174,18 @@ with gr.Blocks(title='Video from Spectrogram', theme=gr.themes.Soft(primary_hue=
139
  generate_button = gr.Button("Generate")
140
  with gr.Column(variant='panel'):
141
  video_output = gr.Video(label="VideoSpectrogram")
 
142
 
143
  def gradio_video_process_fn(video_input, progress=gr.Progress()):
144
- return process_video(video_input, progress)
 
 
 
145
 
146
  generate_button.click(
147
  gradio_video_process_fn,
148
  inputs=[video_input],
149
- outputs=[video_output]
150
  )
151
 
152
  iface.launch(share=True)
 
8
  import soundfile as sf
9
  import gradio as gr
10
  import tempfile
11
+ import logging
12
+
13
+ # Setup logging
14
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[logging.FileHandler("video_processing.log"), logging.StreamHandler()])
15
 
16
  # Function for displaying progress
17
  def display_progress(percent, message, progress=gr.Progress()):
18
  progress(percent, desc=message)
19
+ logging.info(message)
20
 
21
  # Function for extracting audio from video
22
  def extract_audio(video_path, progress):
 
24
  try:
25
  video = VideoFileClip(video_path)
26
  if video.audio is None:
27
+ raise ValueError("No audio found in the video. Please upload a video with an audio track.")
28
  audio_path = "extracted_audio.wav"
29
  video.audio.write_audiofile(audio_path)
30
  display_progress(0.2, "Audio extracted", progress)
31
+ logging.info(f"Audio extracted: {audio_path}")
32
  return audio_path
33
  except Exception as e:
34
+ error_message = f"Failed to extract audio: {e}. Please check if the video file is valid and has an audio track."
35
+ display_progress(0.2, error_message, progress)
36
+ logging.error(error_message)
37
  return None
38
 
39
  # Function for dividing video into frames
 
41
  display_progress(0.3, "Extracting frames from video", progress)
42
  try:
43
  video = cv2.VideoCapture(video_path)
44
+ if not video.isOpened():
45
+ raise ValueError("Failed to open video file. Please check if the file is accessible and valid.")
46
  frames = []
47
  success, frame = video.read()
48
  while success:
 
50
  success, frame = video.read()
51
  video.release()
52
  display_progress(0.4, "Frames extracted", progress)
53
+ logging.info(f"Frames extracted: {len(frames)} frames")
54
  return frames
55
  except Exception as e:
56
+ error_message = f"Failed to extract frames: {e}. Please check if the video file is valid and accessible."
57
+ display_progress(0.4, error_message, progress)
58
+ logging.error(error_message)
59
  return None
60
 
61
  # Convert frame to spectrogram
 
63
  gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
64
  S = np.flipud(gray_frame.astype(np.float32) / 255.0 * 100.0)
65
  y = librosa.griffinlim(S)
66
+ logging.info("Converted frame to spectrogram")
67
  return y
68
 
69
  # Saving audio
70
  def save_audio(y, sr=22050):
71
  audio_path = 'output_frame_audio.wav'
72
  sf.write(audio_path, y, sr)
73
+ logging.info(f"Audio saved: {audio_path}")
74
  return audio_path
75
 
76
  # Saving frame spectrogram
 
81
  image_path = os.path.join(temp_dir, f'spectrogram_frame_{frame_number}.png')
82
  plt.savefig(image_path)
83
  plt.close()
84
+ logging.info(f"Spectrogram image saved: {image_path}")
85
  return image_path
86
 
87
  # Processing all video frames
 
95
  processed_frame = cv2.imread(image_path)
96
  processed_frames.append(processed_frame)
97
  display_progress(0.5 + int((i + 1) / total_frames * 0.7), f"Frame processing {i + 1}/{total_frames}", progress)
98
+ logging.info(f"Processed frame {i + 1}/{total_frames}")
99
  display_progress(0.8, "All frames processed", progress)
100
+ logging.info("All frames processed")
101
  return processed_frames
102
 
103
  # Saving video from frames
 
107
  for frame in frames:
108
  video.write(frame)
109
  video.release()
110
+ logging.info(f"Video saved: {output_path}")
111
 
112
  # Adding audio back to video
113
  def add_audio_to_video(video_path, audio_path, output_path, progress):
 
118
  final_video = video.set_audio(audio)
119
  final_video.write_videofile(output_path, codec='libx264', audio_codec='aac')
120
  display_progress(1, "Video's ready", progress)
121
+ logging.info(f"Final video saved: {output_path}")
122
  except Exception as e:
123
+ error_message = f"Failed to add audio to video: {e}. Please ensure that the audio and video files are valid."
124
+ display_progress(1, error_message, progress)
125
+ logging.error(error_message)
126
 
127
  # Gradio interface
128
  def process_video(video_path, progress=gr.Progress()):
129
+ try:
130
+ video = VideoFileClip(video_path)
131
+ if video.duration > 10:
132
+ logging.info(f"Video longer than 10 seconds, trimming to 10 seconds: {video_path}")
133
+ video = video.subclip(0, 10)
134
+ temp_trimmed_video_path = "trimmed_video.mp4"
135
+ video.write_videofile(temp_trimmed_video_path, codec='libx264')
136
+ video_path = temp_trimmed_video_path
137
+ except Exception as e:
138
+ error_message = f"Failed to load video: {e}. Please ensure the video file is valid."
139
+ logging.error(error_message)
140
+ return error_message
141
+
142
  audio_path = extract_audio(video_path, progress)
143
  if audio_path is None:
144
+ return "Failed to extract audio from video. Please check the logs for more details."
145
  frames = extract_frames(video_path, progress)
146
  if frames is None:
147
+ return "Failed to extract frames from video. Please check the logs for more details."
148
 
149
  # Creating a temporary folder for saving frames
150
  with tempfile.TemporaryDirectory() as temp_dir:
 
174
  generate_button = gr.Button("Generate")
175
  with gr.Column(variant='panel'):
176
  video_output = gr.Video(label="VideoSpectrogram")
177
+ error_output = gr.HTML()
178
 
179
  def gradio_video_process_fn(video_input, progress=gr.Progress()):
180
+ result = process_video(video_input, progress)
181
+ if isinstance(result, str):
182
+ return "", result # If there is an error, return the error message
183
+ return result, "" # If no error, return the video path and empty error message
184
 
185
  generate_button.click(
186
  gradio_video_process_fn,
187
  inputs=[video_input],
188
+ outputs=[video_output, error_output]
189
  )
190
 
191
  iface.launch(share=True)