sam12345324 commited on
Commit
4f44126
·
verified ·
1 Parent(s): 7b6adec

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +68 -5
app.py CHANGED
@@ -2,6 +2,7 @@ import gradio as gr
2
  import tempfile
3
  import os
4
  from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip, CompositeAudioClip, concatenate_audioclips
 
5
  import logging
6
  import sys
7
  import traceback
@@ -25,6 +26,42 @@ def check_port(port):
25
  except socket.error:
26
  return False
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  def merge_videos_and_audios(video_files=None, audio_files=None, orig_vol=1.0, music_vol=0.5):
29
  """
30
  Merge multiple video clips and/or audio clips based on inputs provided.
@@ -60,9 +97,21 @@ def merge_videos_and_audios(video_files=None, audio_files=None, orig_vol=1.0, mu
60
  output_path = os.path.join(temp_dir, "merged_output.mp3")
61
  logger.info("Merging audio files only")
62
 
63
- # Load and concatenate audio clips
64
- audio_clips = [AudioFileClip(audio) for audio in audio_files]
 
 
 
 
 
 
 
 
 
 
 
65
  final_audio_clip = concatenate_audioclips(audio_clips)
 
66
 
67
  # Write the final audio
68
  logger.info(f"Writing output audio to {output_path}")
@@ -85,21 +134,35 @@ def merge_videos_and_audios(video_files=None, audio_files=None, orig_vol=1.0, mu
85
 
86
  # Determine final video duration
87
  video_duration = final_video_clip.duration or sum(clip.duration for clip in video_clips)
88
- logger.info(f"Total video duration: {video_duration} seconds")
89
 
90
  # Handle audio (if provided)
91
  if audio_files:
92
  logger.info("Processing audio files")
93
- # Load and concatenate audio clips
94
- audio_clips = [AudioFileClip(audio) for audio in audio_files]
 
 
 
 
 
 
 
 
 
 
 
95
  concatenated_audio = concatenate_audioclips(audio_clips)
 
96
 
97
  # Adjust concatenated audio duration to match video duration (trim or loop)
98
  if concatenated_audio.duration > video_duration:
99
  concatenated_audio = concatenated_audio.subclip(0, video_duration)
 
100
  elif concatenated_audio.duration < video_duration:
101
  # Loop the audio to match video duration
102
  concatenated_audio = concatenated_audio.fx(lambda clip: clip.loop(duration=video_duration))
 
103
 
104
  # Apply volume to concatenated audio
105
  concatenated_audio = concatenated_audio.volumex(music_vol)
 
2
  import tempfile
3
  import os
4
  from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip, CompositeAudioClip, concatenate_audioclips
5
+ import numpy as np
6
  import logging
7
  import sys
8
  import traceback
 
26
  except socket.error:
27
  return False
28
 
29
+ def trim_silence(audio_clip, threshold=0.01):
30
+ """
31
+ Trim silence from the start and end of an audio clip.
32
+ Args:
33
+ audio_clip: AudioFileClip object
34
+ threshold: Amplitude threshold below which audio is considered silent
35
+ Returns:
36
+ Trimmed AudioFileClip
37
+ """
38
+ # Get audio data as numpy array
39
+ samples = audio_clip.to_soundarray(fps=44100)
40
+ # Compute amplitude (RMS)
41
+ if len(samples.shape) > 1: # Stereo audio
42
+ amplitudes = np.sqrt(np.mean(samples**2, axis=1))
43
+ else: # Mono audio
44
+ amplitudes = np.sqrt(samples**2)
45
+
46
+ # Find non-silent regions
47
+ non_silent = amplitudes > threshold
48
+ if not np.any(non_silent):
49
+ logger.warning("Audio clip is completely silent")
50
+ return audio_clip
51
+
52
+ # Find start and end indices
53
+ start_idx = np.argmax(non_silent)
54
+ end_idx = len(non_silent) - np.argmax(non_silent[::-1])
55
+
56
+ # Convert indices to time (seconds)
57
+ start_time = start_idx / 44100
58
+ end_time = end_idx / 44100
59
+
60
+ # Trim the audio
61
+ trimmed_audio = audio_clip.subclip(start_time, end_time)
62
+ logger.info(f"Trimmed audio from {start_time:.2f}s to {end_time:.2f}s (original duration: {audio_clip.duration:.2f}s)")
63
+ return trimmed_audio
64
+
65
  def merge_videos_and_audios(video_files=None, audio_files=None, orig_vol=1.0, music_vol=0.5):
66
  """
67
  Merge multiple video clips and/or audio clips based on inputs provided.
 
97
  output_path = os.path.join(temp_dir, "merged_output.mp3")
98
  logger.info("Merging audio files only")
99
 
100
+ # Load, normalize, and trim audio clips
101
+ audio_clips = []
102
+ for audio in audio_files:
103
+ clip = AudioFileClip(audio).set_fps(44100) # Normalize sample rate
104
+ logger.info(f"Original audio duration for {audio}: {clip.duration:.2f}s")
105
+ trimmed_clip = trim_silence(clip)
106
+ audio_clips.append(trimmed_clip)
107
+
108
+ # Log durations after trimming
109
+ for i, clip in enumerate(audio_clips):
110
+ logger.info(f"Trimmed audio {i+1} duration: {clip.duration:.2f}s")
111
+
112
+ # Concatenate audio clips
113
  final_audio_clip = concatenate_audioclips(audio_clips)
114
+ logger.info(f"Concatenated audio duration: {final_audio_clip.duration:.2f}s")
115
 
116
  # Write the final audio
117
  logger.info(f"Writing output audio to {output_path}")
 
134
 
135
  # Determine final video duration
136
  video_duration = final_video_clip.duration or sum(clip.duration for clip in video_clips)
137
+ logger.info(f"Total video duration: {video_duration:.2f}s")
138
 
139
  # Handle audio (if provided)
140
  if audio_files:
141
  logger.info("Processing audio files")
142
+ # Load, normalize, and trim audio clips
143
+ audio_clips = []
144
+ for audio in audio_files:
145
+ clip = AudioFileClip(audio).set_fps(44100) # Normalize sample rate
146
+ logger.info(f"Original audio duration for {audio}: {clip.duration:.2f}s")
147
+ trimmed_clip = trim_silence(clip)
148
+ audio_clips.append(trimmed_clip)
149
+
150
+ # Log durations after trimming
151
+ for i, clip in enumerate(audio_clips):
152
+ logger.info(f"Trimmed audio {i+1} duration: {clip.duration:.2f}s")
153
+
154
+ # Concatenate audio clips
155
  concatenated_audio = concatenate_audioclips(audio_clips)
156
+ logger.info(f"Concatenated audio duration: {concatenated_audio.duration:.2f}s")
157
 
158
  # Adjust concatenated audio duration to match video duration (trim or loop)
159
  if concatenated_audio.duration > video_duration:
160
  concatenated_audio = concatenated_audio.subclip(0, video_duration)
161
+ logger.info(f"Trimmed concatenated audio to match video duration: {concatenated_audio.duration:.2f}s")
162
  elif concatenated_audio.duration < video_duration:
163
  # Loop the audio to match video duration
164
  concatenated_audio = concatenated_audio.fx(lambda clip: clip.loop(duration=video_duration))
165
+ logger.info(f"Looped concatenated audio to match video duration: {concatenated_audio.duration:.2f}s")
166
 
167
  # Apply volume to concatenated audio
168
  concatenated_audio = concatenated_audio.volumex(music_vol)