Diffusers documentation

Stable Audio

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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

< >

( 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__

< >

( 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 (str or list[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", чтобы вернуть массив NumPy np.ndarray, или "pt", чтобы вернуть объект PyTorch torch.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)
Update on GitHub