File size: 3,303 Bytes
fdc5f70
 
e05183d
 
87e4401
2c690c6
857db5b
87e4401
 
 
fdc5f70
779076d
 
e05183d
 
857db5b
fdc5f70
87e4401
779076d
 
fdc5f70
 
 
 
 
 
779076d
fdc5f70
 
 
 
 
 
 
e05183d
2c690c6
e05183d
c3aa73a
fdc5f70
 
 
 
e05183d
fdc5f70
 
 
 
 
 
 
 
 
 
 
 
 
 
c3aa73a
 
fdc5f70
 
2c690c6
fdc5f70
 
 
c3aa73a
fdc5f70
c3aa73a
 
e05183d
fdc5f70
 
c3aa73a
 
e05183d
779076d
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
#!/usr/bin/env python3
# GhostAI Music Generator for Hugging Face Spaces
import os, sys, gc, time, warnings, tempfile
import torch, torchaudio, numpy as np, gradio as gr
from pydub import AudioSegment
from audiocraft.models import MusicGen
from huggingface_hub import login

warnings.filterwarnings("ignore")

# Hugging Face token authentication
HF_TOKEN = os.getenv("HF_TOKEN")
if not HF_TOKEN:
    sys.exit("ERROR: HF_TOKEN not set.")
login(HF_TOKEN)

# Simple GPU check suitable for Hugging Face
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Running on {device.upper()}")

def clean_resources():
    if device == "cuda":
        torch.cuda.empty_cache()
    gc.collect()

clean_resources()

# Load MusicGen model explicitly on correct device
print("Loading MusicGen 'medium' model...")
musicgen = MusicGen.get_pretrained("medium")
musicgen.lm.to(device)
musicgen.set_generation_params(duration=10)

# Core generation logic
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."

    segments, sr = [], musicgen.sample_rate
    chunks = max(1, total_len // chunk_len)
    
    for _ in range(chunks):
        with torch.no_grad():
            audio = musicgen.generate(
                [prompt],
                progress=False,
                temperature=temp,
                cfg_coef=cfg,
                top_k=top_k,
                top_p=top_p,
                duration=chunk_len
            )[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, sr)
            segment = AudioSegment.from_wav(tmp.name)
        os.unlink(tmp.name)
        segments.append(segment)

        clean_resources()

    # Concatenate audio segments
    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, "✅ Music Generation Complete!"

# Simple Gradio Interface
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)