Diffusers documentation

Stable Audio

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Stable Audio

Stable Audio diusulkan dalam Stable Audio Open oleh Zach Evans dkk. Model ini menerima prompt teks sebagai input dan memprediksi sampel suara atau musik yang sesuai.

Stable Audio Open menghasilkan audio stereo dengan panjang variabel (hingga 47 detik) pada 44,1kHz dari prompt teks. Model ini terdiri dari tiga komponen: autoencoder yang mengompres waveform menjadi panjang urutan yang dapat dikelola, embedding teks berbasis T5 untuk kondisioning teks, dan model difusi berbasis transformer (DiT) yang beroperasi di ruang laten autoencoder.

Stable Audio dilatih pada korpus sekitar 48k rekaman audio, di mana sekitar 47k berasal dari Freesound dan sisanya dari Free Music Archive (FMA). Semua file audio berlisensi CC0, CC BY, atau CC Sampling+. Data ini digunakan untuk melatih autoencoder dan DiT.

Abstrak dari makalah tersebut adalah sebagai berikut: Model generatif terbuka sangat penting bagi komunitas, karena memungkinkan fine-tuning dan berfungsi sebagai baseline saat mempresentasikan model baru. Namun, sebagian besar model text-to-audio saat ini bersifat privat dan tidak dapat diakses oleh seniman maupun peneliti untuk dikembangkan lebih lanjut. Di sini, kami menjelaskan arsitektur dan proses pelatihan dari model text-to-audio open-weights baru yang dilatih dengan data Creative Commons. Evaluasi kami menunjukkan bahwa kinerja model ini kompetitif dengan state-of-the-art di berbagai metrik. Secara khusus, hasil FDopenl3 yang dilaporkan (mengukur realisme dari generasi) menunjukkan potensinya untuk sintesis suara stereo berkualitas tinggi pada 44.1kHz.

Pipeline ini disumbangkan oleh Yoach Lacombe. Basis kode aslinya dapat ditemukan di Stability-AI/stable-audio-tools.

Tips

Saat menyusun prompt, perhatikan hal-hal berikut:

  • Input prompt deskriptif paling efektif; gunakan kata sifat untuk menggambarkan suara (misalnya, “high quality” atau “clear”) dan buat prompt spesifik sesuai konteks jika memungkinkan (misalnya, “melodic techno with a fast beat and synths” lebih baik daripada “techno”).
  • Menggunakan negative prompt dapat secara signifikan meningkatkan kualitas audio yang dihasilkan. Coba gunakan negative prompt “low quality, average quality”.

Selama inferensi:

  • Kualitas sampel audio yang dihasilkan dapat dikontrol melalui argumen num_inference_steps; langkah yang lebih tinggi menghasilkan audio dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat.
  • Beberapa waveform dapat dihasilkan sekaligus: atur num_waveforms_per_prompt ke nilai lebih dari 1 untuk mengaktifkannya. Penilaian otomatis akan dilakukan antara waveform yang dihasilkan dan teks prompt, dan audio akan diurutkan dari yang terbaik hingga terburuk sesuai dengan hasilnya.

Kuantisasi

Quantization membantu mengurangi kebutuhan memori untuk model yang sangat besar dengan menyimpan bobot model dalam tipe data presisi yang lebih rendah. Namun, quantization dapat memiliki dampak yang bervariasi terhadap kualitas video tergantung pada model video yang digunakan.

Lihat ringkasan Kuantisasi untuk mempelajari lebih lanjut tentang backend kuantisasi yang didukung dan memilih backend kuantisasi yang mendukung kasus penggunaan Anda. Contoh di bawah ini menunjukkan cara memuat StableAudioPipeline yang dikuantisasi untuk inferensi dengan bitsandbytes.

import torch
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig, StableAudioDiTModel, StableAudioPipeline
from diffusers.utils import export_to_video
from transformers import BitsAndBytesConfig as BitsAndBytesConfig, T5EncoderModel

quant_config = BitsAndBytesConfig(load_in_8bit=True)
text_encoder_8bit = T5EncoderModel.from_pretrained(
    "stabilityai/stable-audio-open-1.0",
    subfolder="text_encoder",
    quantization_config=quant_config,
    dtype=torch.float16,
)

quant_config = DiffusersBitsAndBytesConfig(load_in_8bit=True)
transformer_8bit = StableAudioDiTModel.from_pretrained(
    "stabilityai/stable-audio-open-1.0",
    subfolder="transformer",
    quantization_config=quant_config,
    dtype=torch.float16,
)

