ghostai1 commited on
Commit
10d9f73
Β·
verified Β·
1 Parent(s): 0ca92bf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -32
app.py CHANGED
@@ -1,19 +1,28 @@
1
- import spaces # <-- DO NOT move this lower
 
 
 
 
 
 
 
 
 
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 & torchaudio 2.1.0 from requirements) ─
8
  import torch, torchaudio
9
 
10
- # ── 3. UI / misc deps ─────────────────────────────────────────────
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 calls get_default_device) ──
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 at runtime (no deps) ─────────────────────
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: Please add HF_TOKEN as a secret in your Space.")
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 in same style) ───────────────────
49
  def _build(base,bpm,dr,syn,st,bass,gtr,def_bass,def_gtr,flow):
50
- stxt = f" with {st}" if st!="none" else flow.format(bpm=bpm)
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"{stxt} at {bpm} BPM.")
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
- # (⚠️ Add your remaining genre functions here)
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}% used")
81
 
82
- # ── 10. Core generation (ZeroGPU decorator) ───────────────────────
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
- out_path = "output_cleaned.mp3"
125
- track.export(out_path, format="mp3", bitrate="128k",
126
  tags={"title":"GhostAI Track","artist":"GhostAI"})
127
- return out_path, "βœ… Done!"
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 Blocks UI ──────────────────────────────────────────
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
- inputs=[gr.State(120),"none","none","none","none","none"],
141
- outputs=prompt)
142
  gr.Button("Nirvana 🎸").click(set_nirvana,
143
- inputs=[gr.State(120),"none","none","none","none","none"],
144
- outputs=prompt)
145
- # βž• Add more genre buttons here …
146
 
147
- # Parameter controls
148
  cfg = gr.Slider(1,10,3,label="CFG")
149
- top_k = gr.Slider(10,500,250,step=10,label="Top-K")
150
- top_p = gr.Slider(0,1,0.9,step=0.05,label="Top-P")
151
- temp = gr.Slider(0.1,2,1,label="Temperature")
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
- audio_out = gr.Audio(type="filepath")
166
- status = gr.Textbox(interactive=False)
167
 
168
  gen.click(generate,
169
- inputs=[prompt,cfg,top_k,top_p,temp,length,chunk,xfade,
170
- bpm,drum,synth,steps,bass,gtr],
171
- outputs=[audio_out,status])
172
  clr.click(clear_inputs, None,
173
- [prompt,cfg,top_k,top_p,temp,length,chunk,xfade,
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)