DAC
概述
DAC模型由Rithesh Kumar、Prem Seetharaman、Alejandro Luebs、Ishaan Kumar和Kundan Kumar在Descript Audio Codec: High-Fidelity Audio Compression with Improved RVQGAN中提出。
Descript音频编解码器(DAC)模型是一种强大的工具,用于压缩音频数据,使其在存储和传输方面非常高效。通过将44.1 KHz的音频压缩为仅8kbps带宽的令牌,DAC模型能够在显著减少数据占用的同时实现高质量的音频处理。这在带宽有限或存储空间宝贵的场景中尤为有用,例如流媒体应用、远程会议和大型音频数据集的存档。
论文的摘要如下:
语言模型已成功用于建模自然信号,如图像、语音和音乐。这些模型的一个关键组成部分是高质量的神经压缩模型,它可以将高维自然信号压缩为低维离散标记。为此,我们引入了一种高保真通用神经音频压缩算法,该算法能够将44.1 KHz的音频以仅8kbps的带宽压缩为标记,实现约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
类 transformers.DacConfig
< source >( 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
, optional, defaults to 64) — 编码器的中间表示维度。 - downsampling_ratios (
List[int]
, 可选, 默认为[2, 4, 8, 8]
) — 编码器中的下采样比率。这些比率在解码器中以相反的顺序用于上采样。 - decoder_hidden_size (
int
, optional, defaults to 1536) — 解码器的中间表示维度。 - n_codebooks (
int
, 可选, 默认为 9) — VQVAE 中的码书数量。 - codebook_size (
int
, optional, defaults to 1024) — 每个码本中的离散代码数量。 - codebook_dim (
int
, 可选, 默认为 8) — 码书向量的维度。如果未定义,则使用encoder_hidden_size
. - quantizer_dropout (
bool
, optional, defaults to 0) — 是否对量化器应用 dropout. - commitment_loss_weight (float, optional, defaults to 0.25) — VQVAE损失函数中承诺损失项的权重。
- codebook_loss_weight (float, optional, defaults to 1.0) — VQVAE损失函数中codebook损失项的权重。
- sampling_rate (
int
, optional, defaults to 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
< source >( feature_size: int = 1 sampling_rate: int = 16000 padding_value: float = 0.0 hop_length: int = 512 **kwargs )
构建一个Dac特征提取器。
此特征提取器继承自SequenceFeatureExtractor,其中包含 大部分主要方法。用户应参考此超类以获取有关这些方法的更多信息。
__call__
< source >( raw_audio: typing.Union[numpy.ndarray, typing.List[float], typing.List[numpy.ndarray], typing.List[typing.List[float]]] padding: typing.Union[bool, str, transformers.utils.generic.PaddingStrategy, NoneType] = None truncation: typing.Optional[bool] = False max_length: typing.Optional[int] = None return_tensors: typing.Union[str, transformers.utils.generic.TensorType, NoneType] = None sampling_rate: typing.Optional[int] = 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
or PaddingStrategy, optional, defaults toTrue
) — Select a strategy to pad the returned sequences (according to the model’s padding side and padding index) among:True
or'longest'
: Pad to the longest sequence in the batch (or no padding if only a single sequence if provided).'max_length'
: Pad to a maximum length specified with the argumentmax_length
or to the maximum acceptable input length for the model if that argument is not provided.False
or'do_not_pad'
(default): No padding (i.e., can output a batch with sequences of different lengths).
- 截断 (
bool
, 可选, 默认为False
) — 激活截断功能,将超过max_length
的输入序列截断至max_length
. - max_length (
int
, optional) — 返回列表的最大长度以及可选的填充长度(见上文)。 - return_tensors (
str
或 TensorType, 可选, 默认为 ‘pt’) — 如果设置,将返回张量而不是Python整数列表。可接受的值有:'tf'
: 返回 TensorFlowtf.constant
对象。'pt'
: 返回 PyTorchtorch.Tensor
对象。'np'
: 返回 Numpynp.ndarray
对象。
- sampling_rate (
int
, optional) —audio
输入被采样的采样率。强烈建议在前向调用时传递sampling_rate
以防止静默错误。
用于特征化并为一个或多个序列准备模型的主要方法。
DacModel
类 transformers.DacModel
< source >( config: DacConfig )
参数
- config (DacConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,仅加载配置。查看 from_pretrained() 方法以加载模型权重。
DAC(描述音频编解码器)模型。 该模型继承自PreTrainedModel。请查看超类文档以了解库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入的大小、修剪头部等)。
该模型也是一个PyTorch torch.nn.Module 子类。 将其作为常规的PyTorch模块使用,并参考PyTorch文档以获取与一般使用和行为相关的所有信息。
解码
< source >( quantized_representation: typing.Optional[torch.Tensor] = None audio_codes: typing.Optional[torch.Tensor] = None return_dict: typing.Optional[bool] = None ) → transformers.models.dac.modeling_dac.DacDecoderOutput
或 tuple(torch.FloatTensor)
参数
- quantized_representation (形状为
(batch_size, dimension, time_steps)
的 torch.Tensor, 可选) — 输入的量化连续表示。 - audio_codes (
torch.Tensor
形状为(batch_size, num_codebooks, time_steps)
, 可选) — 每个码本的码本索引,表示输入的量化离散表示。如果您想直接从音频代码解码(它将覆盖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 (
torch.FloatTensor
形状为(batch_size, input_length)
, 可选) — 使用 Dac 的解码器部分获得的解码音频值。
解码给定的潜在代码并返回音频数据
编码
< source >( input_values: Tensor n_quantizers: int = None return_dict: typing.Optional[bool] = None ) → transformers.models.dac.modeling_dac.DacEncoderOutput
或 tuple(torch.FloatTensor)
参数
- input_values (
torch.Tensor of shape
(batch_size, 1, time_steps)`) — 用于编码的输入音频数据, - 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 (
torch.Tensor
形状为(batch_size, dimension, time_steps)
, 可选) — 输入的量化连续表示。 - audio_codes (
torch.Tensor
形状为(batch_size, num_codebooks, time_steps)
, 可选) — 每个码本的码本索引(输入的量化离散表示)。 - projected_latents (
torch.Tensor
形状为(batch_size, num_codebooks * dimension, time_steps)
, 可选) — 投影的潜在变量(量化前的输入的连续表示)。
对给定的音频数据进行编码并返回量化后的潜在代码
前进
< source >( input_values: Tensor n_quantizers: int = None return_dict: typing.Optional[bool] = None ) → transformers.models.dac.modeling_dac.DacOutput
或 tuple(torch.FloatTensor)
参数
- input_values (
torch.Tensor
of shape(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)
) — 投影的潜在变量(量化前的输入的连续表示)。
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