# Stable Audio

Stable Audio được đề xuất trong [Stable Audio Open](https://huggingface.co/papers/2407.14358) 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ố khác nhau. Đá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](https://huggingface.co/ylacombe). Mã nguồn gốc có thể được tìm thấy tại [Stability-AI/stable-audio-tools](https://github.com/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ụ, "chất lượng cao" hoặc "rõ ràng") và cụ thể hóa ngữ cảnh của prompt khi có thể (ví dụ, "melodic techno với nhịp nhanh và synths" hoạt động tốt hơn so với "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_prompt` thà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](../../quantization/overview) để 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](/docs/diffusers/v0.43.0/vi/api/pipelines/stable_audio#diffusers.StableAudioPipeline) đã được lượng tử hóa để suy luận bằng bitsandbytes.

```py
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[[diffusers.StableAudioPipeline]]

#### diffusers.StableAudioPipeline[[diffusers.StableAudioPipeline]]

```python
diffusers.StableAudioPipeline(vae: AutoencoderOobleck, text_encoder: T5EncoderModel, projection_model: StableAudioProjectionModel, tokenizer: T5Tokenizer, transformer: StableAudioDiTModel, scheduler: EDMDPMSolverMultistepScheduler)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/stable_audio/pipeline_stable_audio.py#L78)

**Tham số:**

vae ([AutoencoderOobleck](/docs/diffusers/v0.43.0/vi/api/models/autoencoder_oobleck#diffusers.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](https://huggingface.co/docs/transformers/v5.22.2/en/model_doc/t5#transformers.T5EncoderModel)) : Bộ mã hóa văn bản đóng băng. StableAudio sử dụng bộ mã hóa của [T5](https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5EncoderModel), cụ thể là biến thể [google-t5/t5-base](https://huggingface.co/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 với 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](https://huggingface.co/docs/transformers/v5.22.2/en/model_doc/t5#transformers.T5Tokenizer)) : Tokenizer để tách token cho văn bản của text-encoder đã đóng băng.

transformer ([StableAudioDiTModel](/docs/diffusers/v0.43.0/vi/api/models/stable_audio_transformer#diffusers.StableAudioDiTModel)) : Một `StableAudioDiTModel` để khử nhiễu các latents âm thanh đã mã hóa.

scheduler ([EDMDPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/vi/api/schedulers/edm_multistep_dpm_solver#diffusers.EDMDPMSolverMultistepScheduler)) : Một trình lập lịch được sử dụng kết hợp với `transformer` để khử nhiễu các ẩn âm thanh đã 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](/docs/diffusers/v0.43.0/vi/api/pipelines/overview#diffusers.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__[[diffusers.StableAudioPipeline.__call__]]

```python
__call__(prompt: str | list[str] = None, audio_end_in_s: float | None = None, audio_start_in_s: float | None = 0.0, num_inference_steps: int = 100, guidance_scale: float = 7.0, negative_prompt: str | list[str] | None = None, num_waveforms_per_prompt: int | None = 1, eta: float = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, initial_audio_waveforms: typing.Optional[torch.Tensor] = None, initial_audio_sampling_rate: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, attention_mask: typing.Optional[torch.LongTensor] = None, negative_attention_mask: typing.Optional[torch.LongTensor] = None, return_dict: bool = True, callback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = None, callback_steps: int | None = 1, output_type: str | None = 'pt')
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/stable_audio/pipeline_stable_audio.py#L462)

**Tham số:**

prompt (`str` hoặc `list[str]`, *tùy chọn*) : Prompt hoặc các prompt để hướng dẫn tạo âm thanh. Nếu không được định nghĩa, bạn cần truyền `prompt_embeds`.

audio_end_in_s (`float`, *tuỳ 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`, *tuỳ 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`, *optional*, 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, đổi lại là suy luận chậm hơn.

guidance_scale (`float`, *optional*, 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ới `prompt` vă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 khi `guidance_scale > 1`.

negative_prompt (`str` hoặc `list[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ền `negative_prompt_embeds` thay thế. Bỏ qua khi không sử dụng guidance (`guidance_scale < 1`).

num_waveforms_per_prompt (`int`, *tuỳ chọn*, mặc định là 1) : Số lượng dạng sóng cần tạo cho mỗi prompt.

eta (`float`, *tuỳ chọn*, mặc định là 0.0) : Tương ứng với tham số eta (η) trong bài báo [DDIM](https://huggingface.co/papers/2010.02502). Chỉ áp dụng cho [DDIMScheduler](/docs/diffusers/v0.43.0/vi/api/schedulers/ddim#diffusers.DDIMScheduler) và bị bỏ qua ở các trình lập lịch khác.

generator (`torch.Generator` hoặc `list[torch.Generator]`, *tùy chọn*) : Một [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) để đảm bảo quá trình sinh là tất đị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ụng `generator` ngẫu nhiên được cung cấp.

initial_audio_waveforms (`torch.Tensor`, *optional*) : Dạng sóng âm thanh ban đầu tùy chọn để sử dụng làm dạng sóng âm thanh khởi tạo 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_size` tương ứng với số lượng prompt được truyền vào mô hình.

initial_audio_sampling_rate (`int`, *optional*) : Tần số lấy mẫu của `initial_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 vector nhúng văn bản đã được tính toán trước từ mô hình mã hóa văn bản. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản, *ví dụ* như trọng số của prompt. Nếu không được cung cấp, các vector nhúng văn bản sẽ được tính toán từ đối số đầu vào `prompt`.

negative_prompt_embeds (`torch.Tensor`, *tùy chọn*) : Các vector nhúng văn bản âm đã được tính trước từ mô hình mã hóa văn bản. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản, *ví dụ* như trọng số của prompt. Nếu không được cung cấp, negative_prompt_embeds sẽ được tính từ đối số đầu vào `negative_prompt`.

attention_mask (`torch.LongTensor`, *tùy chọn*) : Mặt nạ chú ý (attention mask) đã được tính trước để áp dụng cho `prompt_embeds`. Nếu không được cung cấp, mặt nạ chú ý sẽ được tính từ đối số đầu vào `prompt`.

negative_attention_mask (`torch.LongTensor`, *tùy chọn*) : Mặt nạ chú ý (attention mask) đã được tính trước để áp dụng cho `negative_text_audio_duration_embeds`.

return_dict (`bool`, *tùy chọn*, mặc định là `True`) : Có nên trả về một [StableDiffusionPipelineOutput](/docs/diffusers/v0.43.0/vi/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.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ỗi `callback_steps` bướ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`, *optional*, mặc định là 1) : Tần suất gọi hàm `callback`. 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ột `np.ndarray` của NumPy hoặc `"pt"` để trả về một đối tượng `torch.Tensor` của PyTorch. Đặt thành `"latent"` để trả về đầu ra của mô hình khuếch tán tiềm ẩn (LDM).

**Trả về:** [StableDiffusionPipelineOutput](/docs/diffusers/v0.43.0/vi/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) hoặc `tuple`

Nếu `return_dict` là `True`, [StableDiffusionPipelineOutput](/docs/diffusers/v0.43.0/vi/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) sẽ được trả về, ngược lại 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ụ:
```py
>>> 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)
```

