File size: 3,332 Bytes
fdc5f70
e4df913
 
 
 
 
 
 
 
 
 
 
 
 
87e4401
2c690c6
857db5b
87e4401
 
 
e4df913
779076d
 
e05183d
 
857db5b
e4df913
87e4401
779076d
 
f950faf
779076d
e4df913
fdc5f70
 
 
 
f950faf
 
 
 
 
e4df913
e05183d
2c690c6
e05183d
c3aa73a
f950faf
 
fdc5f70
e4df913
fdc5f70
e05183d
fdc5f70
 
 
 
 
 
f950faf
 
fdc5f70
 
 
 
 
 
c3aa73a
 
f950faf
fdc5f70
2c690c6
fdc5f70
 
 
c3aa73a
 
 
e05183d
fdc5f70
 
c3aa73a
 
e05183d
779076d
f950faf
fdc5f70
e05183d
 
 
 
fdc5f70
 
 
 
 
 
 
e05183d
 
fdc5f70
e05183d
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/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)