Transformers documentation

X-Codec2

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

该模型于 2025-02-06 在 HF papers 上发布,并于 2026-06-25 贡献至 Hugging Face Transformers。

X-Codec2

SDPA

概述

X-Codec2 模型在 Llasa: Scaling Train-Time and Inference-Time Compute for Llama-based Speech Synthesis 中提出。

X-Codec2 是一种神经音频编解码器,旨在提升大语言模型(LLM)流水线中的语音合成和通用音频生成能力。它通过优化语义信息与声学信息的融合及分词方式,对原始 X-Codec 进行了扩展,从而实现高效且高保真的音频表示。

关于其架构:

  • 统一语义-声学分词:X-Codec2 将语义编码器(例如 Wav2Vec2-BERT)和声学编码器的输出融合为单一嵌入,同时捕捉高层语义(例如文本内容、情感)和低层音频细节(例如音色)。
  • 单阶段特征标量量化(FSQ):与大多数方法(例如 DAC、EnCodec、X-Codec、Mimi)中使用的多层残差 VQ 不同,X-Codec2 采用单层特征标量量化(FSQ),以确保稳定性并兼容因果自回归 LLM。
  • 对 Transformer 友好的设计:X-Codec2 的一维 token 结构与 LLaMA 等大语言模型中的自回归建模天然契合,从而提升了训练效率和下游兼容性。

模型检查点可在 HKUSTAudio/xcodec2-hf 获取。

该模型由 Eric Bezzam 和 Steven Zheng 贡献。 原始建模代码可在此处找到,其训练代码位于此处。

使用示例

以下是使用此模型对音频进行编码和解码的简单示例:

from datasets import Audio, load_dataset
from transformers import AutoFeatureExtractor, AutoModel

model_id = "HKUSTAudio/xcodec2-hf"
model = AutoModel.from_pretrained(model_id, device_map="auto")
feature_extractor = AutoFeatureExtractor.from_pretrained(model_id)

dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
dataset = dataset.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
audio = dataset[0]["audio"]["array"]
inputs = feature_extractor(audio=audio, sampling_rate=feature_extractor.sampling_rate, return_tensors="pt").to(
    model.device, model.dtype
)
print("Input waveform shape:", inputs["input_values"].shape)
# Input waveform shape: torch.Size([1, 1, 93760])

# encoder and decoder
audio_codes = model.encode(**inputs).audio_codes
print("Audio codes shape:", audio_codes.shape)
# Audio codes shape: torch.Size([1, 1, 293])
audio_values = model.decode(audio_codes).audio_values
print("Audio values shape:", audio_values.shape)
# Audio values shape: torch.Size([1, 1, 93760])

# Equivalently, you can do encoding and decoding in one step
model_output = model(**inputs)
audio_codes = model_output.audio_codes
audio_values = model_output.audio_values

批处理

与最初的 发布版本 不同,此实现还支持批量输入!

from datasets import Audio, load_dataset
from transformers import AutoFeatureExtractor, AutoModel

batch_size = 2
model_id = "HKUSTAudio/xcodec2-hf"
model = AutoModel.from_pretrained(model_id, device_map="auto")
feature_extractor = AutoFeatureExtractor.from_pretrained(model_id)

dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
dataset = dataset.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
audios = [dataset[i]["audio"]["array"] for i in range(batch_size)]
inputs = feature_extractor(audio=audios, sampling_rate=feature_extractor.sampling_rate, return_tensors="pt").to(
    model.device, model.dtype
)
print("Input waveform shape:", inputs["input_values"].shape)
# Input waveform shape: torch.Size([2, 1, 93760])

# encoder and decoder
encoder_output = model.encode(**inputs)
audio_codes = encoder_output.audio_codes
print("Audio codes shape:", audio_codes.shape)
# Audio codes shape: torch.Size([2, 1, 293])
audio_values = model.decode(audio_codes).audio_values
print("Audio values shape:", audio_values.shape)
# Audio values shape: torch.Size([2, 1, 93760])

# Equivalently, you can do encoding and decoding in one step
model_output = model(**inputs)
audio_codes = model_output.audio_codes
audio_values = model_output.audio_values

使用 torch.compile 加速

你可以使用 torch.compile 来加速推理。由于编译开销,前几次调用会较慢,但后续调用会更快。

在 A100 上,当批处理大小为 4 时,我们观察到约 1.35 倍的加速效果(脚本)。

import torch
from datasets import Audio, load_dataset
from transformers import AutoFeatureExtractor, AutoModel

batch_size = 4
model_id = "HKUSTAudio/xcodec2-hf"
model = AutoModel.from_pretrained(model_id, device_map="auto")
feature_extractor = AutoFeatureExtractor.from_pretrained(model_id)

dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
dataset = dataset.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
audios = [dataset[i]["audio"]["array"] for i in range(batch_size)]
inputs = feature_extractor(
    audio=audios, sampling_rate=feature_extractor.sampling_rate, padding=True, return_tensors="pt"
).to(model.device, model.dtype)

compiled_model = torch.compile(model, fullgraph=True)

# Warmup (includes compilation on first call)
for _ in range(10):
    with torch.inference_mode():
        _ = compiled_model(**inputs)

with torch.inference_mode():
    output = compiled_model(**inputs)
print("Audio values shape:", output.audio_values.shape)

Xcodec2Config

class transformers.Xcodec2Config

< >

( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonehidden_size: int = 1024intermediate_size: int = 4096num_hidden_layers: int = 12num_attention_heads: int = 16num_key_value_heads: int = 16hidden_act: str = 'silu'max_position_embeddings: int = 4096initializer_range: float = 0.02rms_norm_eps: float = 1e-06pad_token_id: int | None = Nonetie_word_embeddings: bool = Falserope_parameters: transformers.modeling_rope_utils.RopeParameters | dict | None = Noneattention_bias: bool = Falseattention_dropout: int | float | None = 0.0head_dim: int = 64encoder_hidden_size: int = 48downsampling_ratios: list[int] | tuple[int, ...] = (2, 2, 4, 4, 5)semantic_model_config: dict | transformers.configuration_utils.PreTrainedConfig | None = Nonesampling_rate: int = 16000activation_dropout: float = 0.1quantization_dim: int = 2048quantization_levels: list[int] | tuple[int, ...] = (4, 4, 4, 4, 4, 4, 4, 4) )

