DAC
概述
DAC模型由Ritesh Kumar、Prem Seetharaman、Alejandro Luebs、Ishaan Kumar和Kundan Kumar在Descript音频编解码器:基于改进的RVQGAN的高保真音频压缩中提出。
Descript音频编解码器(DAC)模型是一个强大的音频数据压缩工具,使其在存储和传输方面非常高效。通过将44.1 KHz音频压缩成仅8kbps带宽的token,DAC模型能够在显著降低数据占用量的同时实现高质量的音频处理。这在带宽受限或存储空间宝贵的情况下尤其有用,例如流媒体应用、远程会议和大型音频数据集的归档。
论文摘要如下:
语言模型已成功用于对自然信号(如图像、语音和音乐)进行建模。这些模型的一个关键组成部分是一个高质量的神经压缩模型,它可以将高维自然信号压缩成低维离散token。为此,我们引入了一种高保真通用神经音频压缩算法,该算法实现了将44.1 KHz音频压缩成仅8kbps带宽的token,压缩率约为90倍。我们通过结合高保真音频生成方面的进步和来自图像领域的更好的矢量量化技术,以及改进的对抗性和重建损失来实现这一点。我们使用单个通用模型压缩所有领域(语音、环境、音乐等),使其广泛适用于所有音频的生成建模。我们将其与竞争的音频压缩算法进行了比较,发现我们的方法明显优于它们。我们对每个设计选择都提供了彻底的消融研究,以及开源代码和训练好的模型权重。我们希望我们的工作能够为下一代高保真音频建模奠定基础。
该模型由Kamil Akesbi贡献。原始代码可以在这里找到这里。
模型结构
Descript音频编解码器(DAC)模型分为三个不同的阶段:
- 编码器模型:此阶段压缩输入音频,减小其大小,同时保留必要的信息。
- 残差矢量量化(RVQ)模型:此模型与编码器协同工作,对音频的潜在代码进行量化,优化压缩并确保高质量的重建。
- 解码器模型:此最终阶段从压缩形式重建音频,将其恢复到与原始输入非常接近的状态。
使用示例
以下是如何使用此模型对音频进行编码和解码的快速示例
>>> from datasets import load_dataset, Audio
>>> from transformers import DacModel, AutoProcessor
>>> librispeech_dummy = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> model = DacModel.from_pretrained("descript/dac_16khz")
>>> processor = AutoProcessor.from_pretrained("descript/dac_16khz")
>>> librispeech_dummy = librispeech_dummy.cast_column("audio", Audio(sampling_rate=processor.sampling_rate))
>>> audio_sample = librispeech_dummy[-1]["audio"]["array"]
>>> inputs = processor(raw_audio=audio_sample, sampling_rate=processor.sampling_rate, return_tensors="pt")
>>> encoder_outputs = model.encode(inputs["input_values"])
>>> # Get the intermediate audio codes
>>> audio_codes = encoder_outputs.audio_codes
>>> # Reconstruct the audio from its quantized representation
>>> audio_values = model.decode(encoder_outputs.quantized_representation)
>>> # or the equivalent with a forward pass
>>> audio_values = model(inputs["input_values"]).audio_values
DacConfig
class transformers.DacConfig
< 源代码 >( encoder_hidden_size = 64 downsampling_ratios = [2, 4, 8, 8] decoder_hidden_size = 1536 n_codebooks = 9 codebook_size = 1024 codebook_dim = 8 quantizer_dropout = 0 commitment_loss_weight = 0.25 codebook_loss_weight = 1.0 sampling_rate = 16000 **kwargs )
参数
- encoder_hidden_size (
int
, 可选, 默认为 64) — 编码器的中间表示维度。 - downsampling_ratios (
List[int]
, 可选, 默认为[2, 4, 8, 8]
) — 编码器中下采样的比率。这些比率在解码器中以相反的顺序用于上采样。 - decoder_hidden_size (
int
, 可选, 默认为 1536) — 解码器的中间表示维度。 - n_codebooks (
int
, 可选, 默认为 9) — VQVAE 中码本的数量。 - codebook_size (
int
, 可选, 默认为 1024) — 每个码本中离散代码的数量。 - codebook_dim (
int
, 可选, 默认为 8) — 码本向量的维度。如果未定义,则使用encoder_hidden_size
。 - codebook_loss_weight (浮点数, 可选, 默认为 1.0) — VQVAE 损失函数中码本损失项的权重。
- sampling_rate (
int
, 可选, 默认为 16000) — 音频波形应以赫兹 (Hz) 表示的数字化采样率。
这是用于存储 DacModel 配置的配置类。它用于根据指定的参数实例化 Dac 模型,定义模型架构。使用默认值实例化配置将产生类似于 descript/dac_16khz 架构的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
示例
>>> from transformers import DacModel, DacConfig
>>> # Initializing a "descript/dac_16khz" style configuration
>>> configuration = DacConfig()
>>> # Initializing a model (with random weights) from the "descript/dac_16khz" style configuration
>>> model = DacModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
DacFeatureExtractor
类 transformers.DacFeatureExtractor
< 源代码 >( feature_size: int = 1 sampling_rate: int = 16000 padding_value: float = 0.0 hop_length: int = 512 **kwargs )
构造一个 Dac 特征提取器。
此特征提取器继承自 SequenceFeatureExtractor,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。
__call__
( raw_audio: Union padding: Union = None truncation: Optional = False max_length: Optional = None return_tensors: Union = None sampling_rate: Optional = None ) 参数
- raw_audio (
np.ndarray
,List[float]
,List[np.ndarray]
,List[List[float]]
) — 要处理的序列或序列批次。每个序列可以是 NumPy 数组、浮点数列表、NumPy 数组列表或浮点数列表列表。对于单声道音频(feature_size = 1
),NumPy 数组的形状必须为(num_samples,)
,对于立体声音频(feature_size = 2
),形状必须为(2, num_samples)
。 - padding (
bool
,str
或 PaddingStrategy, 可选,默认为True
) — 在以下选项中选择一种策略来填充返回的序列(根据模型的填充侧和填充索引):True
或'longest'
:填充到批次中最长的序列(如果只提供单个序列,则不填充)。'max_length'
:填充到使用参数max_length
指定的最大长度,或者如果未提供该参数,则填充到模型可接受的最大输入长度。False
或'do_not_pad'
(默认):不填充(即,可以输出具有不同长度序列的批次)。
- truncation (
bool
, 可选,默认为False
) — 激活截断以将长度超过max_length
的输入序列截断为max_length
。 - max_length (
int
, 可选) — 返回列表的最大长度,以及可选的填充长度(见上文)。 - return_tensors (
str
或 TensorType, 可选,默认为 ‘pt’) — 如果设置,将返回张量而不是 Python 整数列表。可接受的值为:'tf'
:返回 TensorFlowtf.constant
对象。'pt'
:返回 PyTorchtorch.Tensor
对象。'np'
:返回 NumPynp.ndarray
对象。
- sampling_rate (
int
, 可选) —audio
输入采样的采样率。强烈建议在正向调用中传递sampling_rate
以防止静默错误。
将一个或多个序列特征化并为模型准备的主要方法。
DacModel
类 transformers.DacModel
< 源代码 >( config: DacConfig )
参数
- config (DacConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。查看 from_pretrained() 方法以加载模型权重。
DAC(Descript音频编解码器)模型。此模型继承自PreTrainedModel。请查看超类文档以了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入的大小、修剪注意力头等)。
此模型也是 PyTorch torch.nn.Module 的子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档以了解与一般用法和行为相关的所有事项。
解码
< 源代码 > ( quantized_representation: 可选 audio_codes: 可选,默认为 None return_dict: 可选,默认为 None ) → transformers.models.dac.modeling_dac.DacDecoderOutput
或 tuple(torch.FloatTensor)
参数
- quantized_representation (形状为
(batch_size, dimension, time_steps)
的 torch.Tensor) — 输入的量化连续表示。 - audio_codes (形状为
(batch_size, num_codebooks, time_steps)
的torch.Tensor
,可选) — 每个码本的码本索引,表示输入的量化离散表示。如果要直接从音频码解码,则应提供此参数(它将覆盖 quantized_representation)。 - return_dict (
bool
,可选) — 是否返回 ModelOutput 而不是普通元组。
返回值
transformers.models.dac.modeling_dac.DacDecoderOutput
或 tuple(torch.FloatTensor)
一个 transformers.models.dac.modeling_dac.DacDecoderOutput
或一个 torch.FloatTensor
元组(如果传递了 return_dict=False
或 config.return_dict=False
),包含取决于配置(DacConfig)和输入的各种元素。
- audio_values (形状为
(batch_size, input_length)
的torch.FloatTensor
,可选) — 使用 Dac 的解码器部分获得的解码音频值。
解码给定的潜在代码并返回音频数据
编码
< 源代码 > ( input_values: 张量 n_quantizers: int,默认为 None return_dict: 可选,默认为 None ) → transformers.models.dac.modeling_dac.DacEncoderOutput
或 tuple(torch.FloatTensor)
参数
- input_values (形状为
(batch_size, 1, time_steps)
的torch.Tensor
) — 要编码的输入音频数据。 - n_quantizers (int,可选) — 要使用的量化器数量。如果为 None,则使用所有量化器。默认为 None。
- return_dict (
bool
,可选) — 是否返回 ModelOutput 而不是普通元组。
返回值
transformers.models.dac.modeling_dac.DacEncoderOutput
或 tuple(torch.FloatTensor)
一个 transformers.models.dac.modeling_dac.DacEncoderOutput
或一个 torch.FloatTensor
元组(如果传递了 return_dict=False
或 config.return_dict=False
),包含取决于配置(DacConfig)和输入的各种元素。
- loss (
torch.Tensor
) — 来自编码器模型的损失,包括承诺损失和码本损失的加权组合。 - quantized_representation (形状为
(batch_size, dimension, time_steps)
的torch.Tensor
,可选) — 输入的量化连续表示。 - audio_codes (形状为
(batch_size, num_codebooks, time_steps)
的torch.Tensor
,可选) — 每个码本的码本索引(输入的量化离散表示)。 - projected_latents (形状为
(batch_size, num_codebooks * dimension, time_steps)
的torch.Tensor
,可选) — 投影后的潜在变量(量化前输入的连续表示)。
编码给定的音频数据并返回量化的潜在代码
前向传播
< 源代码 > ( input_values: 张量 n_quantizers: int = None return_dict: Optional = None ) → transformers.models.dac.modeling_dac.DacOutput
或 tuple(torch.FloatTensor)
参数
- input_values (
torch.Tensor
形状为(batch_size, 1, time_steps)
). — 要编码的音频数据, - n_quantizers (
int
, 可选) — 要使用的量化器数量。如果为None
,则使用所有量化器。默认为None
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是普通元组。
返回值
transformers.models.dac.modeling_dac.DacOutput
或 tuple(torch.FloatTensor)
一个 transformers.models.dac.modeling_dac.DacOutput
或一个 torch.FloatTensor
的元组(如果传递了 return_dict=False
或当 config.return_dict=False
时),包含取决于配置 (DacConfig) 和输入的各种元素。
- loss (
torch.Tensor
) — 来自编码器模型的损失,包括承诺损失和码本损失的加权组合。 - audio_values (
torch.Tensor
形状为(batch_size, input_length)
) — 重建的音频数据。 - quantized_representation (
torch.Tensor
形状为(batch_size, dimension, time_steps)
) — 输入的量化连续表示。 - audio_codes (
torch.LongTensor
形状为(batch_size, num_codebooks, time_steps)
) — 每个码本的码本索引(输入的量化离散表示)。 - projected_latents (
torch.Tensor
形状为(batch_size, num_codebooks * dimension, time_steps)
) — 投影后的潜在变量(量化前输入的连续表示)。
The DacModel 正向传播方法,覆盖了 __call__
特殊方法。
虽然正向传播的配方需要在此函数中定义,但之后应该调用 Module
实例,而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则会静默地忽略它们。
示例
>>> from datasets import load_dataset, Audio
>>> from transformers import DacModel, AutoProcessor
>>> librispeech_dummy = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> model = DacModel.from_pretrained("descript/dac_16khz")
>>> processor = AutoProcessor.from_pretrained("descript/dac_16khz")
>>> librispeech_dummy = librispeech_dummy.cast_column("audio", Audio(sampling_rate=processor.sampling_rate))
>>> audio_sample = librispeech_dummy[-1]["audio"]["array"]
>>> inputs = processor(raw_audio=audio_sample, sampling_rate=processor.sampling_rate, return_tensors="pt")
>>> encoder_outputs = model.encode(inputs["input_values"])
>>> # Get the intermediate audio codes
>>> audio_codes = encoder_outputs.audio_codes
>>> # Reconstruct the audio from its quantized representation
>>> audio_values = model.decode(encoder_outputs.quantized_representation)
>>> # or the equivalent with a forward pass
>>> audio_values = model(inputs["input_values"]).audio_values