Robert Jones
Fix syntax error - add missing except block
aae3141
import gradio as gr
import json
import os
import shutil
import subprocess
import sys
def install_and_import(package):
try:
__import__(package)
except ImportError:
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
def generate_song(lyrics, audio_file):
if not lyrics.strip():
return None, "❌ Please enter some lyrics!"
if audio_file is None:
return None, "❌ Please upload an audio prompt file!"
try:
yield None, "🎡 Installing dependencies..."
# Install required packages on the fly
packages = ["torch", "torchaudio", "transformers", "accelerate", "omegaconf", "lightning", "einops", "numba", "librosa", "soundfile"]
for package in packages:
try:
install_and_import(package)
except:
pass
yield None, "🎡 Setting up SongBloom environment..."
# Create input files
audio_filename = "prompt.wav"
shutil.copy(audio_file, audio_filename)
jsonl_filename = "input.jsonl"
input_data = {
"idx": "1",
"lyrics": lyrics.strip(),
"prompt_wav": audio_filename
}
with open(jsonl_filename, 'w') as f:
json.dump(input_data, f)
yield None, "🎡 Downloading SongBloom model (first time only - 5-10 minutes)..."
# Download SongBloom if not present
if not os.path.exists("songbloom_repo"):
subprocess.run(["git", "clone", "https://github.com/cypress-yang/SongBloom.git", "songbloom_repo"], check=True)
yield None, "🎡 Running AI music generation (3-8 minutes)..."
# Run SongBloom
cmd = ["python3", "songbloom_repo/infer.py", "--input-jsonl", jsonl_filename, "--dtype", "bfloat16"]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1, universal_newlines=True)
for line in process.stdout:
if "it [" in line:
yield None, f"🎡 Generating music... {line.strip()}"
process.wait()
# Look for output files more thoroughly
output_dirs = ["output", "results", "generated", "songbloom_repo/output", "songbloom_repo"]
output_file = None
for output_dir in output_dirs:
if os.path.exists(output_dir):
for file in os.listdir(output_dir):
if file.endswith(('.wav', '.mp3', '.flac')) and not file.startswith('prompt'):
output_file = os.path.join(output_dir, file)
break
if output_file:
break
if output_file and os.path.exists(output_file):
yield output_file, "βœ… Your AI song is ready! 🎡"
else:
yield None, "❌ Generation completed but output file not found. Check model setup."
except Exception as e:
yield None, f"❌ Error: {str(e)}"
# Create interface
with gr.Blocks(title="SongBloom AI Music Generator") as demo:
gr.Markdown("""
# 🎡 SongBloom AI Music Generator
**Full AI Music Generation - From Lyrics to Complete Songs**
Upload an audio style prompt and enter lyrics to generate professional AI music!
""")
with gr.Row():
with gr.Column():
lyrics_input = gr.Textbox(
label="Song Lyrics",
placeholder="Enter your song lyrics here...\n\nExample:\nHere comes the sun, doo-doo-doo-doo\nHere comes the sun, and I say it's all right",
lines=8,
value="Here comes the sun, doo-doo-doo-doo\nHere comes the sun, and I say it's all right"
)
audio_input = gr.File(
label="Audio Style Prompt (Any Audio Format)",
type="filepath"
)
generate_btn = gr.Button("🎡 Generate Full Song", variant="primary", size="lg")
with gr.Column():
status_output = gr.Textbox(
label="Generation Progress",
lines=8,
interactive=False
)
audio_output = gr.Audio(label="🎡 Your AI-Generated Song")
generate_btn.click(
fn=generate_song,
inputs=[lyrics_input, audio_input],
outputs=[audio_output, status_output],
show_progress=True
)
gr.Markdown("""
---
**⚑ Powered by SongBloom AI - Professional Music Generation**
First generation may take 10-15 minutes (downloading models). Subsequent generations: 3-8 minutes.
""")
if __name__ == "__main__":
demo.launch()