import os
import gradio as gr
import torch
from diffusers import StableAudioPipeline
import spaces
from translatepy import Translator
import numpy as np
import random
import soundfile as sf
translator = Translator()
# Constants
model = "stabilityai/stable-audio-open-1.0"
MAX_SEED = np.iinfo(np.int32).max
CSS = """
.gradio-container {
max-width: 690px !important;
}
footer {
visibility: hidden;
}
"""
JS = """function () {
gradioURL = window.location.href
if (!gradioURL.endsWith('?__theme=dark')) {
window.location.replace(gradioURL + '?__theme=dark');
}
}"""
DESCRIPTION = """
Stable Audio Open 1.0 generates variable-length (up to 47s) stereo audio at 44.1kHz from text prompts. \
It comprises three components: an autoencoder that compresses waveforms into a manageable sequence length, \
a T5-based text embedding for text conditioning, and a transformer-based diffusion (DiT) model that operates in the latent space of the autoencoder.
"""
pipe = StableAudioPipeline.from_pretrained(
model,
torch_dtype=torch.float16)
pipe = pipe.to("cuda")
# Function
@spaces.GPU(duration=120)
def main(
prompt,
negative="low quality",
second: float = 10.0,
seed: int = -1):
if seed == -1:
seed = random.randint(0, MAX_SEED)
seed = int(seed)
generator = torch.Generator().manual_seed(seed)
prompt = str(translator.translate(prompt, 'English'))
print(f'prompt:{prompt}')
audio = pipe(
prompt,
negative_prompt=negative,
audio_end_in_s=second,
num_inference_steps=200,
num_waveforms_per_prompt=3,
generator=generator,
).audios
os.makedirs("outputs", exist_ok=True)
base_count = len(glob(os.path.join("outputs", "*.mp4")))
audio_path = os.path.join("outputs", f"{base_count:06d}.wav")
sf.write(audio_path, audio[0].T.float().cpu().numpy(), pipe.vae.samping_rate)
return audio_path, seed
# Gradio Interface
with gr.Blocks(theme='soft', css=CSS, js=JS, title="Stable Audio Open") as iface:
with gr.Accordion(""):
gr.Markdown(DESCRIPTION)
output = gr.Audio(label="Podcast", type="filepath", interactive=False, autoplay=True, elem_classes="audio") # Create an output textbox
prompt = gr.Textbox(label="Prompt", placeholder="1000 BPM percussive sound of water drops")
negative = gr.Textbox(label="Negative prompt", placeholder="Low quality")
with gr.Row():
second = gr.Slider(5.0, 60.0, value=10.0, label="Second", step=0.1),
seed = gr.Slider(-1, MAX_SEED, value=-1, label="Seed", step=1),
with gr.Row():
submit_btn = gr.Button("🚀 Send") # Create a submit button
clear_btn = gr.ClearButton([prompt, seed, output], value="🗑️ Clear") # Create a clear button
# Set up the event listeners
submit_btn.click(main, inputs=[prompt, negative, second, seed], outputs=[output, seed])
#gr.close_all()
iface.queue().launch(show_api=False) # Launch the Gradio interface