ghostai1 commited on
Commit
fdc5f70
·
verified ·
1 Parent(s): e05183d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +54 -29
app.py CHANGED
@@ -1,4 +1,5 @@
1
-
 
2
  import os, sys, gc, time, warnings, tempfile
3
  import torch, torchaudio, numpy as np, gradio as gr
4
  from pydub import AudioSegment
@@ -6,66 +7,90 @@ from audiocraft.models import MusicGen
6
  from huggingface_hub import login
7
 
8
  warnings.filterwarnings("ignore")
9
- os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:128"
10
 
11
- # Auth setup
12
  HF_TOKEN = os.getenv("HF_TOKEN")
13
  if not HF_TOKEN:
14
  sys.exit("ERROR: HF_TOKEN not set.")
15
  login(HF_TOKEN)
16
 
17
- # Device setup
18
  device = "cuda" if torch.cuda.is_available() else "cpu"
19
  print(f"Running on {device.upper()}")
20
- torch.cuda.empty_cache(); gc.collect()
21
 
22
- # Load model correctly
23
- musicgen = MusicGen.get_pretrained("medium", device=device)
24
- musicgen.set_generation_params(duration=10, two_step_cfg=False)
 
 
 
25
 
 
 
 
 
 
 
 
26
  def generate_music(prompt, cfg, top_k, top_p, temp, total_len, chunk_len, crossfade):
27
  if not prompt.strip():
28
  return None, "⚠️ Enter a valid prompt."
29
 