pipeline = StableAudioPipeline.from_pretrained(
    "stabilityai/stable-audio-open-1.0",
    text_encoder=text_encoder_8bit,
    transformer=transformer_8bit,
    dtype=torch.float16,
    device_map="balanced",
)

prompt = "The sound of a hammer hitting a wooden surface."
negative_prompt = "Low quality."
audio = pipeline(
    prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=200,
    audio_end_in_s=10.0,
    num_waveforms_per_prompt=3,
    generator=generator,
).audios

output = audio[0].T.float().cpu().numpy()
sf.write("hammer.wav", output, pipeline.vae.sampling_rate)

StableAudioPipeline

kelas diffusers.StableAudioPipeline

< >

( vae: AutoencoderOoblecktext_encoder: T5EncoderModelprojection_model: StableAudioProjectionModeltokenizer: T5Tokenizertransformer: StableAudioDiTModelscheduler: EDMDPMSolverMultistepScheduler )

Parameter

  • vae (AutoencoderOobleck) — Model Variational Auto-Encoder (VAE) untuk mengodekan dan mendekodekan gambar ke dan dari representasi laten.
  • text_encoder (T5EncoderModel) — Text-encoder yang dibekukan. StableAudio menggunakan encoder dari T5, khususnya varian google-t5/t5-base.
  • projection_model (StableAudioProjectionModel) — Model terlatih yang digunakan untuk memproyeksikan secara linear hidden-states dari model text encoder serta detik awal dan akhir. Hidden-states yang diproyeksikan dari encoder dan detik kondisional digabungkan untuk memberikan input ke model transformer.
  • tokenizer (T5Tokenizer) — Tokenizer untuk melakukan tokenisasi teks bagi text-encoder yang dibekukan.
  • transformer (StableAudioDiTModel) — StableAudioDiTModel untuk menghilangkan noise pada latens audio yang telah dienkod.
  • scheduler (EDMDPMSolverMultistepScheduler) — Scheduler yang digunakan bersama transformer untuk menghilangkan noise pada latens audio yang telah dienkod.

Pipeline untuk generasi teks-ke-audio menggunakan StableAudio.

Model ini mewarisi dari DiffusionPipeline. Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan untuk semua pipeline (mengunduh, menyimpan, menjalankan pada perangkat tertentu, dll.).

__call__

< >

( prompt: str | list[str] = Noneaudio_end_in_s: float | None = Noneaudio_start_in_s: float | None = 0.0num_inference_steps: int = 100guidance_scale: float = 7.0negative_prompt: str | list[str] | None = Nonenum_waveforms_per_prompt: int | None = 1eta: float = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneinitial_audio_waveforms: typing.Optional[torch.Tensor] = Noneinitial_audio_sampling_rate: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneattention_mask: typing.Optional[torch.LongTensor] = Nonenegative_attention_mask: typing.Optional[torch.LongTensor] = Nonereturn_dict: bool = Truecallback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = Nonecallback_steps: int | None = 1output_type: str | None = 'pt' ) → StableDiffusionPipelineOutput or tuple

