xribene's picture
Update app.py
a2e9eab verified
from typing import Dict
from pathlib import Path
import librosa
import torch
import gradio as gr
from pyharp import *
def hpss(signal, **kwargs):
h, p = librosa.effects.hpss(signal.audio_data.squeeze().numpy(), **kwargs)
if h.ndim == 1:
h = h[None, None, :]
p = p[None, None, :]
elif h.ndim == 2:
h = h[None, :, :]
p = p[None, :, :]
else:
assert False
harmonic_signal = signal.clone()
harmonic_signal.audio_data = torch.from_numpy(h)
percussive_signal = signal.clone()
percussive_signal.audio_data = torch.from_numpy(p)
return harmonic_signal, percussive_signal
MIN_DB = -120
def process_fn(audio_file_path,
harmonic_db: float,
percussive_db: float,
kernel_size: int = 31,
margin: float = 1.0):
sig = load_audio(audio_file_path)
harmonic, percussive = hpss(sig, kernel_size=int(kernel_size), margin=margin)
def clip(db):
if db == MIN_DB:
db = -float("inf")
return db
# mix the signals, apply gain
sig = (
harmonic.volume_change(clip(harmonic_db))
+ percussive.volume_change(clip(percussive_db))
)
output_audio_path = save_audio(sig)
# No output labels
output_labels = LabelList()
return output_audio_path, output_labels
# Create a ModelCard
model_card = ModelCard(
name="Harmonic / Percussive Separation",
description="Remix a Track into its harmonic and percussive components.",
author="TEAMuP",
tags=["example", "separator", "hpss"],
midi_in=False,
midi_out=False
)
# Build the endpoint
with gr.Blocks() as demo:
# Define your Gradio interface
components = [
gr.Slider(
minimum=MIN_DB, maximum=24,
step=1, value=0,
label="Harmonic Level (dB)"
),
gr.Slider(
minimum=MIN_DB, maximum=24,
step=1, value=0,
label="Percussive Level (dB)"
),
gr.Slider(
minimum=1, maximum=101,
step=1, value=31,
label="Kernel Size"
),
gr.Slider(
minimum=0.5, maximum=5.0,
step=0.1, value=1.0,
label="Margin"
),
]
# Build the endpoint
widgets = build_endpoint(model_card, components, process_fn)
demo.queue().launch(share=True, show_error=True)