| import gradio as gr |
| import torch |
| from pyharp import ModelCard, build_endpoint, LabelList, AudioLabel, OutputLabel |
| from skey.key_detection import detect_key |
|
|
| |
| DEVICE = "cuda" if torch.cuda.is_available() else "cpu" |
|
|
| |
| model_card = ModelCard( |
| name="S-KEY Detection", |
| description="Major/Minor Key detection from audio using Self-supervised Key Detection.", |
| author="Deezer Research", |
| tags=["key detection", "mir"], |
| ) |
|
|
| |
| def process_fn(input_audio_path): |
| try: |
| ext = input_audio_path.split(".")[-1].lower() |
|
|
| detected_keys = detect_key( |
| input_audio_path, |
| extension=ext, |
| device=DEVICE, |
| cli=False |
| ) |
|
|
| print("Raw output:", detected_keys) |
|
|
| if not detected_keys: |
| raise ValueError("No key detected") |
|
|
| detected_key = detected_keys[0] |
|
|
| labels = LabelList() |
| labels.labels.append( |
| AudioLabel( |
| t=0.0, |
| duration=5.0, |
| label=detected_key, |
| amplitude=0.8, |
| description="Detected by S-KEY", |
| color=OutputLabel.rgb_color_to_int(255, 100, 100, 0.8), |
| ) |
| ) |
|
|
| return input_audio_path, labels |
|
|
| except Exception as e: |
| print("Error:", e) |
| raise e |
|
|
|
|
| |
| with gr.Blocks() as demo: |
| input_audio = gr.Audio(label="Input Audio", type="filepath").harp_required(True) |
| |
| output_audio = gr.Audio(label="Output Audio", type="filepath") |
| output_labels = gr.JSON(label="Analysis Labels") |
|
|
| build_endpoint( |
| model_card=model_card, |
| process_fn=process_fn, |
| input_components=[input_audio], |
| output_components=[output_audio, output_labels], |
| ) |
|
|
|
|
| if __name__ == "__main__": |
| demo.queue().launch() |
|
|