Parameter

  • prompt (str atau list[str], opsional) — Prompt atau prompt-prompt untuk memandu generasi audio. Jika tidak didefinisikan, Anda perlu meneruskan prompt_embeds.
  • audio_end_in_s (float, opsional, default 47.55) — Indeks akhir audio dalam detik.
  • audio_start_in_s (float, opsional, default 0) — Indeks awal audio dalam detik.
  • num_inference_steps (int, opsional, default 100) — Jumlah langkah denoising. Semakin banyak langkah denoising, biasanya menghasilkan audio dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat.
  • guidance_scale (float, opsional, default 7.0) — Nilai guidance scale yang lebih tinggi mendorong model untuk menghasilkan audio yang sangat terkait dengan prompt teks, dengan mengorbankan kualitas suara yang lebih rendah. Guidance scale diaktifkan ketika guidance_scale > 1.
  • negative_prompt (str atau list[str], opsional) — Prompt atau prompt-prompt untuk mengarahkan apa yang tidak boleh disertakan dalam generasi audio. Jika tidak didefinisikan, Anda perlu mengirimkan negative_prompt_embeds sebagai gantinya. Diabaikan saat tidak menggunakan guidance (guidance_scale < 1).
  • num_waveforms_per_prompt (int, opsional, default 1) — Jumlah waveform yang akan dihasilkan per prompt.
  • eta (float, opsional, default 0.0) — Bersesuaian dengan parameter eta (η) dari paper DDIM. Hanya berlaku untuk DDIMScheduler, dan diabaikan pada scheduler lainnya.
  • generator (torch.Generator atau list[torch.Generator], opsional) — torch.Generator untuk membuat generasi menjadi deterministik.
  • latents (torch.Tensor, opsional) — Latents berisik yang telah dibuat sebelumnya dan diambil dari distribusi Gaussian, untuk digunakan sebagai input untuk generasi audio. Dapat digunakan untuk menyesuaikan generasi yang sama dengan prompt yang berbeda. Jika tidak disediakan, tensor latents akan dibuat dengan pengambilan sampel menggunakan generator acak yang diberikan.
  • initial_audio_waveforms (torch.Tensor, opsional) — Waveform audio awal opsional yang akan digunakan sebagai waveform audio awal untuk generasi. Harus memiliki bentuk (batch_size, num_channels, audio_length) atau (batch_size, audio_length), di mana batch_size berkorespondensi dengan jumlah prompt yang diteruskan ke model.
  • initial_audio_sampling_rate (int, opsional) — Laju sampling dari initial_audio_waveforms, jika disediakan. Harus sama dengan model.
  • prompt_embeds (torch.Tensor, opsional) — Embedding teks yang sudah dihitung sebelumnya dari model text encoder. Dapat digunakan untuk dengan mudah menyesuaikan input teks, misalnya pembobotan prompt. Jika tidak disediakan, embedding teks akan dihitung dari argumen input prompt.
  • negative_prompt_embeds (torch.Tensor, opsional) — Embedding teks negatif yang telah dihitung sebelumnya dari model text encoder. Dapat digunakan untuk dengan mudah menyesuaikan input teks, misalnya pembobotan prompt. Jika tidak disediakan, negative_prompt_embeds akan dihitung dari argumen input negative_prompt.
  • attention_mask (torch.LongTensor, opsional) — Attention mask yang sudah dihitung sebelumnya untuk diterapkan pada prompt_embeds. Jika tidak disediakan, attention mask akan dihitung dari argumen input prompt.
  • negative_attention_mask (torch.LongTensor, opsional) — Mask perhatian yang sudah dihitung sebelumnya untuk diterapkan pada negative_text_audio_duration_embeds.
  • return_dict (bool, opsional, default True) — Apakah akan mengembalikan StableDiffusionPipelineOutput alih-alih tuple biasa.
  • callback (Callable, opsional) — Fungsi yang dipanggil setiap callback_steps langkah selama inferensi. Fungsi ini dipanggil dengan argumen berikut: callback(step: int, timestep: int, latents: torch.Tensor).
  • callback_steps (int, opsional, default 1) — Frekuensi pemanggilan fungsi callback. Jika tidak ditentukan, callback dipanggil pada setiap langkah.
  • output_type (str, opsional, defaultnya "pt") — Format output dari audio yang dihasilkan. Pilih antara "np" untuk mengembalikan np.ndarray NumPy atau "pt" untuk mengembalikan objek torch.Tensor PyTorch. Atur ke "latent" untuk mengembalikan output model difusi laten (LDM).

Mengembalikan

StableDiffusionPipelineOutput atau tuple

Jika return_dict adalah True, StableDiffusionPipelineOutput dikembalikan, sebaliknya sebuah tuple dikembalikan di mana elemen pertama adalah daftar dengan audio yang dihasilkan.

Fungsi panggilan untuk pipeline pada generasi.

Contoh:

>>> import scipy
>>> import torch
>>> import soundfile as sf
>>> from diffusers import StableAudioPipeline

>>> repo_id = "stabilityai/stable-audio-open-1.0"
>>> pipe = StableAudioPipeline.from_pretrained(repo_id, torch_dtype=torch.float16)
>>> pipe = pipe.to("cuda")

>>> # define the prompts
>>> prompt = "The sound of a hammer hitting a wooden surface."
>>> negative_prompt = "Low quality."

>>> # set the seed for generator
>>> generator = torch.Generator("cuda").manual_seed(0)

>>> # run the generation
>>> audio = pipe(
...     prompt,
...     negative_prompt=negative_prompt,
...     num_inference_steps=200,
...     audio_end_in_s=10.0,
...     num_waveforms_per_prompt=3,
...     generator=generator,
... ).audios

>>> output = audio[0].T.float().cpu().numpy()
>>> sf.write("hammer.wav", output, pipe.vae.sampling_rate)
Update on GitHub