Transformers 中的 Wav2Vec2-BERT:从 Seamless 到开源语音理解的 Conformer 骨干模型
2026/9/10 2:38:06 网站建设 项目流程

Transformers 中的 Wav2Vec2-BERT:从 Seamless 到开源语音理解的 Conformer 骨干模型

【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers

导读

Wav2Vec2-BERT 是 Meta AI Seamless 语音翻译系统(SeamlessM4T v2 / Seamless 系列)所使用的大规模多语言语音预训练骨干模型,于 2024 年 1 月正式合入 Hugging Face Transformers。它继承 Wav2Vec2-Conformer 的架构基因,改用mel 频谱输入 + 因果深度可分离卷积,并可灵活切换四种位置编码方式,配合基于 Conformer 的适配器网络实现序列压缩。本文以 docs/source/en/model_doc/wav2vec2-bert.md 为主干,结合当前仓库中 configuration_wav2vec2_bert.py、modeling_wav2vec2_bert.py 与 processing_wav2vec2_bert.py 的源码实现,讲清它的由来、架构要点、全部可配置项,以及如何用 CTC、分类、帧级分类、说话人嵌入等任务头做微调与推理。


一、模型定位与来龙去脉

Wav2Vec2-BERT 出自论文 Seamless: Multilingual Expressive and Streaming Speech Translation(即 SeamlessM4T v2 / Seamless 论文),由 Meta AI 的 Seamless Communication 团队提出。依据官方模型文档:

  • 论文与模型发布于 2023-12-08,2024-01-18 合入 Transformers,由社区贡献者ylacombe提交,原始代码位于 Facebook 的seamless_communication仓库;
  • 该模型在超过 143 种语言、约 450 万小时的无标注音频上完成预训练;
  • 预训练模型本身不直接可用,必须针对下游任务(如自动语音识别 ASR、音频分类)进行微调;
  • 论文中的官方实验结果见原文 Section 3.2.1。

在 Seamless 的整体设计里,Wav2Vec2-BERT 扮演的是语音编码器/骨干的角色:Seamless 论文提出的 SeamlessExpressive、SeamlessStreaming 等端到端语音翻译系统都建立在统一的多语言语音理解能力之上,而 Wav2Vec2-BERT 正是把这种"海量多语言、可流式处理"的语音表示能力沉淀为独立可复用模型的关键成果。

需要说明:Wav2Vec2-BERT 在本仓库中承载的是"模型定义"层——即预训练骨干 + 各任务头(CTC 等)的 PyTorch 实现、配置与处理器,其姊妹模型如 SeamlessM4T v2、SeamlessStreaming 等则以更完整(含解码器)的形态存在于seamless_m4t_v2等模型目录中。


二、架构三要点:与 Wav2Vec2-Conformer 的差异

官方文档给出的 Usage tips 可归纳为三个核心架构要点,逐一与源码对应:

1. 输入从原始波形换成 mel 频谱

与 Wav2Vec2-Conformer 直接吃原始波形不同,Wav2Vec2-BERT 的输入是音频经 SeamlessM4T 特征抽取后的mel 频谱表示。体现在源码上,Wav2Vec2BertConfig 中:

feature_projection_input_dim: int = 160

feature_projection_input_dim(默认 160)正是 mel 频带数/特征维度,即经过SeamlessM4TFeatureExtractorWav2Vec2BertProcessor处理后的特征维度。随后 Wav2Vec2BertFeatureProjection 依次执行 LayerNorm(eps=layer_norm_eps)、线性投影到hidden_sizefeat_proj_dropout,将输入映射进模型空间。

Wav2Vec2BertPreTrainedModelmain_input_name设为"input_features"input_modalities设为"audio"(见 modeling_wav2vec2_bert.py),直接使用原始波形喂入会得到错误输入形状。

2. 因果深度可分离卷积

Conformer 块内部的标准卷积在这里被替换为因果 depthwise(深度可分离)1D 卷积。核心实现在 Wav2Vec2BertConvolutionModule:

  • 先做一层 LayerNorm,再经 Pointwise Conv1D 将通道数翻倍并通过nn.GLU门控;
  • 关键一行是torch.nn.functional.pad(hidden_states, (self.depthwise_conv.kernel_size[0] - 1, 0))——仅在序列左侧补零,使 depthwise 卷积严格只看到当前位置及之前的信息,保证"因果性",从而支持流式(streaming)解码,这是 SeamlessStreaming 低延迟翻译的重要基础;
  • 之后再做 depthwise LayerNorm、激活、第二个 Pointwise Conv 和conformer_conv_dropout
  • 卷积核大小由conv_depthwise_kernel_size(默认 31)控制,源码要求该值必须为奇数以保证 'SAME' padding。

