Spaces:
Sleeping
Sleeping
import gradio as gr | |
from pydub import AudioSegment | |
import librosa | |
import noisereduce as nr | |
import numpy as np | |
from io import BytesIO | |
import tempfile | |
import os | |
# Function to load audio | |
def load_audio(audio_file_path): | |
# Open the file and read its bytes | |
with open(audio_file_path, "rb") as f: | |
audio_bytes = f.read() | |
# Load the audio using pydub from the file bytes | |
audio_segment = AudioSegment.from_file(BytesIO(audio_bytes)) | |
audio_array = np.array(audio_segment.get_array_of_samples(), dtype=np.float32) | |
sample_rate = audio_segment.frame_rate | |
return audio_array, sample_rate | |
# Function for noise reduction | |
def reduce_noise(audio, sample_rate): | |
reduced_noise_audio = nr.reduce_noise(y=audio, sr=sample_rate) | |
return reduced_noise_audio | |
# Function for pitch shifting | |
def pitch_shift(audio, sample_rate, n_steps): | |
shifted_audio = librosa.effects.pitch_shift(audio, sr=sample_rate, n_steps=n_steps) | |
return shifted_audio | |
# Function for time-stretching | |
def time_stretch(audio, rate): | |
stretched_audio = librosa.effects.time_stretch(audio, rate) | |
return stretched_audio | |
# Function to save audio to a temporary file and return the path | |
def save_audio(audio, sample_rate): | |
# Create a temporary file to save the audio | |
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".wav") | |
temp_file_name = temp_file.name | |
# Use pydub to save the audio to the temp file | |
audio_segment = AudioSegment( | |
np.int16(audio).tobytes(), frame_rate=sample_rate, sample_width=2, channels=1 | |
) | |
audio_segment.export(temp_file_name, format="wav") | |
temp_file.close() | |
return temp_file_name | |
# Main function to apply audio effects | |
def apply_effects(audio_file, noise_reduction, pitch_shift_steps, time_stretch_rate): | |
audio, sr = load_audio(audio_file) | |
if noise_reduction: | |
audio = reduce_noise(audio, sr) | |
if pitch_shift_steps != 0: | |
audio = pitch_shift(audio, sr, pitch_shift_steps) | |
if time_stretch_rate != 1.0: | |
audio = time_stretch(audio, time_stretch_rate) | |
return save_audio(audio, sr) | |
# Gradio UI | |
def build_ui(): | |
with gr.Blocks() as demo: | |
# Center-aligned Title | |
gr.Markdown("<h1 style='text-align: center;'>Shyam's AI Audio Studio</h1>") | |
# Center-aligned Description | |
gr.Markdown( | |
""" | |
<div style='text-align: center;'> | |
<p>Welcome to <strong>Shyam's AI Audio Studio</strong>!</p> | |
<p>This tool allows you to upload audio files and apply various effects like:</p> | |
<ul style="display: inline-block; text-align: left;"> | |
<li>Noise Reduction</li> | |
<li>Pitch Shifting (up or down by semitones)</li> | |
<li>Time Stretching (speed up or slow down)</li> | |
</ul> | |
<p>Experiment with the sliders to fine-tune the effects and get your desired sound!</p> | |
</div> | |
""" | |
) | |
# Input components | |
audio_input = gr.Audio(type="filepath", label="Upload Audio File") | |
noise_reduction = gr.Checkbox(label="Apply Noise Reduction", value=True) | |
pitch_shift_steps = gr.Slider(label="Pitch Shift (in semitones)", minimum=-12, maximum=12, value=0, step=1) | |
time_stretch_rate = gr.Slider(label="Time Stretch Rate", minimum=0.5, maximum=2.0, value=1.0, step=0.1) | |
# Output component | |
audio_output = gr.File(label="Download Edited Audio") | |
# Button to trigger the process | |
edit_button = gr.Button("Apply Effects") | |
# Link the button to the effect function | |
edit_button.click( | |
apply_effects, | |
inputs=[audio_input, noise_reduction, pitch_shift_steps, time_stretch_rate], | |
outputs=audio_output | |
) | |
return demo | |
# Launch the Gradio app | |
if __name__ == "__main__": | |
ui = build_ui() | |
ui.launch() |