Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -1,19 +1,28 @@
|
|
1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
# ββ 1. Standard libs βββββββββββββββββββββββββββββββββββββββββββββββ
|
4 |
import os, sys, gc, time, warnings, tempfile, subprocess, random
|
5 |
import numpy as np, psutil
|
6 |
|
7 |
-
# ββ 2. Torch stack (torch 2.1.0
|
8 |
import torch, torchaudio
|
9 |
|
10 |
-
# ββ 3.
|
11 |
import gradio as gr
|
12 |
from pydub import AudioSegment
|
13 |
from huggingface_hub import login
|
14 |
from torch.cuda.amp import autocast
|
15 |
|
16 |
-
# ββ 4. Torch <2.3 shim (transformers 4.38
|
17 |
if not hasattr(torch, "get_default_device"):
|
18 |
torch.get_default_device = lambda: torch.device(
|
19 |
"cuda" if torch.cuda.is_available() else "cpu"
|
@@ -22,7 +31,7 @@ if not hasattr(torch, "get_default_device"):
|
|
22 |
warnings.filterwarnings("ignore")
|
23 |
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:128"
|
24 |
|
25 |
-
# ββ 5. Install audiocraft
|
26 |
try:
|
27 |
from audiocraft.models import MusicGen
|
28 |
except ModuleNotFoundError:
|
@@ -35,7 +44,7 @@ except ModuleNotFoundError:
|
|
35 |
# ββ 6. Hugging Face authentication ββββββββββββββββββββββββββββββββ
|
36 |
HF_TOKEN = os.getenv("HF_TOKEN")
|
37 |
if not HF_TOKEN:
|
38 |
-
sys.exit("ERROR:
|
39 |
login(HF_TOKEN)
|
40 |
|
41 |
# ββ 7. Load MusicGen model ββββββββββββββββββββββββββββββββββββββββ
|
@@ -45,15 +54,15 @@ musicgen.to(torch.get_default_device())
|
|
45 |
musicgen.set_generation_params(duration=10, two_step_cfg=False)
|
46 |
SR = musicgen.sample_rate
|
47 |
|
48 |
-
# ββ 8. Prompt builders (add more
|
49 |
def _build(base,bpm,dr,syn,st,bass,gtr,def_bass,def_gtr,flow):
|
50 |
-
|
51 |
return (f"{base}"
|
52 |
f"{def_bass if bass=='none' else ', '+bass}"
|
53 |
f"{def_gtr if gtr=='none' else ', '+gtr+' guitar riffs'}"
|
54 |
f"{'' if dr=='none' else ', '+dr+' drums'}"
|
55 |
f"{'' if syn=='none' else ', '+syn+' accents'}"
|
56 |
-
f"{
|
57 |
|
58 |
def set_rhcp(bpm,dr,syn,st,bass,gtr):
|
59 |
return _build("Instrumental funk rock",bpm,dr,syn,st,bass,gtr,
|
@@ -65,7 +74,7 @@ def set_nirvana(bpm,dr,syn,st,bass,gtr):
|
|
65 |
", melodic basslines",", raw distorted guitar riffs",
|
66 |
"{bpm} BPM grungy pulse" if bpm>120 else "grungy rhythmic pulse")
|
67 |
|
68 |
-
# (
|
69 |
|
70 |
# ββ 9. Audio post-FX helpers ββββββββββββββββββββββββββββββββββββββ
|
71 |
def apply_eq(seg): return seg.low_pass_filter(8000).high_pass_filter(80)
|
@@ -77,9 +86,9 @@ def log(stage=""):
|
|
77 |
a = torch.cuda.memory_allocated()/1024**3
|
78 |
r = torch.cuda.memory_reserved()/1024**3
|
79 |
print(f"GPU alloc {a:.2f} GB reserved {r:.2f} GB")
|
80 |
-
print(f"CPU {psutil.virtual_memory().percent}%
|
81 |
|
82 |
-
# ββ 10. Core
|
83 |
@spaces.GPU
|
84 |
def generate(prompt,cfg,k,p,temp,
|
85 |
total_len,chunk_len,xfade,
|
@@ -121,34 +130,33 @@ def generate(prompt,cfg,k,p,temp,
|
|
121 |
track = track[: total_len*1000]
|
122 |
track = apply_fade(apply_eq(track).normalize(headroom=-9.0))
|
123 |
|
124 |
-
|
125 |
-
track.export(
|
126 |
tags={"title":"GhostAI Track","artist":"GhostAI"})
|
127 |
-
return
|
128 |
|
129 |
def clear_inputs():
|
130 |
return ("",3.0,250,0.9,1.0,30,10,1000,
|
131 |
120,"none","none","none","none","none")
|
132 |
|
133 |
-
# ββ 11. Gradio
|
134 |
with gr.Blocks(css="body{background:#0A0A0A;color:#E0E0E0;font-family:'Orbitron',sans-serif}") as demo:
|
135 |
gr.Markdown("<h1 style='text-align:center'>π» GhostAI MusicGen</h1>")
|
136 |
prompt = gr.Textbox(lines=4, label="Instrumental Prompt")
|
137 |
|
138 |
with gr.Row():
|
139 |
gr.Button("RHCP πΆοΈ").click(set_rhcp,
|
140 |
-
|
141 |
-
|
142 |
gr.Button("Nirvana πΈ").click(set_nirvana,
|
143 |
-
|
144 |
-
|
145 |
-
# β
|
146 |
|
147 |
-
# Parameter controls
|
148 |
cfg = gr.Slider(1,10,3,label="CFG")
|
149 |
-
|
150 |
-
|
151 |
-
temp = gr.Slider(0.1,2,1,label="
|
152 |
length= gr.Radio([30,60,90,120],value=30,label="Length (s)")
|
153 |
chunk = gr.Slider(5,15,10,label="Chunk (s)")
|
154 |
xfade = gr.Slider(100,2000,1000,label="Cross-fade (ms)")
|
@@ -162,15 +170,13 @@ with gr.Blocks(css="body{background:#0A0A0A;color:#E0E0E0;font-family:'Orbitron'
|
|
162 |
|
163 |
gen = gr.Button("Generate π")
|
164 |
clr = gr.Button("Clear π§Ή")
|
165 |
-
|
166 |
-
status
|
167 |
|
168 |
gen.click(generate,
|
169 |
-
|
170 |
-
|
171 |
-
outputs=[audio_out,status])
|
172 |
clr.click(clear_inputs, None,
|
173 |
-
[prompt,cfg,
|
174 |
-
bpm,drum,synth,steps,bass,gtr])
|
175 |
|
176 |
demo.launch(share=False)
|
|
|
1 |
+
#!/usr/bin/env python3
|
2 |
+
"""
|
3 |
+
GhostAI Music Generator β ZeroGPU Space
|
4 |
+
β’ Streams facebook/musicgen-medium from the Hub using your HF_TOKEN
|
5 |
+
β’ Installs audiocraft 1.3.0 (no-deps) at runtime
|
6 |
+
β’ Decorated with @spaces.GPU so each request gets a free transient GPU
|
7 |
+
"""
|
8 |
+
|
9 |
+
# ββ 0. ZeroGPU decorator (must be first) βββββββββββββββββββββββββββ
|
10 |
+
import spaces # <-- leave this as the very first import
|
11 |
|
12 |
# ββ 1. Standard libs βββββββββββββββββββββββββββββββββββββββββββββββ
|
13 |
import os, sys, gc, time, warnings, tempfile, subprocess, random
|
14 |
import numpy as np, psutil
|
15 |
|
16 |
+
# ββ 2. Torch stack (torch 2.1.0 / torchaudio 2.1.0 from requirements) β
|
17 |
import torch, torchaudio
|
18 |
|
19 |
+
# ββ 3. Misc deps ββββββββββββββββββββββββββββββββββββββββββββββββββ
|
20 |
import gradio as gr
|
21 |
from pydub import AudioSegment
|
22 |
from huggingface_hub import login
|
23 |
from torch.cuda.amp import autocast
|
24 |
|
25 |
+
# ββ 4. Torch <2.3 shim (transformers 4.38 expects it) βββββββββββββ
|
26 |
if not hasattr(torch, "get_default_device"):
|
27 |
torch.get_default_device = lambda: torch.device(
|
28 |
"cuda" if torch.cuda.is_available() else "cpu"
|
|
|
31 |
warnings.filterwarnings("ignore")
|
32 |
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:128"
|
33 |
|
34 |
+
# ββ 5. Install audiocraft 1.3.0 (no deps) at runtime ββββββββββββββ
|
35 |
try:
|
36 |
from audiocraft.models import MusicGen
|
37 |
except ModuleNotFoundError:
|
|
|
44 |
# ββ 6. Hugging Face authentication ββββββββββββββββββββββββββββββββ
|
45 |
HF_TOKEN = os.getenv("HF_TOKEN")
|
46 |
if not HF_TOKEN:
|
47 |
+
sys.exit("ERROR: Add HF_TOKEN as a secret in your Space settings.")
|
48 |
login(HF_TOKEN)
|
49 |
|
50 |
# ββ 7. Load MusicGen model ββββββββββββββββββββββββββββββββββββββββ
|
|
|
54 |
musicgen.set_generation_params(duration=10, two_step_cfg=False)
|
55 |
SR = musicgen.sample_rate
|
56 |
|
57 |
+
# ββ 8. Prompt builders (add more as needed) βββββββββββββββββββββββ
|
58 |
def _build(base,bpm,dr,syn,st,bass,gtr,def_bass,def_gtr,flow):
|
59 |
+
step = f" with {st}" if st!="none" else flow.format(bpm=bpm)
|
60 |
return (f"{base}"
|
61 |
f"{def_bass if bass=='none' else ', '+bass}"
|
62 |
f"{def_gtr if gtr=='none' else ', '+gtr+' guitar riffs'}"
|
63 |
f"{'' if dr=='none' else ', '+dr+' drums'}"
|
64 |
f"{'' if syn=='none' else ', '+syn+' accents'}"
|
65 |
+
f"{step} at {bpm} BPM.")
|
66 |
|
67 |
def set_rhcp(bpm,dr,syn,st,bass,gtr):
|
68 |
return _build("Instrumental funk rock",bpm,dr,syn,st,bass,gtr,
|
|
|
74 |
", melodic basslines",", raw distorted guitar riffs",
|
75 |
"{bpm} BPM grungy pulse" if bpm>120 else "grungy rhythmic pulse")
|
76 |
|
77 |
+
# (β Add remaining genre prompt functions here the same way.)
|
78 |
|
79 |
# ββ 9. Audio post-FX helpers ββββββββββββββββββββββββββββββββββββββ
|
80 |
def apply_eq(seg): return seg.low_pass_filter(8000).high_pass_filter(80)
|
|
|
86 |
a = torch.cuda.memory_allocated()/1024**3
|
87 |
r = torch.cuda.memory_reserved()/1024**3
|
88 |
print(f"GPU alloc {a:.2f} GB reserved {r:.2f} GB")
|
89 |
+
print(f"CPU {psutil.virtual_memory().percent}%")
|
90 |
|
91 |
+
# ββ 10. Core generator (ZeroGPU wrapper) ββββββββββββββββββββββββββ
|
92 |
@spaces.GPU
|
93 |
def generate(prompt,cfg,k,p,temp,
|
94 |
total_len,chunk_len,xfade,
|
|
|
130 |
track = track[: total_len*1000]
|
131 |
track = apply_fade(apply_eq(track).normalize(headroom=-9.0))
|
132 |
|
133 |
+
out_f = "output_cleaned.mp3"
|
134 |
+
track.export(out_f, format="mp3", bitrate="128k",
|
135 |
tags={"title":"GhostAI Track","artist":"GhostAI"})
|
136 |
+
return out_f, "β
Done!"
|
137 |
|
138 |
def clear_inputs():
|
139 |
return ("",3.0,250,0.9,1.0,30,10,1000,
|
140 |
120,"none","none","none","none","none")
|
141 |
|
142 |
+
# ββ 11. Gradio UI βββββββββββββββββββββββββββββββββββββββββββββββββ
|
143 |
with gr.Blocks(css="body{background:#0A0A0A;color:#E0E0E0;font-family:'Orbitron',sans-serif}") as demo:
|
144 |
gr.Markdown("<h1 style='text-align:center'>π» GhostAI MusicGen</h1>")
|
145 |
prompt = gr.Textbox(lines=4, label="Instrumental Prompt")
|
146 |
|
147 |
with gr.Row():
|
148 |
gr.Button("RHCP πΆοΈ").click(set_rhcp,
|
149 |
+
inputs=[gr.State(120),"none","none","none","none","none"],
|
150 |
+
outputs=prompt)
|
151 |
gr.Button("Nirvana πΈ").click(set_nirvana,
|
152 |
+
inputs=[gr.State(120),"none","none","none","none","none"],
|
153 |
+
outputs=prompt)
|
154 |
+
# β add more genre buttons β¦
|
155 |
|
|
|
156 |
cfg = gr.Slider(1,10,3,label="CFG")
|
157 |
+
k = gr.Slider(10,500,250,step=10,label="Top-K")
|
158 |
+
p = gr.Slider(0,1,0.9,step=0.05,label="Top-P")
|
159 |
+
temp = gr.Slider(0.1,2,1,label="Temp")
|
160 |
length= gr.Radio([30,60,90,120],value=30,label="Length (s)")
|
161 |
chunk = gr.Slider(5,15,10,label="Chunk (s)")
|
162 |
xfade = gr.Slider(100,2000,1000,label="Cross-fade (ms)")
|
|
|
170 |
|
171 |
gen = gr.Button("Generate π")
|
172 |
clr = gr.Button("Clear π§Ή")
|
173 |
+
audio = gr.Audio(type="filepath")
|
174 |
+
status= gr.Textbox(interactive=False)
|
175 |
|
176 |
gen.click(generate,
|
177 |
+
[prompt,cfg,k,p,temp,length,chunk,xfade,bpm,drum,synth,steps,bass,gtr],
|
178 |
+
[audio,status])
|
|
|
179 |
clr.click(clear_inputs, None,
|
180 |
+
[prompt,cfg,k,p,temp,length,chunk,xfade,bpm,drum,synth,steps,bass,gtr])
|
|
|
181 |
|
182 |
demo.launch(share=False)
|