若传入 attention mask,卷积前会把 padding 位置的隐藏状态masked_fill清零,防止 padding 泄漏进因果卷积(见 modeling_wav2vec2_bert.py)。

3. 编码器层 = 标准 Conformer block

整体编码器层(Wav2Vec2BertEncoderLayer)就是经典的 Conformer block 顺序:

  1. Feed-Forward 1(hidden_states * 0.5 + residual);
  2. Multi-Head Self-Attention + 残差;
  3. Conformer 卷积模块 + 残差;
  4. Feed-Forward 2 + 残差;
  5. 最终 LayerNorm。

默认配置hidden_size=1024、24 层、16 头、intermediate_size=4096,激活函数默认"swish"


三、位置编码:四种可选模式

Wav2Vec2-BERT 不再绑定单一位置编码方案,而是通过config.position_embeddings_type动态选择(见 configuration_wav2vec2_bert.py):

position_embeddings_type含义相关源码模块
None不施加相对位置编码——
"relative"Transformer-XL 风格(论文 1901.02860)相对位置编码,含可学习的pos_bias_u/pos_bias_v与移位(shift/skew)技巧_apply_relative_position_encoding
"relative_key"(默认)Shaw 风格(论文 1803.02155),基于距离表查找的 Embedding_apply_relative_key_position_encoding
"rotary"RoPE 旋转位置编码(论文 2104.09864)Wav2Vec2BertRotaryPositionalEmbedding

源码为每种模式都配了独立实现与专属超参,参见 modeling_wav2vec2_bert.py:

  • relative(Transformer-XL 式):需要max_source_positions(默认 5000,表示最大源输入位置数)。实现中同时缓存正/负两个方向的三角函数位置编码,通过"拼接后切片"的方式在 O(1) 内完成相对位置的 shifting;
  • relative_key(Shaw 式):需要left_max_position_embeddings(默认 64)与right_max_position_embeddings(默认 8),即相对距离的左/右裁剪边界。注意力分数计算对 query 与距离表做 einsum 得到位置偏置;
  • rotary(RoPE):需要rotary_embedding_base(默认 10000),位置编码在每层 attention 的 Q/K 上直接旋转叠加,且带缓存以加速长序列重复计算。

官方 checkpointfacebook/w2v-bert-2.0默认使用"relative_key",因此在加载原始 Seamless 权重后推理时不需要额外的绝对位置表,便于处理超出训练长度的输入。


四、基于 Conformer 的适配器网络

Wav2Vec2-BERT 还引入了一个Conformer 结构适配器网络(区别于 Wav2Vec2 系传统简单卷积适配器),用于在下游任务中通过卷积池化压缩时间轴,可显著降低 SpeechEncoderDecoder(编码器-解码器)类模型的序列长度。相关配置项包括:

