Diffusers documentation
Stable Audio
Stable Audio
Stable Audio была предложена в Stable Audio Open 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. Исходная кодовая база доступна по адресу Stability-AI/stable-audio-tools.
Советы
При составлении промпта помните:
- Описательные входные промпты работают лучше всего; используйте прилагательные для описания звука (например, «высокое качество» или «чистый звук») и, по возможности, делайте промпт контекстно-специфичным (например, «мелодичный техно с быстрым битом и синтезаторами» работает лучше, чем просто «техно»).
- Использование негативного промпта может значительно повысить качество генерируемого аудио. Попробуйте использовать негативный промпт «low quality, average quality».
Во время инференса:
- Качество quality сгенерированного аудиосэмпла можно контролировать с помощью аргумента
num_inference_steps; большее количество шагов обеспечивает более высокое качество аудио, но замедляет инференс. - Можно сгенерировать несколько волновых форм за один раз: установите
num_waveforms_per_promptв значение, большее 1, чтобы включить эту возможность. Автоматическая оценка будет выполнена между сгенерированными волновыми формами и текстом запроса, а аудиозаписи будут ранжированы от лучших к худшим соответственно.
Квантование
Квантование помогает снизить требования к памяти для очень больших моделей, храня веса модели в формате данных с меньшей точностью. Однако влияние квантования на качество видео может различаться в зависимости от используемой модели видео.
См. обзор Quantization, чтобы узнать больше о поддерживаемых бэкендах квантования и о том, как выбрать бэкенд, подходящий для вашей задачи. Пример ниже показывает, как загрузить квантованный StableAudioPipeline для инференса с помощью 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
класс diffusers.StableAudioPipeline
< source >( vae: AutoencoderOoblecktext_encoder: T5EncoderModelprojection_model: StableAudioProjectionModeltokenizer: T5Tokenizertransformer: StableAudioDiTModelscheduler: EDMDPMSolverMultistepScheduler )
Параметры
- vae (AutoencoderOobleck) — модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них.
- text_encoder (T5EncoderModel) — Замороженный текстовый энкодер. StableAudio использует энкодер T5, а именно вариант google-t5/t5-base.
- projection_model (
StableAudioProjectionModel) — Обученная модель, используемая для линейного проецирования скрытых состояний из модели текстового кодировщика, а также начальных и конечных секунд. Спроецированные скрытые состояния кодировщика и условные секунды конкатенируются, чтобы сформировать вход для трансформерной модели. - tokenizer (T5Tokenizer) — Токенизатор для токенизации текста для замороженного текстового энкодера.
- transformer (StableAudioDiTModel) —
Модель
StableAudioDiTModelдля удаления шума из закодированных латентных представлений аудио. - scheduler (EDMDPMSolverMultistepScheduler) —
планировщик, используемый в связке с
transformerдля удаления шума из закодированных латентных представлений аудио.
Пайплайн для генерации аудио из текста с использованием StableAudio.
Эта модель наследуется от DiffusionPipeline. Общую документацию по методам, реализованным для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.), см. в документации родительского класса.
__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
Параметры
- prompt (
strилиlist[str], необязательный) — Промпт или промпты для управления генерацией аудио. Если не задан, необходимо передатьprompt_embeds. - audio_end_in_s (
float, необязательный, по умолчанию 47.55) — Конечный индекс аудио в секундах. - audio_start_in_s (
float, необязательный, по умолчанию 0) — Начальный индекс аудио в секундах. - num_inference_steps (
int, необязательный, по умолчанию 100) — Количество шагов денойзинга. Увеличение числа шагов денойзинга обычно приводит к повышению качества аудио за счёт замедления инференса. - guidance_scale (
float, необязательный, по умолчанию 7.0) — Более высокое значение guidance scale побуждает модель генерировать аудио, тесно связанное с текстовымprompt, за счёт снижения качества звука. Guidance scale включается, когдаguidance_scale > 1. - negative_prompt (
strorlist[str], необязательный) — Промпт или промпты, определяющие, что следует исключить при генерации аудио. Если не задан, необходимо передатьnegative_prompt_embeds. Игнорируется, если не используется направляющий сигнал (guidance_scale < 1). - num_waveforms_per_prompt (
int, необязательный, по умолчанию 1) — Количество волновых форм, генерируемых на один запрос. - eta (
float, необязательный, по умолчанию 0.0) — Соответствует параметру eta (η) из статьи DDIM. Применяется только к DDIMScheduler и игнорируется другими планировщиками. - generator (
torch.Generatorилиlist[torch.Generator], необязательный) —torch.Generatorдля обеспечения детерминированности генерации. - latents (
torch.Tensor, необязательный) — Предварительно сгенерированные шумовые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации аудио. Можно использовать, чтобы корректировать одну и ту же генерацию с разными промптами. Если не задано, тензор латентов генерируется путём выборки с использованием переданного случайногоgenerator. - initial_audio_waveforms (
torch.Tensor, необязательный) — Необязательные начальные аудиоволны, используемые в качестве начальной аудиоволны для генерации. Форма должна быть(batch_size, num_channels, audio_length)или(batch_size, audio_length), гдеbatch_sizeсоответствует количеству промптов, переданных в модель. - initial_audio_sampling_rate (
int, необязательный) — Частота дискретизации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 вместо обычного кортежа. - callback (
Callable, необязательный) — Функция, вызываемая каждыеcallback_stepsшагов во время инференса. Функция вызывается со следующими аргументами:callback(step: int, timestep: int, latents: torch.Tensor). - callback_steps (
int, необязательный, по умолчанию 1) — Частота вызова функцииcallback. Если не указано, callback вызывается на каждом шаге. - output_type (
str, необязательный, по умолчанию"pt") — Формат вывода сгенерированного аудио. Выберите"np", чтобы вернуть массив NumPynp.ndarray, или"pt", чтобы вернуть объект PyTorchtorch.Tensor. Установите значение"latent", чтобы вернуть выход модели латентного диффузионного процесса (LDM).
Возвращает
StableDiffusionPipelineOutput или tuple
Если return_dict равно True, возвращается StableDiffusionPipelineOutput,
в противном случае возвращается tuple, где первый элемент — это список с сгенерированным аудио.
Функция вызова конвейера для генерации.
Примеры:
>>> 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)