30
- sample_rate = musicgen.sample_rate
31
- segments = []
32
-
33
- for _ in range(total_len // chunk_len):
34
  with torch.no_grad():
35
- audio = musicgen.generate([prompt])[0].cpu().float()
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
- audio = audio if audio.dim() == 2 else audio.repeat(2, 1)
38
  with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp:
39
- torchaudio.save(tmp.name, audio, sample_rate)
40
- seg = AudioSegment.from_wav(tmp.name)
41
  os.unlink(tmp.name)
42
- segments.append(seg)
43
- torch.cuda.empty_cache(); gc.collect()
 
44
 
 
45
  final = segments[0]
46
  for seg in segments[1:]:
47
  final = final.append(seg, crossfade=crossfade)
48
- final = final[:total_len * 1000].fade_in(1000).fade_out(1000).normalize(-9.0)
 
49
 
50
  out_path = "output_cleaned.mp3"
51
  final.export(out_path, format="mp3", bitrate="128k", tags={"title": "GhostAI Track", "artist": "GhostAI"})
52
- return out_path, "✅ Done!"
53
 
54
- # Gradio Interface
 
 
55
  demo = gr.Interface(
56
  fn=generate_music,
57
  inputs=[
58
  gr.Textbox(label="Instrumental Prompt"),
59
- gr.Slider(1.0, 10.0, value=3.0, label="CFG Scale"),
60
- gr.Slider(10, 500, value=250, label="Top-K"),
61
- gr.Slider(0.0, 1.0, value=0.9, label="Top-P"),
62
- gr.Slider(0.1, 2.0, value=1.0, label="Temperature"),
63
- gr.Radio([30, 60, 90, 120], value=30, label="Length (s)"),
64
- gr.Slider(5, 15, value=10, label="Chunk Length (s)"),
65
- gr.Slider(100, 2000, value=1000, label="Crossfade (ms)")
66
  ],
67
  outputs=[
68
- gr.Audio(label="Generated Music"),
69
  gr.Textbox(label="Status")
70
  ],
71
  title="👻 GhostAI Music Generator",
 
1
+ #!/usr/bin/env python3
2
+ # GhostAI Music Generator for Hugging Face Spaces
3
  import os, sys, gc, time, warnings, tempfile
4
  import torch, torchaudio, numpy as np, gradio as gr
5
  from pydub import AudioSegment
 
7
  from huggingface_hub import login
8
 
9
  warnings.filterwarnings("ignore")
 
10
 
11
+ # Hugging Face token authentication
12
  HF_TOKEN = os.getenv("HF_TOKEN")
13
  if not HF_TOKEN:
14
  sys.exit("ERROR: HF_TOKEN not set.")
15
  login(HF_TOKEN)
16
 
17
+ # Simple GPU check suitable for Hugging Face
18
  device = "cuda" if torch.cuda.is_available() else "cpu"
19
  print(f"Running on {device.upper()}")
 
20
 
21
+ def clean_resources():
22
+ if device == "cuda":
23
+ torch.cuda.empty_cache()
24
+ gc.collect()
25
+
26
+ clean_resources()
27
 
28
+ # Load MusicGen model explicitly on correct device
29
+ print("Loading MusicGen 'medium' model...")
30
+ musicgen = MusicGen.get_pretrained("medium")
31
+ musicgen.lm.to(device)
32
+ musicgen.set_generation_params(duration=10)
33
+
34
+ # Core generation logic
35
  def generate_music(prompt, cfg, top_k, top_p, temp, total_len, chunk_len, crossfade):
36
  if not prompt.strip():
37
  return None, "⚠️ Enter a valid prompt."
38
 
39
+ segments, sr = [], musicgen.sample_rate
40
+ chunks = max(1, total_len // chunk_len)
41
+
42
+ for _ in range(chunks):
43
  with torch.no_grad():
44
+ audio = musicgen.generate(
45
+ [prompt],
46
+ progress=False,
47
+ temperature=temp,
48
+ cfg_coef=cfg,
49
+ top_k=top_k,
50
+ top_p=top_p,
51
+ duration=chunk_len
52
+ )[0].cpu().float()
53
+
54
+ if audio.dim() == 1:
55
+ audio = audio.unsqueeze(0).repeat(2, 1)
56
+ elif audio.shape[0] == 1:
57
+ audio = audio.repeat(2, 1)
58
 
 
59
  with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp:
60
+ torchaudio.save(tmp.name, audio, sr)
61
+ segment = AudioSegment.from_wav(tmp.name)
62
  os.unlink(tmp.name)
63
+ segments.append(segment)
64
+
65
+ clean_resources()
66
 
67
+ # Concatenate audio segments
68
  final = segments[0]
69
  for seg in segments[1:]:
70
  final = final.append(seg, crossfade=crossfade)
71
+
72
+ final = final[:total_len * 1000].fade_in(1000).fade_out(1000).normalize(headroom=-9.0)
73
 
74
  out_path = "output_cleaned.mp3"
75
  final.export(out_path, format="mp3", bitrate="128k", tags={"title": "GhostAI Track", "artist": "GhostAI"})
 
76
 
77
+ return out_path, "✅ Music Generation Complete!"
78
+
79
+ # Simple Gradio Interface
80
  demo = gr.Interface(
81
  fn=generate_music,
82
  inputs=[
83
  gr.Textbox(label="Instrumental Prompt"),
84
+ gr.Slider(1.0, 10.0, value=3.0, step=0.1, label="CFG Scale"),
85
+ gr.Slider(10, 500, value=250, step=10, label="Top-K"),
86
+ gr.Slider(0.0, 1.0, value=0.9, step=0.05, label="Top-P"),
87
+ gr.Slider(0.1, 2.0, value=1.0, step=0.1, label="Temperature"),
88
+ gr.Radio([30, 60, 90, 120], value=30, label="Length (seconds)"),
89
+ gr.Slider(5, 15, value=10, step=1, label="Chunk Length (seconds)"),
90
+ gr.Slider(100, 2000, value=1000, step=100, label="Crossfade (ms)")
91
  ],
92
  outputs=[
93
+ gr.Audio(label="Generated Music", type="filepath"),
94
  gr.Textbox(label="Status")
95
  ],
96
  title="👻 GhostAI Music Generator",