ghostai1's picture
Update app.py
e4df913 verified
raw
history blame
3.33 kB
#!/usr/bin/env python3
# GhostAI Music Generator Hugging Face Spaces GPU-Compatible
import spaces # <--- Must be imported FIRST before torch and CUDA
import os
import sys
import gc
import warnings
import tempfile
import torch
import torchaudio
import numpy as np
import gradio as gr
from pydub import AudioSegment
from audiocraft.models import MusicGen
from huggingface_hub import login
warnings.filterwarnings("ignore")
# Hugging Face token auth
HF_TOKEN = os.getenv("HF_TOKEN")
if not HF_TOKEN:
sys.exit("ERROR: HF_TOKEN not set.")
login(HF_TOKEN)
# Device setup
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Running on {device.upper()}")
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:128"
# Load MusicGen model explicitly on GPU
musicgen = MusicGen.get_pretrained("medium")
musicgen.lm.to(device)
musicgen.set_generation_params(duration=10)
def clean_resources():
if device == "cuda":
torch.cuda.empty_cache()
gc.collect()
@spaces.GPU # <-- Correct GPU decorator for HF
def generate_music(prompt, cfg, top_k, top_p, temp, total_len, chunk_len, crossfade):
if not prompt.strip():
return None, "⚠️ Enter a valid prompt."
sample_rate = musicgen.sample_rate
segments = []
chunks = max(1, total_len // chunk_len)
for _ in range(chunks):
with torch.no_grad():
audio = musicgen.generate(
[prompt],
temperature=temp,
cfg_coef=cfg,
top_k=top_k,
top_p=top_p,
duration=chunk_len,
progress=False
)[0].cpu().float()
if audio.dim() == 1:
audio = audio.unsqueeze(0).repeat(2, 1)
elif audio.shape[0] == 1:
audio = audio.repeat(2, 1)
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp:
torchaudio.save(tmp.name, audio, sample_rate)
segment = AudioSegment.from_wav(tmp.name)
os.unlink(tmp.name)
segments.append(segment)
clean_resources()
final = segments[0]
for seg in segments[1:]:
final = final.append(seg, crossfade=crossfade)
final = final[:total_len * 1000].fade_in(1000).fade_out(1000).normalize(headroom=-9.0)
out_path = "output_cleaned.mp3"
final.export(out_path, format="mp3", bitrate="128k", tags={"title": "GhostAI Track", "artist": "GhostAI"})
return out_path, "✅ Done!"
demo = gr.Interface(
fn=generate_music,
inputs=[
gr.Textbox(label="Instrumental Prompt"),
gr.Slider(1.0, 10.0, value=3.0, step=0.1, label="CFG Scale"),
gr.Slider(10, 500, value=250, step=10, label="Top-K"),
gr.Slider(0.0, 1.0, value=0.9, step=0.05, label="Top-P"),
gr.Slider(0.1, 2.0, value=1.0, step=0.1, label="Temperature"),
gr.Radio([30, 60, 90, 120], value=30, label="Length (seconds)"),
gr.Slider(5, 15, value=10, step=1, label="Chunk Length (seconds)"),
gr.Slider(100, 2000, value=1000, step=100, label="Crossfade (ms)")
],
outputs=[
gr.Audio(label="Generated Music", type="filepath"),
gr.Textbox(label="Status")
],
title="👻 GhostAI Music Generator",
description="Generate instrumental music using MusicGen Medium model."
)
demo.launch(share=False)