Spaces:
Running
Running
import gradio as gr | |
from pydub import AudioSegment | |
from scipy.signal import convolve | |
import numpy as np | |
import tempfile | |
# Reverb function using convolution with a simple impulse response | |
def add_reverb(audio_segment, decay=0.5, delay=200): | |
# Convert AudioSegment to numpy array | |
samples = np.array(audio_segment.get_array_of_samples()) | |
# Create a simple reverb impulse response | |
impulse_response = np.zeros(delay * 10) | |
impulse_response[::delay] = decay ** np.arange(len(impulse_response) // delay) | |
# Apply convolution for reverb | |
processed_samples = convolve(samples, impulse_response, mode='full')[:len(samples)] | |
processed_samples = np.int16(processed_samples / np.max(np.abs(processed_samples)) * 32767) | |
# Convert numpy array back to AudioSegment | |
processed_audio = AudioSegment( | |
processed_samples.tobytes(), | |
frame_rate=audio_segment.frame_rate, | |
sample_width=audio_segment.sample_width, | |
channels=audio_segment.channels | |
) | |
return processed_audio | |
# Wrapper function to apply selected effect | |
def apply_effect(audio_file, effect, reverb_decay, reverb_delay): | |
audio = AudioSegment.from_file(audio_file) | |
if effect == "Reverb": | |
audio = add_reverb(audio, decay=reverb_decay, delay=int(reverb_delay)) | |
# Save the modified audio to a temporary file | |
with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_file: | |
audio.export(temp_file.name, format="wav") | |
return temp_file.name | |
# Gradio Interface | |
def build_ui(): | |
with gr.Blocks() as demo: | |
gr.Markdown("### Audio Effects with Gradio") | |
with gr.Row(): | |
audio_input = gr.Audio(source="upload", type="filepath", label="Upload Audio") | |
audio_output = gr.Audio(label="Processed Audio") | |
with gr.Row(): | |
effect = gr.Radio(["Reverb"], label="Choose Effect") | |
reverb_decay = gr.Slider(0.1, 1.0, value=0.5, step=0.1, label="Reverb Decay") | |
reverb_delay = gr.Slider(50, 500, value=200, step=10, label="Reverb Delay (ms)") | |
apply_button = gr.Button("Apply Effect") | |
apply_button.click( | |
fn=apply_effect, | |
inputs=[audio_input, effect, reverb_decay, reverb_delay], | |
outputs=[audio_output] | |
) | |
return demo | |
# Launch Gradio App | |
demo = build_ui() | |
demo.launch() |