SUNO-API / app.py
haraberget's picture
Create app.py
d15c3c8 verified
raw
history blame
2.87 kB
import gradio as gr
import requests
# -----------------------------
# CONFIG
# -----------------------------
SUNO_API_BASE = "https://api.sunoapi.org"
API_KEY = "YOUR_API_KEY_HERE" # set via env in real use
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# -----------------------------
# API HELPERS (minimal, clear)
# -----------------------------
def generate_lyrics(theme, style):
payload = {
"prompt": f"Theme: {theme}. Style: {style}."
}
r = requests.post(f"{SUNO_API_BASE}/lyrics/generate", json=payload, headers=HEADERS)
r.raise_for_status()
return r.json().get("lyrics", "")
def generate_song(prompt, lyrics, model="v5"):
payload = {
"model": model,
"prompt": prompt,
"lyrics": lyrics
}
r = requests.post(f"{SUNO_API_BASE}/music/generate", json=payload, headers=HEADERS)
r.raise_for_status()
return r.json()
def separate_vocals(song_id):
payload = {"song_id": song_id}
r = requests.post(f"{SUNO_API_BASE}/audio/separate", json=payload, headers=HEADERS)
r.raise_for_status()
return r.json()
# -----------------------------
# GRADIO LOGIC
# -----------------------------
def run_pipeline(style, theme, custom_lyrics):
# Step 1: lyrics
if not custom_lyrics.strip():
lyrics = generate_lyrics(theme, style)
else:
lyrics = custom_lyrics
# Step 2: song
song = generate_song(style, lyrics)
song_id = song.get("id")
audio_url = song.get("audio_url")
return lyrics, audio_url, song_id
def run_separation(song_id):
result = separate_vocals(song_id)
return result.get("vocals_url"), result.get("instrumental_url")
# -----------------------------
# UI
# -----------------------------
with gr.Blocks(title="AI Music Instrument – Suno") as app:
gr.Markdown("# 🎵 AI Music Instrument (Suno API)\nTreat AI like a studio instrument, not a platform.")
with gr.Row():
style = gr.Textbox(label="Style / Genre", placeholder="old ballad, lute, choir, dark medieval")
theme = gr.Textbox(label="Theme", placeholder="fallen king, fate, prophecy")
lyrics_input = gr.Textbox(label="Custom Lyrics (optional)", lines=6)
run_btn = gr.Button("Generate Song")
lyrics_out = gr.Textbox(label="Lyrics Used", lines=8)
audio_out = gr.Audio(label="Generated Song", type="filepath")
song_id_out = gr.Textbox(label="Song ID")
gr.Markdown("## 🎚 Stem Separation")
sep_btn = gr.Button("Separate Vocals / Instrumental")
vocals_out = gr.Audio(label="Vocals Stem", type="filepath")
inst_out = gr.Audio(label="Instrumental Stem", type="filepath")
run_btn.click(run_pipeline, [style, theme, lyrics_input], [lyrics_out, audio_out, song_id_out])
sep_btn.click(run_separation, song_id_out, [vocals_out, inst_out])
app.launch()