ExtendSong / app.py
szili2011's picture
Update app.py
aa3fa6d verified
import gradio as gr
import numpy as np
import librosa
# Function to load audio using librosa
def load_audio(file):
audio, sr = librosa.load(file, sr=None) # Load the audio file
return audio, sr
# Function to get a relevant audio segment based on onset detection
def get_segment(audio, sr):
onset_env = librosa.onset.onset_strength(y=audio, sr=sr)
onset_frames = librosa.onset.onset_detect(onset_envelope=onset_env, sr=sr, backtrack=True)
if len(onset_frames) == 0:
return audio[:2048], sr # Return the first 2048 samples if no onsets
# Calculate energy over time
energy = np.array([np.sum(np.abs(audio[i:i + 2048]**2)) for i in range(0, len(audio), 2048)])
# Threshold for musical relevance
energy_threshold = np.mean(energy) + np.std(energy)
relevant_onsets = [f for f in onset_frames if f < len(energy) and energy[f] > energy_threshold]
start_frame = relevant_onsets[0] if relevant_onsets else onset_frames[0]
start_sample = librosa.frames_to_samples(start_frame)
segment_length = sr # Length of segment in samples (1 second)
end_sample = min(start_sample + segment_length, len(audio))
return audio[start_sample:end_sample], sr
# Function to extend music by adding silence
def extend_music(file, added_minutes):
audio, sr = load_audio(file)
segment, sr = get_segment(audio, sr)
# Calculate additional samples
additional_samples = int(added_minutes * 60 * sr)
extended_audio = np.concatenate([segment, np.zeros(additional_samples)]) # Add silence
# Normalize audio to the range of [-1, 1]
extended_audio = extended_audio / np.max(np.abs(extended_audio)) if np.max(np.abs(extended_audio)) > 0 else extended_audio
# Return the audio as a NumPy array (float32) and the sample rate as an integer
return extended_audio.astype(np.float32), sr # Ensure it's a float32 NumPy array
# Gradio UI setup
with gr.Blocks() as app:
gr.Markdown("# Audio Extender")
audio_input = gr.Audio(type="filepath", label="Upload Audio File")
added_minutes = gr.Slider(minimum=0, maximum=10, label="Additional Minutes")
audio_output = gr.Audio(type="numpy", label="Extended Audio")
submit_button = gr.Button("Extend Audio")
submit_button.click(extend_music, inputs=[audio_input, added_minutes], outputs=audio_output)
# Launch the app with a public link
app.launch(share=True)