参数

  • hidden_size (int,可选,默认为 1024) — 隐藏表示的维度。
  • intermediate_size (int,可选,默认为 4096) — MLP 表示的维度。
  • num_hidden_layers (int, 可选, 默认为 12) — Transformer 解码器中的隐藏层数量。
  • num_attention_heads (int,可选,默认为 16) — Transformer 解码器中每个注意力层的注意力头数量。
  • num_key_value_heads (int, 可选,默认为 16) — 这是用于实现 Grouped Query Attention 的 key_value 头数。如果 num_key_value_heads=num_attention_heads,模型将使用 Multi Head Attention (MHA);如果 num_key_value_heads=1,模型将使用 Multi Query Attention (MQA);否则将使用 GQA。在将多头检查点转换为 GQA 检查点时,每个组的 key 和 value 头应通过对该组内所有原始头进行平均池化来构建。更多详情请参阅 这篇论文。如果未指定,则默认为 num_attention_heads。
  • hidden_act (str,可选,默认为 silu) — 解码器中的非线性激活函数(函数或字符串)。例如,"gelu"、 "relu"、"silu" 等。
  • max_position_embeddings (int,可选,默认为 4096) — 该模型可能使用的最大序列长度。
  • initializer_range (float,可选,默认为 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。
  • rms_norm_eps (float,可选,默认为 1e-06) — RMS 归一化层使用的 epsilon 值。
  • pad_token_id (int, 可选) — 词表中用于填充的 token id。
  • tie_word_embeddings (bool,可选,默认为 False) — 是否根据模型的 tied_weights_keys 映射来绑定权重嵌入。
  • rope_parameters (Union[~modeling_rope_utils.RopeParameters, dict], 可选) — 包含 RoPE 嵌入配置参数的字典。该字典应包含 rope_theta 的值,并且如果希望使用 RoPE 处理更长的 max_position_embeddings,则可选地包含用于缩放的参数。
  • attention_bias (bool,可选,默认为 False) — 在自注意力机制中,是否在 query、key、value 和 output 投影层中使用偏置。
  • attention_dropout (Union[int, float],可选,默认为 0.0) — 注意力概率的 dropout 比率。
  • head_dim (int,可选,默认为 64) — 注意力头维度。如果为 None,则默认为 hidden_size // num_attention_heads
  • encoder_hidden_size (int,可选,默认为 48) — 隐藏表示的维度。
  • downsampling_ratios (list[int],可选,默认为 [2, 2, 4, 4, 5]) — 编码器中用于下采样的比例。
  • semantic_model_config (Union[Dict, Wav2Vec2BertConfig], 可选) — 语义(Wav2Vec2BertConfig)模型的配置对象实例。
  • sampling_rate (int,可选,默认为 16000) — 音频文件应被数字化时的采样率,以赫兹(Hz)为单位。
  • activation_dropout (float,可选,默认为 0.1) — 全连接层中激活值的 dropout 比率。
  • quantization_dim (int,可选,默认为 2048) — 向量量化码本的维度。
  • quantization_levels (list[int],可选,默认为 [4, 4, 4, 4, 4, 4, 4, 4]) — 向量量化码本中的层级数。

这是用于存储 Xcodec2Model 配置的类。它根据指定的参数实例化 Xcodec2 模型,并定义模型架构。使用默认值实例化配置将得到与 HKUSTAudio/xcodec2-hf 类似的配置。

配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。

示例:

>>> from transformers import Xcodec2Config, Xcodec2Model

>>> # Initializing configuration
>>> configuration = Xcodec2Config()

>>> # Initializing a model (with random weights) from the configuration
>>> model = Xcodec2Model(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config

Xcodec2FeatureExtractor

class transformers.Xcodec2FeatureExtractor

< >

( feature_size = 80sampling_rate = 16000padding_value = 1.0hop_length = 320**kwargs )

参数

  • feature_size (int,可选,默认为 80) — 提取特征的维度。
  • sampling_rate (int,可选,默认为 16000) — 音频文件应被数字化时的采样率,以赫兹 (Hz) 为单位。
  • padding_value (float, 可选,默认为 1.0) — 用于填充梅尔频谱图中填充向量的值。
  • hop_length (int,可选,默认为 320) — 每帧编码的音频采样点数。等于下采样率的乘积。 用于声学编码器的输入填充。

构建 Xcodec2 特征提取器,用于为语义编码器计算梅尔滤波器组特征,并为声学编码器填充音频。

此特征提取器继承自 SequenceFeatureExtractor,后者包含了大部分主要方法。用户应参考该父类以获取有关这些方法的更多信息。

__call__

< >

( audio: typing.Union[numpy.ndarray, ForwardRef('torch.Tensor'), collections.abc.Sequence[numpy.ndarray], collections.abc.Sequence['torch.Tensor']]padding: bool | str | transformers.utils.generic.PaddingStrategy = Truemax_length: int | None = Nonetruncation: bool = Falsereturn_tensors: str | transformers.utils.generic.TensorType | None = Nonesampling_rate: int | None = Nonedevice: str = 'cpu'**kwargs )

参数

  • audio (np.ndarray、torch.Tensor、list[np.ndarray]、list[torch.Tensor]) — 形状为 (num_channels, sequence_length) 的 Numpy 数组或 torch 张量。也可以提供此类数组或张量的列表,以表示一批输入。
  • padding (bool, str 或 PaddingStrategy, 可选, 默认为 True) — 选择一种策略,根据模型的填充侧和填充索引对返回的序列进行填充,可选策略如下:
    • True 或 'longest':填充至批次中最长的序列(如果仅提供单个序列,则不进行填充)。
    • 'max_length':填充至由参数 max_length 指定的最大长度;若未提供该参数,则填充至模型可接受的最大输入长度。
    • False 或 'do_not_pad'(默认值):不进行填充(即可以输出包含不同长度序列的批次)。
  • max_length (int,可选) — 返回列表的最大长度,以及可选的填充长度(见上文)。
  • truncation (bool) — 启用截断,将长度超过 max_length 的输入序列截断为 max_length。
  • return_tensors (str 或 TensorType, 可选) — 如果设置,将返回张量而不是 Python 整数列表。可接受的值为:
    • 'tf':返回 TensorFlow tf.constant 对象。
    • 'pt':返回 PyTorch torch.Tensor 对象。
    • 'np':返回 Numpy np.ndarray 对象。
  • sampling_rate (int, 可选) — audio 输入被采样时的采样率。强烈建议在 forward 调用时传入 sampling_rate,以避免静默错误。
  • device (str,可选,默认为 "cpu") — 在梅尔滤波器组特征提取过程中,用于 PyTorch 张量的设备。
  • kwargs (可选) — 将传递给分词器或特征提取器的其余关键字参数字典。

Xcodec2Model

class transformers.Xcodec2Model

< >

( config: Xcodec2Config )

参数

  • config (Xcodec2Config) — 模型配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。

Xcodec2 神经音频编解码器模型。

该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。

该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。

decode

< >

( audio_codes: typing.Optional[torch.Tensor] = Nonelatents: typing.Optional[torch.Tensor] = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → Xcodec2DecoderOutput or tuple(torch.Tensor)

参数

  • audio_codes(形状为 (batch_size, 1, codes_length) 的 torch.LongTensor)— 使用 model.encode 计算得出的离散编码索引。
  • latents(形状为 (batch_size, dimension, time_steps) 的 torch.Tensor,可选) — 输入的量化连续表示。

返回值

Xcodec2DecoderOutput 或 tuple(torch.Tensor)

Xcodec2DecoderOutput 或 torch.Tensor 元组(如果传入 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(None)和输入。

  • audio_values(形状为 (batch_size, 1, segment_length) 的 torch.Tensor,可选)— 时域中的解码音频波形值,通过将离散编码转换回连续音频信号获得。这表示可以播放的重建音频。

encode

< >

( input_values: Tensorinput_features: Tensorpadding_mask: typing.Optional[torch.Tensor] = Noneinput_features_mask: typing.Optional[torch.Tensor] = Noneoutput_latents: bool = False**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → Xcodec2EncoderOutput or tuple(torch.Tensor)

参数

  • input_values(形状为 (batch_size, 1, sequence_length) 的 torch.Tensor)— 输入音频波形。
  • input_features(形状为 (batch_size, mel_bins, time_steps) 的 torch.Tensor)— 用于语义编码的输入音频梅尔频谱图。
  • padding_mask(形状为 (batch_size, 1, sequence_length) 的 torch.Tensor)— 用于填充 input_values 的填充掩码。
  • input_features_mask(形状为 (batch_size, time_steps) 的 torch.Tensor,可选) — 用于语义编码器频谱图输入的注意力掩码。有效帧为 1,填充为 0。
  • output_latents (bool,可选,默认为 False) — 是否返回来自量化器的连续潜在表示。

返回值

Xcodec2EncoderOutput 或 tuple(torch.Tensor)

Xcodec2EncoderOutput 或 torch.Tensor 元组(如果传入 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(None)和输入。

  • audio_codes(形状为 (batch_size, 1, codes_length) 的 torch.LongTensor,可选)— 使用 model.encode 计算得到的离散码嵌入。这些嵌入表示输入音频信号的压缩、量化形式,可用于存储、传输或生成。
  • latents(形状为 (batch_size, dimension, time_steps) 的 torch.Tensor)— 输入嵌入的量化连续表示。
  • audio_codes_mask(形状为 (batch_size, 1, codes_length) 的 torch.int32,可选)— 下采样后的 padding_mask,用于指示 audio_codes 中有效的音频编码。

forward

< >

( input_values: Tensorinput_features: Tensorpadding_mask: typing.Optional[torch.Tensor] = Noneinput_features_mask: typing.Optional[torch.Tensor] = Noneoutput_latents: bool = False**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → Xcodec2Output or tuple(torch.Tensor)

参数

  • input_values(形状为 (batch_size, 1, sequence_length) 的 torch.Tensor)— 输入音频波形。
  • input_features(形状为 (batch_size, mel_bins, time_steps) 的 torch.Tensor)— 用于语义编码的输入音频梅尔频谱图。
  • padding_mask(形状为 (batch_size, 1, sequence_length) 的 torch.Tensor)— 用于填充 input_values 的填充掩码。
  • input_features_mask(形状为 (batch_size, time_steps) 的 torch.Tensor,可选) — 用于语义编码器频谱图输入的注意力掩码。有效帧为 1,填充为 0。
  • output_latents (bool,可选,默认为 False) — 是否返回来自量化器的连续潜在表示。

返回值

Xcodec2Output 或 tuple(torch.Tensor)

Xcodec2Output 或 torch.Tensor 元组(如果传入 return_dict=False 或 config.return_dict=False),包含根据配置(None)和输入而定的各种元素。

Xcodec2Model 的 forward 方法重写了 __call__ 特殊方法。

尽管前向传播的实现需要在此函数中定义,但之后应调用 Module 实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。

  • audio_values(形状为 (batch_size, 1, sequence_length) 的 torch.Tensor,可选)— 使用 Xcodec2 的解码器部分获得的时间域解码音频波形值。这些值代表重建后的音频信号。
  • audio_codes(形状为 (batch_size, 1, codes_length) 的 torch.LongTensor,可选)— 使用 model.encode 计算得到的离散码嵌入。这些是输入音频的量化表示,用于后续处理或生成。
  • latents(形状为 (batch_size, dimension, time_steps) 的 torch.Tensor)— 输入嵌入的量化连续表示。
  • audio_codes_mask(形状为 (batch_size, 1, codes_length) 的 torch.int32,可选)— 下采样后的 padding_mask,用于指示 audio_codes 中有效的音频编码。

示例:

>>> from datasets import load_dataset
>>> from transformers import AutoFeatureExtractor, Xcodec2Model

>>> dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> audio = dataset["train"]["audio"][0]["array"]

>>> model_id = "HKUSTAudio/xcodec2-hf"
>>> model = Xcodec2Model.from_pretrained(model_id)
>>> feature_extractor = AutoFeatureExtractor.from_pretrained(model_id)

>>> inputs = feature_extractor(audio=audio, sampling_rate=feature_extractor.sampling_rate, return_tensors="pt")

>>> outputs = model(**inputs)
>>> audio_codes = outputs.audio_codes
>>> audio_values = outputs.audio_values
Update on GitHub