# Stable Audio

Stable Audio была предложена в [Stable Audio Open](https://huggingface.co/papers/2407.14358) Zach Evans и соавторами. Она принимает текстовый запрос на вход и предсказывает соответствующий звуковой или музыкальный фрагмент.

Stable Audio Open генерирует стереозвук переменной длины (до 47 секунд) с частотой дискретизации 44,1 кГц по текстовым запросам. Система состоит из трёх компонентов: автоэнкодера, сжимающего звуковые волны до управляемой длины последовательности; текстового эмбеддинга на основе T5 для текстового обусловливания; и диффузионной модели на основе трансформера (DiT), работающей в латентном пространстве автоэнкодера.

Stable Audio обучается на корпусе из примерно 48 тыс. аудиозаписей, из которых около 47 тыс. взяты из Freesound, а остальные — из Free Music Archive (FMA). Все аудиофайлы распространяются по лицензиям CC0, CC BY или CC Sampling+. Эти данные используются для обучения автоэнкодера и DiT.

Аннотация к статье: *Открытые генеративные модели имеют жизненно важное значение для сообщества, поскольку они позволяют выполнять дообучение и служат базовыми моделями при представлении новых. Однако большинство современных моделей преобразования текста в аудио являются закрытыми и недоступны для художников и исследователей, которые хотели бы использовать их как основу для своих работ. В данной статье мы описываем архитектуру и процесс обучения новой открытой модели преобразования текста в аудио, обученной на данных с лицензией Creative Commons. Наши оценки показывают, что производительность модели конкурентоспособна с передовыми решениями по различным метрикам. В частности, полученные результаты FDopenl3 (измеряющие реалистичность сгенерированного звука) демонстрируют её потенциал для синтеза высококачественного стереозвука с частотой дискретизации 44,1 кГц.*

Этот конвейер был предложен [Yoach Lacombe](https://huggingface.co/ylacombe). Исходная кодовая база доступна по адресу [Stability-AI/stable-audio-tools](https://github.com/Stability-AI/stable-audio-tools).

## Советы

При составлении промпта помните:

* Описательные входные промпты работают лучше всего; используйте прилагательные для описания звука (например, «высокое качество» или «чистый звук») и, по возможности, делайте промпт контекстно-специфичным (например, «мелодичный техно с быстрым битом и синтезаторами» работает лучше, чем просто «техно»).
* Использование *негативного промпта* может значительно повысить качество генерируемого аудио. Попробуйте использовать негативный промпт «low quality, average quality».

Во время инференса:

* Качество _quality_ сгенерированного аудиосэмпла можно контролировать с помощью аргумента `num_inference_steps`; большее количество шагов обеспечивает более высокое качество аудио, но замедляет инференс.
* Можно сгенерировать несколько волновых форм за один раз: установите `num_waveforms_per_prompt` в значение, большее 1, чтобы включить эту возможность. Автоматическая оценка будет выполнена между сгенерированными волновыми формами и текстом запроса, а аудиозаписи будут ранжированы от лучших к худшим соответственно.

## Квантование

Квантование помогает снизить требования к памяти для очень больших моделей, храня веса модели в формате данных с меньшей точностью. Однако влияние квантования на качество видео может различаться в зависимости от используемой модели видео.

См. обзор [Quantization](../../quantization/overview), чтобы узнать больше о поддерживаемых бэкендах квантования и о том, как выбрать бэкенд, подходящий для вашей задачи. Пример ниже показывает, как загрузить квантованный [StableAudioPipeline](/docs/diffusers/v0.43.0/ru/api/pipelines/stable_audio#diffusers.StableAudioPipeline) для инференса с помощью 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)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/stable_audio/pipeline_stable_audio.py#L78)

**Параметры:**

vae ([AutoencoderOobleck](/docs/diffusers/v0.43.0/ru/api/models/autoencoder_oobleck#diffusers.AutoencoderOobleck)) : Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них.

text_encoder ([T5EncoderModel](https://huggingface.co/docs/transformers/v5.22.2/en/model_doc/t5#transformers.T5EncoderModel)) : Замороженный текстовый энкодер. StableAudio использует энкодер [T5](https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5EncoderModel), а именно вариант [google-t5/t5-base](https://huggingface.co/google-t5/t5-base).

projection_model (`StableAudioProjectionModel`) : обученная модель, используемая для линейного проецирования скрытых состояний из модели текстового кодировщика, а также начальных и конечных секунд. Спроецированные скрытые состояния кодировщика и условные секунды конкатенируются, чтобы сформировать вход для трансформерной модели.

tokenizer ([T5Tokenizer](https://huggingface.co/docs/transformers/v5.22.2/en/model_doc/t5#transformers.T5Tokenizer)) : Токенизатор для токенизации текста для замороженного текстового энкодера.

transformer ([StableAudioDiTModel](/docs/diffusers/v0.43.0/ru/api/models/stable_audio_transformer#diffusers.StableAudioDiTModel)) : модель `StableAudioDiTModel` для удаления шума из закодированных латентных представлений аудио.

scheduler ([EDMDPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/edm_multistep_dpm_solver#diffusers.EDMDPMSolverMultistepScheduler)) : планировщик, используемый в связке с `transformer` для удаления шума из закодированных латентных представлений аудио.

Пайплайн для генерации аудио из текста с использованием StableAudio.

Эта модель наследуется от [DiffusionPipeline](/docs/diffusers/v0.43.0/ru/api/pipelines/overview#diffusers.DiffusionPipeline). Общую документацию по методам, реализованным для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.), см. в документации родительского класса.

#### __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')
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/stable_audio/pipeline_stable_audio.py#L462)

**Параметры:**

prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты для управления генерацией аудио. Если не задан, необходимо передать `prompt_embeds`.

audio_end_in_s (`float`, *необязательный*, по умолчанию 47.55) : Конечный индекс аудио в секундах.

audio_start_in_s (`float`, *optional*, по умолчанию 0) : Начальный индекс аудио в секундах.

num_inference_steps (`int`, *optional*, по умолчанию 100) : Количество шагов денойзинга. Увеличение числа шагов денойзинга обычно приводит к повышению качества аудио за счёт замедления инференса.

guidance_scale (`float`, *optional*, по умолчанию 7.0) : Более высокое значение guidance scale побуждает модель генерировать аудио, тесно связанное с текстовым `prompt`, за счёт снижения качества звука. Guidance scale активируется, когда `guidance_scale > 1`.

negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, определяющие, что следует исключить при генерации аудио. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющая (`guidance_scale < 1`).

num_waveforms_per_prompt (`int`, *необязательный*, по умолчанию 1) : Количество волновых форм, генерируемых на один запрос.

eta (`float`, *необязательный*, по умолчанию 0.0) : Соответствует параметру eta (η) из статьи [DDIM](https://huggingface.co/papers/2010.02502). Применяется только к [DDIMScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/ddim#diffusers.DDIMScheduler) и игнорируется другими планировщиками.

generator (`torch.Generator` или `list[torch.Generator]`, *необязательно*) : [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) для обеспечения детерминированности генерации.

latents (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные шумовые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации аудио. Позволяет корректировать одну и ту же генерацию с помощью разных промптов. Если не задано, тензор латентов генерируется путём выборки с использованием переданного случайного `generator`.

initial_audio_waveforms (`torch.Tensor`, *optional*) : Необязательные начальные аудиоволны, используемые в качестве исходного аудиосигнала для генерации. Форма должна быть `(batch_size, num_channels, audio_length)` или `(batch_size, audio_length)`, где `batch_size` соответствует количеству промптов, переданных в модель.

initial_audio_sampling_rate (`int`, *optional*) : Частота дискретизации `initial_audio_waveforms`, если они предоставлены. Должна совпадать с частотой дискретизации модели.

prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно вычисленные текстовые эмбеддинги из модели текстового энкодера. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, текстовые эмбеддинги будут вычислены из входного аргумента `prompt`.

negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно вычисленные отрицательные текстовые эмбеддинги из модели текстового энкодера. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промптов. Если не предоставлены, negative_prompt_embeds будут вычислены из входного аргумента `negative_prompt`.

attention_mask (`torch.LongTensor`, *необязательный*) : Предварительно вычисленная маска внимания, применяемая к `prompt_embeds`. Если не задана, маска внимания будет вычислена на основе входного аргумента `prompt`.

negative_attention_mask (`torch.LongTensor`, *необязательный*) : Предварительно вычисленная маска внимания, применяемая к `negative_text_audio_duration_embeds`.

return_dict (`bool`, *необязательный*, по умолчанию `True`) : Возвращать ли [StableDiffusionPipelineOutput](/docs/diffusers/v0.43.0/ru/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) вместо обычного кортежа.

callback (`Callable`, *необязательный*) : функция, вызываемая каждые `callback_steps` шагов во время инференса. Функция вызывается со следующими аргументами: `callback(step: int, timestep: int, latents: torch.Tensor)`.

callback_steps (`int`, *optional*, по умолчанию 1) : Частота вызова функции `callback`. Если не указано, callback вызывается на каждом шаге.

output_type (`str`, *необязательный*, по умолчанию `"pt"`) : Формат вывода сгенерированного аудио. Выберите `"np"`, чтобы вернуть массив NumPy `np.ndarray`, или `"pt"`, чтобы вернуть объект PyTorch `torch.Tensor`. Установите значение `"latent"`, чтобы вернуть выход latent diffusion model (LDM).

**Возвращает:** [StableDiffusionPipelineOutput](/docs/diffusers/v0.43.0/ru/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) или `tuple`

Если `return_dict` равно `True`, возвращается [StableDiffusionPipelineOutput](/docs/diffusers/v0.43.0/ru/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput), иначе возвращается `tuple`, где первый элемент — это список с сгенерированным аудио.

Функция вызова конвейера для генерации.

Примеры:
```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)
```

