File size: 3,989 Bytes
8d340e2
 
28f6cf8
8d340e2
 
 
28f6cf8
8d340e2
 
ff7b1c4
28f6cf8
8d340e2
 
28f6cf8
 
 
 
 
 
 
 
 
 
 
8d340e2
28f6cf8
 
 
 
 
 
 
 
8d340e2
 
 
28f6cf8
8d340e2
28f6cf8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8d340e2
 
 
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
110
111
112
113
114
115
116
117
import spaces
import torch
import numpy as np
import gradio as gr
from diffusers import StableAudioPipeline

# 1. Load pipeline on CPU initialized with FP16
pipe = StableAudioPipeline.from_pretrained(
    "stabilityai/stable-audio-open-1.0", 
    torch_dtype=torch.float16,
    token=True
)

@spaces.GPU(duration=120)
def generate_audio(
    prompt: str,
    negative_prompt: str,
    seconds: float,
    num_steps: int,
    guidance_scale: float,
    seed: int,
    num_variations: int
):
    # Move model to CUDA inside ZeroGPU function
    pipe.to("cuda")

    # Handle seed generation for reproducibility or dynamic variation
    if seed == -1:
        seed = torch.randint(0, 2**32 - 1, (1,)).item()
    
    generator = torch.Generator(device="cuda").manual_seed(int(seed))

    # Run inference with parameters
    output = pipe(
        prompt=prompt,
        negative_prompt=negative_prompt,
        audio_start_in_s=0.0,
        audio_end_in_s=seconds,
        num_inference_steps=num_steps,
        guidance_scale=guidance_scale,
        num_waveforms_per_prompt=num_variations,
        generator=generator
    )

    # Convert audio tensor outputs to tuple format for Gradio (Sample Rate, Audio Array)
    audio_outputs = []
    for waveform in output.audios:
        # Transpose tensor from (channels, samples) to (samples, channels)
        audio_data = waveform.T.cpu().numpy()
        audio_outputs.append((44100, audio_data))

    # Pad list to match max 4 variation outputs in Gradio UI
    while len(audio_outputs) < 4:
        audio_outputs.append(None)

    return (*audio_outputs, f"Used Seed: {int(seed)}")

# Build Gradio UI
with gr.Blocks(title="Stable Audio Studio Pro") as demo:
    gr.Markdown("# 🎵 Stable Audio Generator (With Inference & Variation Controls)")
    
    with gr.Row():
        with gr.Column(scale=1):
            prompt = gr.Textbox(
                label="Prompt", 
                value="Heavy metal door slam in an echoing dungeon, crisp transient impact",
                lines=2
            )
            negative_prompt = gr.Textbox(
                label="Negative Prompt", 
                value="low quality, distortion, noise, background speech",
                lines=2
            )
            
            # --- Inference Parameters ---
            with gr.Accordion("⚙️ Inference Parameters", open=True):
                seconds = gr.Slider(minimum=1, maximum=47, value=10, step=0.5, label="Duration (Seconds)")
                num_steps = gr.Slider(minimum=20, maximum=200, value=100, step=5, label="Inference Steps")
                guidance_scale = gr.Slider(minimum=1.0, maximum=15.0, value=7.0, step=0.5, label="Guidance Scale (CFG)")

            # --- Variations Configuration ---
            with gr.Accordion("🎲 Variations & Seed Settings", open=True):
                num_variations = gr.Slider(minimum=1, maximum=4, value=2, step=1, label="Number of Variations")
                seed = gr.Number(label="Seed (-1 for Random)", value=-1, precision=0)
            
            generate_btn = gr.Button("Generate Sound Effects", variant="primary")
            seed_info = gr.Textbox(label="Active Seed Used", interactive=False)

        # --- Output Audio Variations ---
        with gr.Column(scale=1):
            gr.Markdown("### Generated Audio Variations")
            audio_out_1 = gr.Audio(label="Variation 1")
            audio_out_2 = gr.Audio(label="Variation 2")
            audio_out_3 = gr.Audio(label="Variation 3")
            audio_out_4 = gr.Audio(label="Variation 4")

    generate_btn.click(
        fn=generate_audio,
        inputs=[
            prompt, 
            negative_prompt, 
            seconds, 
            num_steps, 
            guidance_scale, 
            seed, 
            num_variations
        ],
        outputs=[
            audio_out_1, 
            audio_out_2, 
            audio_out_3, 
            audio_out_4, 
            seed_info
        ]
    )

demo.launch()