Diffusers documentation
Stable Audio
Stable Audio
Stable Audio được đề xuất trong Stable Audio Open bởi Zach Evans và cộng sự. Mô hình này nhận một câu lệnh văn bản làm đầu vào và dự đoán mẫu âm thanh hoặc nhạc tương ứng.
Stable Audio Open tạo ra âm thanh stereo có độ dài thay đổi (tối đa 47 giây) ở tần số lấy mẫu 44.1kHz từ các prompt văn bản. Nó bao gồm ba thành phần: một autoencoder nén các dạng sóng thành độ dài chuỗi có thể quản lý được, một text embedding dựa trên T5 để điều kiện hóa văn bản, và một mô hình khuếch tán (DiT) dựa trên transformer hoạt động trong không gian ẩn của autoencoder.
Stable Audio được huấn luyện trên một tập dữ liệu gồm khoảng 48k bản ghi âm thanh, trong đó khoảng 47k từ Freesound và phần còn lại từ Free Music Archive (FMA). Tất cả các tệp âm thanh đều được cấp phép theo CC0, CC BY hoặc CC Sampling+. Dữ liệu này được sử dụng để huấn luyện autoencoder và DiT.
Tóm tắt của bài báo như sau: Các mô hình sinh mở đóng vai trò thiết yếu đối với cộng đồng, cho phép tinh chỉnh và làm cơ sở so sánh khi giới thiệu các mô hình mới. Tuy nhiên, hầu hết các mô hình từ văn bản sang âm thanh hiện tại đều là riêng tư và không thể tiếp cận để các nghệ sĩ và nhà nghiên cứu xây dựng dựa trên đó. Ở đây, chúng tôi mô tả kiến trúc và quy trình huấn luyện của một mô hình từ văn bản sang âm thanh có trọng số mở mới, được huấn luyện bằng dữ liệu Creative Commons. Đánh giá của chúng tôi cho thấy hiệu suất của mô hình có tính cạnh tranh với mức tiên tiến nhất trên nhiều chỉ số. Đáng chú ý, kết quả FDopenl3 được báo cáo (đo lường tính chân thực của các bản sinh) cho thấy tiềm năng của mô hình trong việc tổng hợp âm thanh stereo chất lượng cao ở 44.1kHz.
Pipeline này được đóng góp bởi Yoach Lacombe. Mã nguồn gốc có thể được tìm thấy tại Stability-AI/stable-audio-tools.
Mẹo
Khi xây dựng một prompt, hãy lưu ý:
- Đầu vào prompt mô tả chi tiết hoạt động hiệu quả nhất; hãy dùng tính từ để mô tả âm thanh (ví dụ, “high quality” hoặc “clear”) và cụ thể hóa ngữ cảnh của prompt khi có thể (ví dụ, “melodic techno with a fast beat and synths” hoạt động tốt hơn “techno”).
- Việc sử dụng negative prompt có thể cải thiện đáng kể chất lượng âm thanh được tạo ra. Hãy thử dùng negative prompt là “low quality, average quality”.
Trong quá trình suy luận:
- Chất lượng của mẫu âm thanh được tạo ra có thể được điều chỉnh bằng tham số
num_inference_steps; số bước càng cao thì chất lượng âm thanh càng tốt, nhưng suy luận sẽ chậm hơn. - Có thể tạo nhiều dạng sóng cùng lúc: đặt
num_waveforms_per_promptthành một giá trị lớn hơn 1 để bật tính năng này. Việc chấm điểm tự động sẽ được thực hiện giữa các dạng sóng được tạo và văn bản prompt, và các tệp âm thanh sẽ được xếp hạng từ tốt nhất đến kém nhất tương ứng.
Lượng tử hóa
Quantization giúp giảm yêu cầu về bộ nhớ của các mô hình rất lớn bằng cách lưu trữ trọng số mô hình trong kiểu dữ liệu có độ chính xác thấp hơn. Tuy nhiên, lượng tử hóa có thể ảnh hưởng khác nhau đến chất lượng video tùy thuộc vào mô hình video.
Tham khảo phần tổng quan Lượng tử hóa để tìm hiểu thêm về các backend lượng tử hóa được hỗ trợ và cách chọn một backend lượng tử hóa phù hợp với trường hợp sử dụng của bạn. Ví dụ bên dưới minh họa cách tải một StableAudioPipeline đã được lượng tử hóa để suy luận bằng 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
lớp diffusers.StableAudioPipeline
< source >( vae: AutoencoderOoblecktext_encoder: T5EncoderModelprojection_model: StableAudioProjectionModeltokenizer: T5Tokenizertransformer: StableAudioDiTModelscheduler: EDMDPMSolverMultistepScheduler )
Tham số
- vae (AutoencoderOobleck) — Mô hình Variational Auto-Encoder (VAE) để mã hóa và giải mã hình ảnh từ và sang các biểu diễn ẩn.
- text_encoder (T5EncoderModel) — Bộ mã hóa văn bản đóng băng. StableAudio sử dụng bộ mã hóa của T5, cụ thể là biến thể google-t5/t5-base.
- projection_model (
StableAudioProjectionModel) — Một mô hình đã được huấn luyện, dùng để chiếu tuyến tính các hidden-states từ mô hình text encoder cũng như số giây bắt đầu và kết thúc. Các hidden-states đã được chiếu từ encoder và các giây điều kiện sẽ được nối lại với nhau để tạo thành đầu vào cho mô hình transformer. - tokenizer (T5Tokenizer) — Tokenizer để mã hóa văn bản cho text-encoder đã đóng băng.
- transformer (StableAudioDiTModel) —
Một
StableAudioDiTModelđể khử nhiễu các latents âm thanh đã mã hóa. - scheduler (EDMDPMSolverMultistepScheduler) —
Một scheduler được sử dụng kết hợp với
transformerđể khử nhiễu các latents audio đã mã hóa.
Pipeline để tạo audio từ văn bản sử dụng StableAudio.
Mô hình này kế thừa từ DiffusionPipeline. Xem tài liệu của lớp cha để biết các phương thức chung được triển khai cho tất cả các pipeline (tải xuống, lưu, chạy trên một thiết bị cụ thể, v.v.).
__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
Tham số
- prompt (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt để định hướng việc tạo âm thanh. Nếu không được định nghĩa, bạn cần truyềnprompt_embeds. - audio_end_in_s (
float, tùy chọn, mặc định là 47.55) — Chỉ số kết thúc âm thanh tính bằng giây. - audio_start_in_s (
float, tùy chọn, mặc định là 0) — Chỉ số bắt đầu của âm thanh tính bằng giây. - num_inference_steps (
int, tùy chọn, mặc định là 100) — Số bước khử nhiễu. Số bước khử nhiễu nhiều hơn thường dẫn đến âm thanh có chất lượng cao hơn với chi phí là suy luận chậm hơn. - guidance_scale (
float, tùy chọn, mặc định là 7.0) — Giá trị guidance scale cao hơn khuyến khích mô hình tạo ra âm thanh gắn kết chặt chẽ vớipromptvăn bản, với cái giá là chất lượng âm thanh thấp hơn. Guidance scale được kích hoạt khiguidance_scale > 1. - negative_prompt (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt để hướng dẫn những gì không nên bao gồm trong quá trình tạo âm thanh. Nếu không được định nghĩa, bạn cần truyềnnegative_prompt_embedsthay thế. Bỏ qua khi không sử dụng guidance (guidance_scale < 1). - num_waveforms_per_prompt (
int, tùy chọn, mặc định là 1) — Số lượng waveform cần tạo cho mỗi prompt. - eta (
float, tùy chọn, mặc định là 0.0) — Tương ứng với tham số eta (η) trong bài báo DDIM. Chỉ áp dụng cho DDIMScheduler và bị bỏ qua ở các scheduler khác. - generator (
torch.Generatorhoặclist[torch.Generator], tùy chọn) — Mộttorch.Generatorđể làm cho quá trình sinh ra kết quả xác định. - latents (
torch.Tensor, tùy chọn) — Các latents nhiễu đã được tạo trước, lấy mẫu từ phân phối Gaussian, dùng làm đầu vào cho việc tạo âm thanh. Có thể dùng để tinh chỉnh cùng một quá trình tạo với các prompt khác nhau. Nếu không được cung cấp, một tensor latents sẽ được tạo bằng cách lấy mẫu sử dụnggeneratorngẫu nhiên được cung cấp. - initial_audio_waveforms (
torch.Tensor, tùy chọn) — Các waveform âm thanh ban đầu tùy chọn để sử dụng làm waveform âm thanh ban đầu cho quá trình tạo. Phải có hình dạng(batch_size, num_channels, audio_length)hoặc(batch_size, audio_length), trong đóbatch_sizetương ứng với số lượng prompts được truyền vào mô hình. - initial_audio_sampling_rate (
int, tùy chọn) — Tần số lấy mẫu củainitial_audio_waveforms, nếu chúng được cung cấp. Phải giống với mô hình. - prompt_embeds (
torch.Tensor, tùy chọn) — Các embedding văn bản đã được tính trước từ mô hình text encoder. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, các embedding văn bản sẽ được tính từ đối số đầu vàoprompt. - negative_prompt_embeds (
torch.Tensor, tùy chọn) — Các embedding văn bản âm đã được tính trước từ mô hình text encoder. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, negative_prompt_embeds sẽ được tính từ đối số đầu vàonegative_prompt. - attention_mask (
torch.LongTensor, tùy chọn) — Mặt nạ chú ý (attention mask) đã được tính toán trước để áp dụng choprompt_embeds. Nếu không được cung cấp, mặt nạ chú ý sẽ được tính toán từ đối số đầu vàoprompt. - negative_attention_mask (
torch.LongTensor, tùy chọn) — Mặt nạ chú ý đã được tính trước để áp dụng chonegative_text_audio_duration_embeds. - return_dict (
bool, tùy chọn, mặc định làTrue) — Có nên trả về một StableDiffusionPipelineOutput thay vì một tuple thông thường hay không. - callback (
Callable, tùy chọn) — Một hàm được gọi mỗicallback_stepsbước trong quá trình suy luận. Hàm này được gọi với các đối số sau:callback(step: int, timestep: int, latents: torch.Tensor). - callback_steps (
int, tùy chọn, mặc định là 1) — Tần suất gọi hàmcallback. Nếu không được chỉ định, callback sẽ được gọi ở mỗi bước. - output_type (
str, tùy chọn, mặc định là"pt") — Định dạng đầu ra của âm thanh được tạo ra. Chọn"np"để trả về mộtnp.ndarraycủa NumPy hoặc"pt"để trả về một đối tượngtorch.Tensorcủa PyTorch. Đặt thành"latent"để trả về đầu ra của mô hình khuếch tán ẩn (LDM).
Trả về
StableDiffusionPipelineOutput hoặc tuple
Nếu return_dict là True, StableDiffusionPipelineOutput sẽ được trả về,
ngoài ra một tuple sẽ được trả về trong đó phần tử đầu tiên là một danh sách chứa âm thanh đã tạo.
Hàm gọi call của pipeline để tạo nội dung.
Ví dụ:
>>> 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)