配置项默认值作用
add_adapterFalse是否在编码器之上叠加适配器网络
adapter_kernel_size3适配器内卷积核大小
adapter_stride2适配器卷积步长(决定压缩比例)
num_adapter_layers1适配器层数
adapter_act"relu"适配器 FFN 激活函数,支持"gelu""relu""selu""swish""gelu_new"
use_intermediate_ffn_before_adapterFalse是否在适配器之前叠加一个中间 FFN 块
output_hidden_sizeNone(缺省等于hidden_size适配器输出维度,可先降维再压缩

从源码看(modeling_wav2vec2_bert.py),每层Wav2Vec2BertAdapterLayer由三条带 GLU + 步长卷积的下采样支路(残差卷积、self-attention 前的卷积、残差)加一个不含位置编码的 self-attention(is_adapter_attention=True,注意position_embeddings_type被置为None)以及 FFN 组成;前向时依据layerdrop概率随机丢弃层,并用_compute_new_attention_mask依据下采样后的序列长度重新生成注意力掩码,保证 mask 与压缩后的序列严格对齐。

config 类还暴露了validate_architecture()与便捷属性inputs_to_logits_ratio(见 configuration_wav2vec2_bert.py):前者在@strict装饰下校验use_intermediate_ffn_before_adapter=True时必须同时开启add_adapter,否则直接抛ValueError;后者在feature_projection_input_dim * 2的基础上再乘上adapter_stride**num_adapter_layers,用于估算输入特征到输出 logits 的下采样比。

主模型 Wav2Vec2BertModel 的forward顺序为:feature projection →(若 mask 概率 >0 实例化并应用masked_spec_embed)→ encoder →(可选)use_intermediate_ffn_before_adapter的半残差 FFN →(可选)adapter,返回包含last_hidden_stateextract_features的输出。


五、SpecAugment 掩码与 CTC 训练相关配置

用于预训练/微调的自监督或监督训练参数同样集中在 config 中,可参考源码中_mask_hidden_states(modeling_wav2vec2_bert.py)与_compute_mask_indices(modeling_wav2vec2_bert.py)的实现:

配置项默认值含义
apply_spec_augmentTrue是否对特征编码器输出施加 SpecAugment 数据增强
mask_time_prob0.05沿时间轴被掩码的特征向量比例(0~1);实际掩码数 =mask_time_prob*len(time_axis)/mask_time_length,由于重叠实际比例可能略低
mask_time_length10时间轴掩码 span 长度
mask_time_min_masks2每个时间步最少生成的时间轴掩码数(当理论掩码数不足时兜底)
mask_feature_prob0.0沿特征轴被掩码的比例
mask_feature_length10特征轴掩码 span 长度
mask_feature_min_masks0特征轴最少掩码数
ctc_loss_reduction"sum"CTC 损失的 reduction 方式
ctc_zero_infinityFalse是否将torch.nn.CTCLoss的无穷大 loss 及其梯度置零(输入过短无法对齐目标时容易出现)

掩码实现细节值得注意:_compute_mask_indices对每个样本按其真实长度(来自attention_mask)分别计算掩码 span 数量,采用概率取整(随机 epsilon),最终把掩码 span 展开回(batch, seq_len)的 bool 矩阵。mask_time_min_masks的作用正是在输入很短时确保仍生成最少数量个掩码。只有当apply_spec_augment=True时上述参数才生效,且时间轴掩码仅在训练模式下自动生成——推理期可传入预计算的mask_time_indices(自监督对比学习场景)来控制掩码位置。

在 Wav2Vec2BertForCTC 的forward中,CTC loss 计算时会把注意力掩码求和得到真实帧数,再经_get_feat_extract_output_lengths(若启用 adapter 则按卷积公式逐层下采样,见 modeling_wav2vec2_bert.py)换算为input_lengths,以pad_token_id(默认 0)作为 CTC blank;由于ctc_loss不支持 fp16,代码会把 logits 提升为 fp32 后再算损失。


六、五类模型类与各自的任务头

除了裸骨干 Wav2Vec2BertModel(支持from_pretrainedforward),本仓库还提供了 4 个带任务头的派生类,全部以 Wav2Vec2-Conformer/Seamless 生态约定实现:

类名适用任务任务头结构要点
Wav2Vec2BertForCTCASR 等 CTC 式语音转文字编码器 +final_dropoutDropout + 线性lm_headvocab_size;若开启 adapter,线性层输入维度取output_hidden_size;要求 config 必须定义vocab_size,否则报错
Wav2Vec2BertForSequenceClassificationSUPERB 式句子分类、关键词唤醒投影层(hidden_size → classifier_proj_size,默认 768)+ 均值池化 + 线性分类头;不兼容 adapter(add_adapter=True直接抛错);use_weighted_layer_sum=True时对各层隐状态做可学习加权平均
Wav2Vec2BertForAudioFrameClassification帧级分类(如声学事件/音素帧分类)直接在隐状态上做逐帧线性分类到num_labels;同样拒绝 adapter
Wav2Vec2BertForXVector说话人验证/识别带统计池化与TDNN(时延神经网络)塔的 XVector 头,用于提取定长说话人嵌入

其中分类类都提供freeze_base_model()方法(modeling_wav2vec2_bert.py),可将骨干冻结、只训练头部,降低微调显存需求。池化阶段若给了attention_mask,会先经_get_feature_vector_attention_mask还原特征帧级别的 mask,再按 mask 做加权均值池化,而不是对 padding 求平均。

XVector 头涉及的 TDNN 超参有tdnn_dim=(512, 512, 512, 512, 1500)(各层输出通道,tuple 长度即层数)、tdnn_kernel=(5, 3, 3, 1, 1)tdnn_dilation=(1, 2, 3, 1, 1),最终嵌入维度xvector_output_dim=512。实现上 TDNNLayer 内部用nn.Linear存参但以前向F.conv1d加速执行;说话人分类在 AMSoftmaxLoss 中以 AM-Softmax(scale=30、margin=0.4)形式训练,同时伴随可学习的 XVector 线性投影。

五类前向输出均遵循 Transformers 统一约定:无labels时只前向,loss=None;传入labels时自动计算相应损失并返回(loss, logits, ...)


七、Wav2Vec2BertProcessor:音频与文本的统一入口

由于输入是 mel 频谱、标签(CTC)是文本 token,官方文档将 Wav2Vec2BertProcessor 列为独立的可调用类。它的本质是"特征抽取器(继承 SeamlessM4TFeatureExtractor 的音频前处理逻辑)+ 文本 tokenizer"的ProcessorMixin组合,并暴露以下方法:

  • __call__:支持只传audio(返回input_features与音频attention_mask)、只传text(返回input_ids)或两者同传(在input_features上附加labels),用于直接构造 CTC 训练样本;两者皆空则抛ValueError
  • padinput_features走特征抽取器的 pad 逻辑、labels走 tokenizer 的 pad 逻辑,可分开也可同时 pad 并自动合并;
  • from_pretrained/save_pretrained:与其他 processor 一致,用于保存/加载preprocessor_config.json与 tokenizer 文件;
  • batch_decode/decode:把 token id 序列解码回文本,用于 CTC 输出(含批处理)的后期处理;
  • model_input_names:返回特征抽取器输入名 +"labels",便于 Trainer 等框架自动识别输入字段。

典型用法:Wav2Vec2BertProcessor.from_pretrained("facebook/w2v-bert-2.0"),然后对一批 (audio, transcript) 调用 processor 获得input_featuresattention_masklabels,即可喂给Wav2Vec2BertForCTC


八、开箱即用的 API 示例

配置类提供了最简初始化范式(见 configuration_wav2vec2_bert.py 的 Example):

from transformers import Wav2Vec2BertConfig, Wav2Vec2BertModel # 以 facebook/wav2vec2-bert-rel-pos-large 风格初始化一个随机权重的配置 configuration = Wav2Vec2BertConfig() # 用该配置初始化(随机权重)模型 model = Wav2Vec2BertModel(configuration) # 访问配置 configuration = model.config

加载官方预训练权重并做 CTC 推理/微调的最小流程:

from transformers import Wav2Vec2BertProcessor, Wav2Vec2BertForCTC processor = Wav2Vec2BertProcessor.from_pretrained("facebook/w2v-bert-2.0") model = Wav2Vec2BertForCTC.from_pretrained("facebook/w2v-bert-2.0") # audio 应已按特征抽取器要求采样,processor 内部负责转 mel 频谱 inputs = processor(audio=... , text=..., sampling_rate=16000, return_tensors="pt") outputs = model(**inputs) # 训练时可获得 CTC loss

需要特别强调的是:该模型预训练产物必须经过微调才能用于 ASR、音频分类等下游任务(官方模型卡/文档要求),直接零样本做 ASR 不在其设计目标内。另外当以 CTC 微调、且从含"relative_key"位置编码的 checkpoint 出发时,无需额外维护位置表即可支持流式解码(配合因果卷积)。

本模型还标注支持SDPA(Scaled Dot-Product Attention)Wav2Vec2BertPreTrainedModel_supports_sdpa = True_supports_flex_attn = True(modeling_wav2vec2_bert.py),attention 通过ALL_ATTENTION_FUNCTIONS分发到 eager/sdpa/flex 等后端;同时supports_gradient_checkpointing = True,长序列训练可开启梯度检查点。框架对 attention 的 eager 实现做了特殊保持(softmax 不做 fp32 upcast、无 GQA repeat),以与原始 Conformer 实现对齐。


九、工程化周边:转换脚本与可参考示例

仓库还附带一个与上游 Seamless 权重的转换工具 convert_wav2vec2_seamless_checkpoint.py,用于把原始 Seamless 的 checkpoint 结构映射成本实现可加载的格式(源码顶部注释标明该文件由modular_wav2vec2_bert.py经 modular 管线自动生成,日常改动请提交到 modular_wav2vec2_bert.py)。

想动手微调,可以直接基于本仓库的官方示例:

  • [Wav2Vec2BertForCTC] 可参考 examples/pytorch/speech-recognition 目录下的示例脚本(如 run_speech_recognition_ctc.py);更系统的图文教程可参考官方笔记(英文与任意语言两种微调路线);
  • [Wav2Vec2BertForSequenceClassification] 的用法可参考 examples/pytorch/audio-classification;
  • 完整任务指南请阅读 音频分类任务指南。

如果你的下游目标是纯音频(不用文本),则只需Wav2Vec2BertProcessor的音频分支即可生成模型输入,模型侧不强制要求文本编码。


小结

Wav2Vec2-BERT 的核心价值在于:它把 Seamless 大规模多语言语音预训练的成果抽象成一个可独立加载、可任意挂接任务头、支持四种位置编码与流式因果卷积的 Transformer 骨干。理解它的关键落点在于——mel 频谱输入维度的约定(feature_projection_input_dim=160)、Conformer 编码器内因果 depthwise 卷积的实现位置、position_embeddings_type四种取值对应的源码模块,以及add_adapter/use_intermediate_ffn_before_adapter等如何影响序列压缩与inputs_to_logits_ratio。掌握了这些配置与源码的对应关系后,无论是把facebook/w2v-bert-2.0迁移到自己的 ASR 或音频分类任务,还是仿照其结构定制新的语音骨干,都能做到有据可依。

【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询