import gradio as gr import os, uuid, re, tempfile from pydub import AudioSegment, silence # ---------------------------------- # Utils # ---------------------------------- def clean_name(path, ext): name = re.sub(r'[^a-zA-Z0-9]+', '_', os.path.basename(path)) return f"{name}_{uuid.uuid4().hex[:6]}.{ext}" # ---------------------------------- # Convert to WAV (FAST PROCESSING) # ---------------------------------- def ensure_wav(path): if path.lower().endswith(".wav"): return path audio = AudioSegment.from_file(path) audio = audio.set_channels(1) tmp = tempfile.gettempdir() wav_path = os.path.join(tmp, clean_name(path, "wav")) audio.export(wav_path, format="wav") return wav_path # ---------------------------------- # SAFE Silence Removal # ---------------------------------- def remove_silence_safe(path, keep_ms=250): audio = AudioSegment.from_wav(path) silence_thresh = audio.dBFS - 22 chunks = silence.split_on_silence( audio, min_silence_len=350, silence_thresh=silence_thresh, keep_silence=keep_ms ) if not chunks: return path out = AudioSegment.empty() for c in chunks: out += c.fade_in(20).fade_out(20) out_path = os.path.join( tempfile.gettempdir(), clean_name(path, "wav") ) out.export(out_path, format="wav") return out_path # ---------------------------------- # Duration # ---------------------------------- def duration(path): return len(AudioSegment.from_wav(path)) / 1000 # ---------------------------------- # Main # ---------------------------------- def process_audio(audio_file, keep_seconds): keep_ms = int(max(keep_seconds, 0.25) * 1000) wav = ensure_wav(audio_file) before = duration(wav) cleaned = remove_silence_safe(wav, keep_ms) after = duration(cleaned) # Export final MP3 (user friendly) final_mp3 = cleaned.replace(".wav", ".mp3") AudioSegment.from_wav(cleaned).export(final_mp3, format="mp3") info = ( f"Old Duration : {before:.2f}s\n" f"New Duration : {after:.2f}s\n" f"Silence Removed : {before - after:.2f}s" ) return final_mp3, final_mp3, info # ---------------------------------- # UI # ---------------------------------- with gr.Blocks(title="Fast Silence Remover") as demo: gr.Markdown( "## ⚡ Fast MP3/WAV Silence Remover (No Word Loss)" ) with gr.Row(): with gr.Column(): audio = gr.Audio( type="filepath", sources=["upload"], label="Upload MP3 or WAV" ) keep = gr.Number( value=0.25, label="Keep Silence (seconds)" ) btn = gr.Button("Remove Silence") with gr.Column(): out_audio = gr.Audio(label="Processed Audio") out_file = gr.File(label="Download") info = gr.Textbox(label="Info") btn.click( process_audio, [audio, keep], [out_audio, out_file, info] ) demo.queue().launch()