Diffusers documentation
Stable Audio
Stable Audio
Stable Audio, Zach Evans ve diğerleri tarafından Stable Audio Open makalesinde önerilmiştir. Metin komutunu girdi olarak alır ve buna karşılık gelen ses veya müzik örneğini tahmin eder.
Stable Audio Open, metin istemlerinden 44.1kHz'de değişken uzunlukta (47 saniyeye kadar) stereo ses üretir. Üç bileşenden oluşur: dalga formlarını yönetilebilir bir dizi uzunluğuna sıkıştıran bir otoenkoder, metin koşullandırma için T5 tabanlı bir metin gömme ve otoenkoderin gizli uzayında çalışan transformer tabanlı bir difüzyon (DiT) modeli.
Stable Audio, yaklaşık 48 bin ses kaydından oluşan bir korpus üzerinde eğitilmiştir; bunların yaklaşık 47 bini Freesound'dan, kalanı ise Free Music Archive (FMA) kaynağındandır. Tüm ses dosyaları CC0, CC BY veya CC Sampling+ lisansları altında lisanslanmıştır. Bu veriler, oto-ansatörü (autoencoder) ve DiT'yi eğitmek için kullanılır.
Makalenin özeti aşağıdaki gibidir: Açık üretken modeller, topluluk için hayati önem taşır; yeni modeller sunulurken ince ayar yapılmasına olanak tanır ve referans noktası olarak hizmet eder. Ancak mevcut metinden sese dönüştürme modellerinin çoğu özel olup sanatçıların ve araştırmacıların üzerine inşa edebileceği şekilde erişilebilir değildir. Burada, Creative Commons verileriyle eğitilen yeni bir açık ağırlıklı metinden sese dönüştürme modelinin mimarisini ve eğitim sürecini tanımlıyoruz. Değerlendirmemiz, modelin performansının çeşitli metrikler açısından son teknolojiyle rekabet edebilir olduğunu göstermektedir. Özellikle raporlanan FDopenl3 sonuçları (üretkenliklerin gerçekçiliğini ölçen), 44.1kHz'de yüksek kaliteli stereo ses sentezi için potansiyelini ortaya koymaktadır.
Bu pipeline Yoach Lacombe tarafından katkı sağlanmıştır. Orijinal kod tabanı Stability-AI/stable-audio-tools adresinde bulunabilir.
İpuçları
Bir istem oluştururken şunları göz önünde bulundurun:
- Açıklayıcı prompt girdileri en iyi sonucu verir; sesi tanımlamak için sıfatlar kullanın (örneğin, “yüksek kaliteli” veya “net”) ve mümkün olduğunca promptu bağlama özgü hale getirin (örneğin, “hızlı ritim ve sentezleyicilere sahip melodik techno”, “techno”dan daha iyi çalışır).
- negatif istem kullanmak, üretilen sesin kalitesini önemli ölçüde artırabilir. “low quality, average quality” negatif istemini kullanmayı deneyin.
Çıkarım sırasında:
- Oluşturulan ses örneğinin kalitesi,
num_inference_stepsargümanı ile kontrol edilebilir; daha yüksek adım sayısı, daha yavaş çıkarım maliyeti karşılığında daha yüksek kalitede ses sağlar. - Birden fazla dalga formu tek seferde oluşturulabilir: Bunu etkinleştirmek için
num_waveforms_per_promptdeğerini 1'den büyük bir değere ayarlayın. Oluşturulan dalga formları ile istem metni arasında otomatik puanlama yapılacak ve sesler buna göre en iyiden en kötüye sıralanacaktır.
Kantizasyon
Kantizasyon, model ağırlıklarını daha düşük hassasiyetli bir veri türünde saklayarak çok büyük modellerin bellek gereksinimlerini azaltmaya yardımcı olur. Ancak kantizasyonun video kalitesi üzerindeki etkisi, video modeline göre değişebilir.
Desteklenen kuantizasyon arka uçları ve kullanım durumunu destekleyen bir kuantizasyon arka ucunu seçme hakkında daha fazla bilgi edinmek için Quantization genel bakışına başvurun. Aşağıdaki örnek, bitsandbytes ile çıkarım için kuantize edilmiş bir StableAudioPipeline yüklemenin nasıl yapılacağını göstermektedir.
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
sınıf diffusers.StableAudioPipeline
< source >( vae: AutoencoderOoblecktext_encoder: T5EncoderModelprojection_model: StableAudioProjectionModeltokenizer: T5Tokenizertransformer: StableAudioDiTModelscheduler: EDMDPMSolverMultistepScheduler )
Parametreler
- vae (AutoencoderOobleck) — Gizil temsillerden görüntüleri kodlamak ve çözmek için kullanılan Varyasyonel Oto-Kodlayıcı (VAE) modeli.
- text_encoder (T5EncoderModel) — Donmuş metin kodlayıcı. StableAudio, T5 kodlayıcısını, özellikle de google-t5/t5-base varyantını kullanır.
- projection_model (
StableAudioProjectionModel) — Metin kodlayıcı modelinden gelen gizli durumları (hidden-states) ile başlangıç ve bitiş saniyelerini doğrusal olarak projekte etmek için kullanılan eğitilmiş bir model. Kodlayıcıdan gelen projekte edilmiş gizli durumlar ve koşullu saniyeler birleştirilerek transformer modelinin girdisi oluşturulur. - tokenizer (T5Tokenizer) — Donmuş metin kodlayıcısı için metni belirteçlere ayırmak üzere kullanılan belirteç ayırıcı.
- transformer (StableAudioDiTModel) —
Kodlanmış ses latentlerini gürültüden arındırmak için kullanılan bir
StableAudioDiTModel. - scheduler (EDMDPMSolverMultistepScheduler) —
Kodlanmış ses latentlerini gürültüden arındırmak için
transformerile birlikte kullanılacak bir zamanlayıcı.
StableAudio kullanılarak metinden ses üretimi için Pipeline.
Bu model DiffusionPipeline sınıfından devralır. Tüm pipeline'lar için uygulanan genel yöntemlerin (indirme, kaydetme, belirli bir cihazda çalıştırma vb.) belgelerini üst sınıfın dokümantasyonunda bulabilirsiniz.
__call__
< source >( 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
Parametreler
- prompt (
strveyalist[str], isteğe bağlı) — Ses üretimini yönlendirmek için istem veya istemler. Tanımlanmadıysa,prompt_embedsparametresini iletmeniz gerekir. - audio_end_in_s (
float, isteğe bağlı, varsayılan 47.55) — Saniye cinsinden ses bitiş indeksi. - audio_start_in_s (
float, isteğe bağlı, varsayılan 0) — Saniye cinsinden ses başlangıç indeksi. - num_inference_steps (
int, isteğe bağlı, varsayılan 100) — Gürültü azaltma adım sayısı. Daha fazla gürültü azaltma adımı genellikle daha yavaş çıkarım pahasına daha yüksek ses kalitesi sağlar. - guidance_scale (
float, isteğe bağlı, varsayılan 7.0) — Daha yüksek bir guidance scale değeri,promptile yakından ilişkili ses üretmesini teşvik eder, ancak bu ses kalitesinin düşmesi pahasına olur. Guidance scale,guidance_scale > 1olduğunda etkinleştirilir. - negative_prompt (
strveyalist[str], isteğe bağlı) — Ses üretiminde nelerin dahil edilmeyeceğini yönlendirmek için kullanılan istem veya istemler. Tanımlanmadıysa, bunun yerinenegative_prompt_embedsparametresini iletmeniz gerekir. Yönlendirme kullanılmadığında (guidance_scale < 1) yok sayılır. - num_waveforms_per_prompt (
int, isteğe bağlı, varsayılan 1) — Her istem için üretilecek dalga formu sayısı. - eta (
float, isteğe bağlı, varsayılan 0.0) — DDIM makalesindeki eta (η) parametresine karşılık gelir. Yalnızca DDIMScheduler için geçerlidir ve diğer zamanlayıcılarda yok sayılır. - generator (
torch.Generatorveyalist[torch.Generator], isteğe bağlı) — Üretimi deterministik hale getirmek için kullanılan birtorch.Generator. - latents (
torch.Tensor, isteğe bağlı) — Gaussian dağılımdan örneklenen, ses üretimi için girdi olarak kullanılacak önceden oluşturulmuş gürültülü latents. Farklı istemlerle aynı üretimi ayarlamak için kullanılabilir. Sağlanmazsa, sağlanan rastgelegeneratorkullanılarak örneklemeye dayalı bir latents tensörü oluşturulur. - initial_audio_waveforms (
torch.Tensor, isteğe bağlı) — Üretim için başlangıç ses dalgası olarak kullanılacak isteğe bağlı başlangıç ses dalgaları. Şeklinin(batch_size, num_channels, audio_length)veya(batch_size, audio_length)olması gerekir; buradabatch_size, modele iletilen istemlerin sayısına karşılık gelir. - initial_audio_sampling_rate (
int, isteğe bağlı) — Sağlanırsainitial_audio_waveforms'ün örneklem hızı. Modelle aynı olmalıdır. - prompt_embeds (
torch.Tensor, isteğe bağlı) — Metin kodlayıcı modelden önceden hesaplanmış metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, ör. istem ağırlıklandırması. Sağlanmazsa, metin gömme değerleripromptgirdi argümanından hesaplanır. - negative_prompt_embeds (
torch.Tensor, isteğe bağlı) — Metin kodlayıcı modelden önceden hesaplanmış negatif metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, ör. istem ağırlıklandırması. Sağlanmazsa, negative_prompt_embeds,negative_promptgirdi argümanından hesaplanır. - attention_mask (
torch.LongTensor, isteğe bağlı) —prompt_embedsuygulaması için önceden hesaplanmış dikkat maskesi. Sağlanmazsa, dikkat maskesipromptgirdi argümanından hesaplanır. - negative_attention_mask (
torch.LongTensor, isteğe bağlı) —negative_text_audio_duration_embedsiçin uygulanacak önceden hesaplanmış dikkat maskesi. - return_dict (
bool, isteğe bağlı, varsayılanTrue) — Düz bir tuple yerine StableDiffusionPipelineOutput döndürülüp döndürülmemesi. - callback (
Callable, isteğe bağlı) — Çıkarım sırasında hercallback_stepsadımda çağrılan bir işlev. İşlev aşağıdaki argümanlarla çağrılır:callback(step: int, timestep: int, latents: torch.Tensor). - callback_steps (
int, isteğe bağlı, varsayılan 1) —callbackişlevinin çağrılma sıklığı. Belirtilmezse, callback her adımda çağrılır. - output_type (
str, isteğe bağlı, varsayılan"pt") — Üretilen sesin çıktı biçimi. NumPynp.ndarraydöndürmek için"np"veya PyTorchtorch.Tensornesnesi döndürmek için"pt"seçin. Latent difüzyon modeli (LDM) çıktısını döndürmek için"latent"olarak ayarlayın.
Dönüş değeri
StableDiffusionPipelineOutput veya tuple
return_dict True ise StableDiffusionPipelineOutput döndürülür,
aksi halde ilk öğesi üretilen sesleri içeren bir liste olan bir tuple döndürülür.
Üretim için pipeline'ın çağrı fonksiyonu.
Örnekler:
>>> 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)