Diffusers 文档
Stable Audio
并获得增强的文档体验
开始使用
Stable Audio
Stable Audio 由 Zach Evans 等人在《Stable Audio Open》中提出。它以文本提示作为输入,预测相应的声音或音乐样本。
Stable Audio Open 从文本提示生成可变长度(最长47秒)的44.1kHz立体声音频。它包含三个组件:一个将波形压缩成可管理序列长度的自编码器,一个用于文本条件的基于T5的文本嵌入,以及一个在自编码器潜在空间中操作的基于Transformer的扩散(DiT)模型。
Stable Audio 在大约48k个音频录音语料库上进行训练,其中约47k来自 Freesound,其余来自 Free Music Archive (FMA)。所有音频文件均以 CC0、CC BY 或 CC Sampling+ 许可。这些数据用于训练自编码器和 DiT。
该论文的摘要如下:开放式生成模型对社区至关重要,允许进行微调并作为新模型的基础。然而,目前大多数文本到音频模型都是私有的,艺术家和研究人员无法在其基础上进行构建。本文介绍了使用知识共享数据训练的新型开源文本到音频模型的架构和训练过程。我们的评估表明,该模型在各种指标上均与最先进的技术具有竞争力。值得注意的是,报告的 FDopenl3 结果(衡量生成的真实性)展示了其在 44.1kHz 下生成高质量立体声音频的潜力。
该管道由Yoach Lacombe贡献。原始代码库可在Stability-AI/stable-audio-tools找到。
提示
在构建提示时,请记住:
- 描述性提示输入效果最佳;使用形容词来描述声音(例如,“高品质”或“清晰”),并在可能的情况下使提示上下文具体化(例如,“带有快速节拍和合成器的旋律电子乐”比“电子乐”效果更好)。
- 使用负面提示可以显著提高生成音频的质量。尝试使用“低质量、普通质量”的负面提示。
在推理过程中
- 生成音频样本的质量可以通过
num_inference_steps
参数控制;步数越多,音频质量越高,但推理速度越慢。 - 可以一次性生成多个波形:将
num_waveforms_per_prompt
设置为大于1的值即可启用。将自动对生成的波形和提示文本进行评分,并根据评分从优到劣对音频进行排序。
量化
量化有助于通过以较低精度数据类型存储模型权重来减少大型模型的内存需求。但是,量化对视频质量的影响可能因视频模型而异。
请参阅量化概述,了解有关支持的量化后端以及如何选择支持您用例的量化后端的更多信息。以下示例演示了如何加载量化后的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,
torch_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,
torch_dtype=torch.float16,
)
pipeline = StableAudioPipeline.from_pretrained(
"stabilityai/stable-audio-open-1.0",
text_encoder=text_encoder_8bit,
transformer=transformer_8bit,
torch_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: AutoencoderOobleck text_encoder: T5EncoderModel projection_model: StableAudioProjectionModel tokenizer: typing.Union[transformers.models.t5.tokenization_t5.T5Tokenizer, transformers.models.t5.tokenization_t5_fast.T5TokenizerFast] transformer: StableAudioDiTModel scheduler: EDMDPMSolverMultistepScheduler )
参数
- vae (AutoencoderOobleck) — 用于将图像编码和解码为潜在表示的变分自编码器(VAE)模型。
- text_encoder (T5EncoderModel) — 冻结的文本编码器。StableAudio 使用 T5 的编码器,特别是 google-t5/t5-base 变体。
- projection_model (
StableAudioProjectionModel
) — 一个经过训练的模型,用于将文本编码器模型和起始/结束秒的隐藏状态进行线性投影。来自编码器和条件秒的投影隐藏状态被连接起来,作为 Transformer 模型的输入。 - tokenizer (T5Tokenizer) — 用于对冻结的文本编码器文本进行标记的标记器。
- transformer (StableAudioDiTModel) — 一个用于对编码音频潜在值进行去噪的
StableAudioDiTModel
。 - scheduler (EDMDPMSolverMultistepScheduler) — 与
transformer
结合使用以对编码音频潜在值进行去噪的调度器。
用于文本到音频生成的 StableAudio 管道。
该模型继承自DiffusionPipeline。请查看超类的文档,了解为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。
__call__
< 来源 >( prompt: typing.Union[str, typing.List[str]] = None audio_end_in_s: typing.Optional[float] = None audio_start_in_s: typing.Optional[float] = 0.0 num_inference_steps: int = 100 guidance_scale: float = 7.0 negative_prompt: typing.Union[str, typing.List[str], NoneType] = None num_waveforms_per_prompt: typing.Optional[int] = 1 eta: float = 0.0 generator: typing.Union[torch._C.Generator, typing.List[torch._C.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: typing.Optional[int] = 1 output_type: typing.Optional[str] = 'pt' ) → StableDiffusionPipelineOutput 或 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) — 较高的指导比例值鼓励模型生成与文本prompt
紧密相关的音频,但音质会降低。当guidance_scale > 1
时,启用指导比例。 - negative_prompt (
str
或List[str]
, 可选) — 用于指导音频生成中不包含的内容的提示。如果未定义,您需要传递negative_prompt_embeds
。当不使用指导时 (guidance_scale < 1
),忽略此参数。 - num_waveforms_per_prompt (
int
, 可选, 默认为 1) — 每个提示要生成的波形数量。 - eta (
float
, 可选, 默认为 0.0) — 对应于 DDIM 论文中的参数 eta (η)。仅适用于 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
函数的频率。如果未指定,则在每个步骤都调用回调。 - 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)
禁用切片 VAE 解码。如果之前启用了 enable_vae_slicing
,此方法将返回一步计算解码。
启用切片 VAE 解码。启用此选项后,VAE 会将输入张量分片,分步计算解码。这有助于节省一些内存并允许更大的批次大小。