音频变压器(Audio Transformer):从语音识别到音乐生成的模型演进与实践
1. 引言:为什么音频也需要 Transformer
自 2017 年《Attention Is All You Need》提出 Transformer 以来,文本领域经历了 GPT、BERT、T5 等模型的爆发式增长。然而,音频领域长期被循环神经网络(RNN)、卷积神经网络(CNN)以及它们的组合所主导。早期语音识别依赖 HMM-GMM,后来被 LSTM 与 CNN 取代;语音合成则经历了 WaveNet、Tacotron 等经典架构。为什么音频最终也走向了 Transformer?
根本原因在于,音频信号虽然是时序连续信号,但深度学习模型处理音频时,通常需要把一秒钟数万采样点的波形,压缩成几十到几百帧的特征序列。这个特征序列与文本的 Token 序列在结构上高度相似:具有顺序关系、局部相关性和长程依赖。Transformer 的自注意力机制恰好能够建模长距离依赖,并行化程度高,并且可以在海量无标注音频上进行自监督预训练,这正是现代音频模型取得突破的关键。
更重要的推动力来自三个方面:第一,GPU 和分布式训练能力大幅提升,使 Transformer 处理长序列成为可能;第二,wav2vec 2.0、HuBERT、Whisper、AST 等工作证明,Transformer 在语音识别、音频分类等任务上显著超越传统 CNN/RNN;第三,神经音频编解码器(如 EnCodec、SoundStream)把连续波形离散化为音频 Token,让音频真正“文本化”,从而让音乐生成、语音生成等任务可以直接复用语言模型范式。
本文将系统梳理音频 Transformer 的技术脉络:从波形与频谱基础,到自注意力机制,再到 AST、wav2vec 2.0、HuBERT、WavLM、Conformer、Whisper、EnCodec、MusicGen、VALL-E 等代表性模型,最后讨论自监督预训练、训练工程、评测指标与未来方向。全文力求兼顾原理与工程实践,帮助读者建立从信号到模型的完整认知。
2. 声音信号与特征基础
在讨论 Transformer 之前,必须先理解音频模型吃进去的到底是什么。声音是空气压强的连续波动,数字系统中以采样率(如 16kHz、44.1kHz)离散采样。深度学习模型通常不直接对几万维的原始波形做自注意力,而是先把它转换成更低维、更有语义的特征序列。
2.1 波形、采样率与会话时长
波形是最原始的音频表示。一段 1 秒、采样率为 16kHz 的单声道音频,包含 16000 个采样点。如果直接用 Transformer 处理,1 秒音频相当于 16000 个“Token”,这个长度对自注意力机制来说过于冗余且计算成本高昂。因此,几乎所有的音频 Transformer 都会先对波形进行特征压缩。
2.2 短时傅里叶变换与频谱图
声音在短时间窗口内可以近似看作平稳信号,因此常使用短时傅里叶变换(STFT)把时域信号变换到时频域。STFT 通过滑动窗口(例如 25ms 窗口、10ms 跳步)计算每一帧的频谱,得到频谱图(Spectrogram)。频谱图的横轴是时间,纵轴是频率,颜色表示能量强度。
2.3 梅尔频谱与 log-mel 特征
人耳对频率的感知并非线性,而是近似对数尺度。梅尔频谱(Mel Spectrogram)通过一组三角滤波器组,把线性频率轴映射到梅尔尺度,再取对数得到 log-mel 特征。log-mel 是音频 Transformer 最常用的输入特征之一,它既降低了维度,也更接近人耳感知特性。
下面给出使用 torchaudio 从波形提取 log-mel 特征的示例:
import torch
import torchaudio
waveform, sample_rate = torchaudio.load("audio.wav") # 形状 [1, T]
waveform = torchaudio.functional.resample(waveform, sample_rate, 16000)
mel_transform = torchaudio.transforms.MelSpectrogram(
sample_rate=16000,
n_fft=400, # 25ms 窗口
hop_length=160, # 10ms 跳步
n_mels=80, # 80 个梅尔频带
)
mel_spec = mel_transform(waveform) # [1, 80, frames]
log_mel = torch.log(mel_spec + 1e-9) # 对数变换
print(log_mel.shape)
在这个例子中,1 秒音频被压缩成约 100 帧(每帧 10ms),每帧 80 维。这样的帧序列长度与文本 Token 序列量级相当,非常适合送入 Transformer。
2.4 MFCC 与离散表示
MFCC(Mel-Frequency Cepstral Coefficients)是在 log-mel 基础上再做离散余弦变换得到的系数,包含更紧凑的包络信息,曾经是传统语音识别的主力特征。但随着深度模型能力增强,直接使用 log-mel 特征通常能保留更多信息,因此现代音频 Transformer 多数直接使用 log-mel,部分模型甚至直接从原始波形学习。
3. Transformer 快速回顾
音频 Transformer 的核心依然是标准的自注意力机制。为了便于后文理解 AST、HuBERT 等模型,这里简要回顾几个关键组件。
3.1 自注意力机制
自注意力(Self-Attention)让序列中的每个位置都能直接关注到其他所有位置。对于输入序列 X,通过三个线性投影得到 Query、Key、Value,再计算注意力权重:
import torch
import torch.nn as nn
import torch.nn.functional as F
class SelfAttention(nn.Module):
def init(self, d_model, n_heads):
super().init()
assert d_model % n_heads == 0
self.d_model = d_model
self.n_heads = n_heads
self.head_dim = d_model // n_heads
self.q_proj = nn.Linear(d_model, d_model)
self.k_proj = nn.Linear(d_model, d_model)
self.v_proj = nn.Linear(d_model, d_model)
self.out_proj = nn.Linear(d_model, d_model)
def forward(self, x):
B, T, D = x.shape
q = self.q_proj(x).view(B, T, self.n_heads, self.head_dim).transpose(1, 2)
k = self.k_proj(x).view(B, T, self.n_heads, self.head_dim).transpose(1, 2)
v = self.v_proj(x).view(B, T, self.n_heads, self.head_dim).transpose(1, 2)
scores = q @ k.transpose(-2, -1) / (self.head_dim ** 0.5)
attn = F.softmax(scores, dim=-1)
out = attn @ v
out = out.transpose(1, 2).contiguous().view(B, T, D)
return self.out_proj(out)</code></pre>
在音频序列中,自注意力的感受野可以覆盖整段音频,因此比 CNN 的局部感受野更适合捕捉长时依赖,例如整句话的语气、节奏、歌曲中的段落结构等。
3.2 位置编码
Transformer 本身没有顺序信息,需要显式注入位置编码。音频帧序列同样需要位置编码。常见做法是学习式位置编码或正弦位置编码。对于音频,时间位置对应帧的先后;对于声学特征,频率维度有时也用独立的位置编码,这一点在 AST 等模型中非常关键。
3.3 编码器与解码器
编码器用于把输入序列编码成语义表征,解码器则以自回归方式生成目标序列。音频 Transformer 既可以是编码器(如 HuBERT、AST),也可以是编码器-解码器(如 Whisper),还可以是纯解码器(如 MusicGen、VALL-E)。
4. 音频 Transformer 的核心架构设计
音频 Transformer 与文本 Transformer 的最大差异,在于如何把连续音频信号变成离散或半离散的输入序列。围绕这一点,主流设计可以归纳为三类:基于频谱图、基于隐藏单元、基于神经编解码 Token。
4.1 三种输入表示路线
频谱图路线:直接对 log-mel 或线性频谱图进行分块(Patch),把时空小块展平成向量后送入 Transformer,代表模型为 AST、SSAST、PaSST。
隐藏单元路线:先用 CNN 特征编码器把波形压缩成隐层序列,再送入 Transformer,代表模型为 wav2vec 2.0、HuBERT、WavLM。
编解码 Token 路线:先用神经音频编解码器(如 EnCodec)把波形离散化为语义或声学 Token,再像文本一样送入语言模型,代表模型为 AudioLM、MusicGen、VALL-E。
4.2 AST:把频谱图变成 Patch
Audio Spectrogram Transformer(AST)借鉴了 ViT 的思路:将 log-mel 频谱图切分成固定大小的 patch,每个 patch 展平后线性投影为 embedding。AST 使用 128 个梅尔频带和 1024 时间帧,patch 大小常见为 16×16。
import torch
import torch.nn as nn
class PatchEmbed(nn.Module):
def init(self, in_channels, embed_dim, patch_size):
super().init()
self.proj = nn.Conv2d(
in_channels,
embed_dim,
kernel_size=patch_size,
stride=patch_size,
)
def forward(self, x):
# x: [B, 1, F, T],例如 [B, 1, 128, 1024]
x = self.proj(x) # [B, embed_dim, F/p, T/p]
x = x.flatten(2).transpose(1, 2) # [B, num_patches, embed_dim]
return x
class AudioTransformerBlock(nn.Module):
def init(self, embed_dim, n_heads, mlp_ratio=4.0):
super().init()
self.norm1 = nn.LayerNorm(embed_dim)
self.attn = nn.MultiheadAttention(embed_dim, n_heads, batch_first=True)
self.norm2 = nn.LayerNorm(embed_dim)
self.mlp = nn.Sequential(
nn.Linear(embed_dim, int(embed_dim * mlp_ratio)),
nn.GELU(),
nn.Linear(int(embed_dim * mlp_ratio), embed_dim),
)
def forward(self, x):
x = x + self.attn(self.norm1(x), self.norm1(x), self.norm1(x))[0]
x = x + self.mlp(self.norm2(x))
return x</code></pre>
AST 用一个额外的分类 Token 聚合全局信息,用于音频分类任务。与 ViT 相比,AST 展现了更少的归纳偏置,完全依赖注意力学习频谱中的局部纹理和全局结构,在 AudioSet 等大规模音频分类基准上超越了当时的 CNN 方法。
4.3 音频中的二维位置编码
频谱图 patch 同时具有频率和时间两个维度。AST 发现,频谱图的分辨率和 patch 大小会影响模型表现,但即便使用固定的时间-频率位置编码,模型仍能学到频率轴的顺序关系。对于依赖频谱图的模型,二维可学习位置编码比一维更有优势,能让模型区分“高频噪声”与“低频旋律”的空间位置。
5. 自监督预训练范式:音频 Transformer 的加速器
音频 Transformer 的成功不仅依赖架构,更依赖大规模自监督预训练。与 NLP 的掩码语言模型类似,语音领域的自监督学习也发展出多种范式。
5.1 对比学习:wav2vec 2.0
wav2vec 2.0 提出了一种结合对比学习与量化的预训练框架。模型先由多层 CNN 将波形编码为隐层序列,再由 Transformer 建模上下文;同时通过码本量化(Quantization)形成离散目标。训练时随机掩码一部分时间步,模型需要从候选量化表示中区分正样本与干扰样本,即对比损失。
# 伪代码:wav2vec 2.0 对比损失核心思路
def contrastive_loss(context, quantized_target, negatives):
# context: Transformer 输出的被掩码位置的上下文向量
# quantized_target: 对应位置的量化目标
# negatives: 从其他位置采样的干扰量化向量
pos_sim = cosine_similarity(context, quantized_target)
neg_sim = cosine_similarity(context, negatives)
# 正样本相似度最大化,负样本相似度最小化
loss = -log(exp(pos_sim) / (exp(pos_sim) + sum(exp(neg_sim))))
return loss
wav2vec 2.0 的重要性在于,它证明了用极少量标注数据微调,也能在语音识别上取得接近甚至超过有监督模型的性能,极大降低了标注成本。
5.2 掩码预测与伪标签:HuBERT
HuBERT 放弃了显式的量化码本,转而采用聚类伪标签。它预先用 K-means 对 MFCC 或中间层特征聚类,把聚类中心 ID 作为自监督目标。训练时随机掩码部分帧,Transformer 预测被掩码帧对应的聚类 ID,使用交叉熵损失。经过多轮迭代,伪标签质量不断提升,模型表征也越来越好。
# 伪代码:HuBERT 预训练
def hubert_pretrain_step(model, features, cluster_ids):
masked_indices = random_mask(features.shape[1], mask_prob=0.08)
logits = model(features)[masked_indices]
targets = cluster_ids[masked_indices]
loss = cross_entropy(logits, targets)
return loss
HuBERT 简单有效,其思想影响深远:先聚类、再掩码预测,本质上是把无监督问题转化为有监督分类问题。
5.3 去噪与增强:WavLM
WavLM 在 HuBERT 基础上,把输入替换策略从简单的帧掩码扩展到更丰富的噪声/混响/重叠语音等增强,并对说话人、内容等多任务进行学习。它还在 Transformer 中引入门控相对位置偏置,提升对长序列和说话人信息的建模能力。WavLM 在说话人验证、语音分离等任务上表现优异,说明自监督语音表征可以迁移到多种下游任务。
5.4 蒸馏与掩码学生:Data2vec 2.0
Data2vec 2.0 把语音、图像、文本统一到“老师-学生”蒸馏框架。学生模型在部分可见输入上预测老师的完整表征,适用于音频。它进一步简化了多模态自监督训练,也体现了音频 Transformer 与通用表征学习的融合趋势。
6. 代表性模型一:AST 与频谱 Transformer
6.1 AST 的结构细节
AST 的输入通常是 128×T 的 log-mel 频谱图,经过 16×16 patch 切分后,大约得到 8×(T/16) 个 patch。除了 patch embedding 和二维位置编码,AST 的其余部分与标准 ViT 基本一致。模型参数量通常在 87M 到 600M 之间。
6.2 SSAST 与 PaSST 的改进
SSAST:将掩码自编码(MAE)思想引入频谱图 Transformer,通过重建被掩码的 patch 学习表征,适合标签稀缺场景。
PaSST:提出 Patch-out 机制,在训练时随机丢弃部分 patch,降低计算量并提升鲁棒性,使模型能够高效处理长音频。
6.3 适用任务
频谱 Transformer 主要面向音频分类、音频事件检测、声景识别等任务,因为它们天然以“整段音频打标签”为目标,与 ViT 的图像分类定位非常一致。
7. 代表性模型二:wav2vec 2.0 与编码器范式
7.1 从波形到上下文的双阶段编码
wav2vec 2.0 的编码路径分为两步:CNN 特征提取器把原始波形下采样为约 20ms 一帧的隐层序列;随后 Transformer 将局部特征融合为上下文表征。微调时通常在 Transformer 顶部加入线性层做 CTC 或序列到序列解码。
7.2 量化模块
量化模块通过 Gumbel Softmax 从可学习码本中为每个时间步选择一个码向量。对比学习将上下文向量与码向量对齐,从而引导模型学习稳定的声学单元。这个离散化思路与后来的 EnCodec 一脉相承。
7.3 微调与低资源场景
wav2vec 2.0 最具影响力的结论是:在 LibriSpeech 上使用 10 分钟、1 小时、10 小时标注数据微调,词错误率(WER)相比传统端到端模型大幅下降。这标志着语音识别进入“预训练大模型 + 少量微调”的时代。
8. 代表性模型三:HuBERT 与 WavLM
8.1 HuBERT 的伪标签迭代
HuBERT 的训练分为多次迭代。第一次迭代在 MFCC 特征上聚类,后续迭代在上一层 HuBERT 输出的隐层特征上聚类。每轮聚类使用 K-means,类别数从 100 到 500 不等。被掩码帧的 Transformer 输出通过投影层预测聚类标签。
8.2 WavLM 的增强与门控注意力
WavLM 引入以下增强:随机噪声、短时/长时混响、环境噪声、说话人重叠等。其门控相对位置偏置让模型在处理重叠语音时更稳健。实验结果证明,WavLM 在 SUPERB 基准的多数任务上刷新了纪录,包括音素识别、说话人识别、语音分离等。
8.3 SUPERB 通用表征评估
SUPERB 是语音自监督表征的通用评测基准,覆盖内容、说话人、语义、副语言等多个维度。HuBERT 与 WavLM 在 SUPERB 上的表现说明:一个良好的语音自监督表征,可以在不做大量任务特定改造的前提下,迁移到几十种下游任务。
9. Conformer 与混合架构:语音识别的工程主流
9.1 为什么需要 CNN + Transformer
虽然纯 Transformer 建模长依赖能力很强,但语音的局部结构(如单个音素、音节的频谱形状)也非常重要。Conformer 将卷积模块插入 Transformer 块中,使模型同时具备局部细粒度建模与全局长程建模能力,成为 ASR 领域事实上的标准编码器。其结构可概括为:前馈层 → 多头自注意力 → 卷积模块 → 前馈层。
9.2 Conformer 块示意
class ConformerBlock(nn.Module):
def __init__(self, d_model, n_heads, kernel_size=31):
super().__init__()
self.ff1 = FeedForward(d_model)
self.attn = nn.MultiheadAttention(d_model, n_heads, batch_first=True)
self.conv = nn.Sequential(
nn.Conv1d(d_model, d_model * 2, kernel_size=1),
nn.GLU(dim=1),
nn.Conv1d(d_model, d_model, kernel_size=kernel_size,
padding=kernel_size // 2, groups=d_model),
nn.BatchNorm1d(d_model),
nn.SiLU(),
nn.Conv1d(d_model, d_model, kernel_size=1),
)
self.ff2 = FeedForward(d_model)
self.norm = nn.LayerNorm(d_model)
def forward(self, x):
x = x + 0.5 * self.ff1(x)
x = x + self.attn(self.norm(x), self.norm(x), self.norm(x))[0]
x = x + self.conv(x.transpose(1, 2)).transpose(1, 2)
x = x + 0.5 * self.ff2(x)
return x</code></pre>
在实际 ASR 系统中,Conformer 编码器常常配合 CTC/注意力联合解码,成为 WeNet、ESPnet、NVIDIA NeMo 等框架的默认选择。
10. 编码器-解码器范式:Whisper 与通用语音识别
10.1 Whisper 的设计
OpenAI 的 Whisper 是一个大规模弱监督的语音识别与翻译模型,采用标准编码器-解码器 Transformer。其输入端是 80 维 log-mel 频谱,经过卷积下采样后送入编码器;解码器自回归生成文本 Token。Whisper 在 68 万小时多语言、多任务数据上训练,展现了极强的鲁棒性和跨语言能力。
10.2 Whisper 的输入处理
import whisper
model = whisper.load_model("large-v3")
result = model.transcribe(
"audio.wav",
language="zh",
task="transcribe", # 或 translate
)
print(result["text"])
10.3 时间戳与多任务提示
Whisper 通过特殊 Token 控制任务类型、语言和时间戳预测,使多语言转写、翻译、语音活动检测可以统一在一个模型中。这种“提示驱动”的多任务设计,对后续通用语音助手模型产生了重要影响。
11. 神经音频编解码器:把波形变成离散 Token
音频生成模型之所以能复用语言模型,关键在于神经音频编解码器。SoundStream 与 EnCodec 是其中的代表,它们提供了一种把任意音频压缩为低比特率离散 Token 的方法。
11.1 EnCodec 的组成
EnCodec 包含编码器、残差矢量量化器(RVQ)和解码器。编码器把波形压缩为低帧率的连续向量;RVQ 用多层码本逐级量化,得到若干条离散 Token 流;解码器再将其重建为音频。RVQ 的层级结构可以用“粗到细”的方式表征声音,第一层捕获主要结构,后续层补充细节。
11.2 使用 EnCodec 提取音频 Token
from transformers import EncodecModel, AutoProcessor
import torchaudio
model = EncodecModel.from_pretrained("facebook/encodec_24khz")
processor = AutoProcessor.from_pretrained("facebook/encodec_24khz")
waveform, sr = torchaudio.load("audio.wav")
inputs = processor(raw_audio=waveform, sampling_rate=sr, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
audio_codes = outputs.audio_codes # [1, num_quantizers, frames]
print(audio_codes.shape)
这样得到的离散 Token 序列,可以直接交给语言模型,就像处理文本 Token 一样。
11.3 SoundStream 与 AcademiCodec
SoundStream 与 EnCodec 思路相近,但 SoundStream 在编码器中结合了因果卷积与残差结构,并引入了对抗损失与特征匹配损失提升重建质量。AcademiCodec 等后续工作进一步优化码本利用率和重建保真度。音频 Token 化已成为语音合成、音乐生成、音频修复等任务的基础设施。
12. 音乐生成:MusicTransformer 与 MusicGen
12.1 MusicTransformer 的相对注意力
MusicTransformer 是最早把 Transformer 用于符号音乐生成的工作之一。它采用相对位置注意力,生成 MIDI 钢琴卷帘事件序列,能生成结构完整的钢琴曲。相比 RNN,其优势在于能记住更长的主题和动机。
12.2 MusicGen:文本到音乐的条件语言模型
Meta 的 MusicGen 采用“文本条件 + 音频 Token 语言模型”的路线。它先用 EnCodec 把音乐离散化为 Token,再用解码器型 Transformer 以文本描述为条件自回归生成 Token,最后解码为波形。MusicGen 提供 300M、1.5B、3.3B 等不同规模,支持旋律条件生成,能生成与文本描述匹配的多秒到数分钟音乐。
from transformers import AutoProcessor, MusicgenForConditionalGeneration
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
inputs = processor(
text=["明亮的爵士钢琴曲,节奏轻快"],
padding=True,
return_tensors="pt",
)
audio_values = model.generate(**inputs, max_new_tokens=512)
print(audio_values.shape)
12.3 AudioLM 的分层生成
AudioLM 提出“语义 Token”与“声学 Token”分层生成:先由 w2v-BERT 提取语义 Token,再用 SoundStream 提取声学 Token,分别训练两个级联的自回归模型。语义层负责保证内容和长期一致性,声学层负责还原音色和细节。这种分层思想极大提升了长音频生成的连贯性。
13. 语音合成与语音生成:VALL-E 与零样本 TTS
13.1 VALL-E:神经编解码语言模型的 TTS
VALL-E 把文本到语音合成建模为“文本 → 音频 Codec Token”的条件语言模型。它使用 EnCodec 将语音离散化,并在大量有声书数据上训练,只需 3 秒左右的说话人提示音频,就能以该说话人的音色合成任意文本,实现零样本语音克隆。
13.2 自回归与非自回归生成
VALL-E 先在自回归阶段生成第一层粗 Token,再在非自回归阶段并行生成后续层细 Token。这种“粗粒度负责内容、细粒度负责音色”的层级设计,在保证语音自然度的同时,显著提升了生成速度。
13.3 后续演进
此后,Bark、XTTS、ChatTTS 等模型延续并优化了语音 Token 化与语言模型结合的路线。语音生成正逐步与文本大模型融合,形成能理解、能对话、能自然发声的多模态系统。
14. 音频 Transformer 的训练策略与工程优化
14.1 数据规模与预处理
音频 Transformer 对数据规模高度敏感。wav2vec 2.0 使用了约 53k 小时 Libri-Light 数据,WavLM 使用了 94k 小时,Whisper 更是达到了 68 万小时。预处理需要统一采样率、声道数,并对长音频进行切段或随机截取。数据增强(加噪、变速、混响、SpecAugment)对鲁棒性至关重要。
14.2 高效注意力
处理分钟级甚至小时级音频时,标准自注意力的 O(n²) 复杂度不可接受。常用的优化包括:局部窗口注意力、稀疏注意力、内存高效的 FlashAttention、以及卷积下采样降低序列长度。此外,可以通过分块重叠拼接处理超长音频。
14.3 混合精度与分布式训练
使用 bfloat16 混合精度、梯度累积、数据并行与模型并行(如张量并行、流水线并行)可以显著提升训练效率。对于编码器-解码器架构,还可以使用序列并行减少激活内存。
14.4 知识蒸馏与量化部署
大模型蒸馏到小模型,以及 INT8/INT4 量化,是音频 Transformer 落地端侧的关键。例如,可以将 Whisper 蒸馏为小参数量学生模型,再结合量化部署到移动端或边缘设备。
15. 评测指标与基准
15.1 语音识别指标
WER:词错误率,衡量转写文本与参考文本的编辑距离比例。
CER:字错误率,中文等语言常用。
RTF:实时率,推理耗时与音频时长的比值,影响流式服务可用性。
15.2 音频分类与事件检测指标
mAP:平均精度均值,用于 AudioSet 等多标签分类。
F1 / AUC:用于声学场景分类、异常声检测等任务。
15.3 语音合成与音乐生成指标
MOS:主观平均意见分,衡量自然度与音质。
SI-SDR / PESQ / STOI:用于语音增强、分离与重建的客观质量指标。
FAD / CLAP Score:音乐生成中衡量分布距离和文本-音频对齐度的指标。
15.4 通用基准
SUPERB:语音自监督表征的通用评测集合。
AudioSet / ESC-50 / Speech Commands:音频分类常用数据集。
LibriSpeech / Common Voice / AISHELL:多语种语音识别基准。
16. 主流模型横向对比
模型
输入表示
架构
预训练目标
代表任务
AST
log-mel 频谱 patch
ViT 编码器
有监督分类
音频分类、事件检测
wav2vec 2.0
CNN 隐层序列
Transformer 编码器
对比学习 + 量化
语音识别、表征抽取
HuBERT
CNN 隐层序列
Transformer 编码器
掩码预测聚类标签
语音识别、说话人验证
WavLM
CNN 隐层序列
门控 Transformer 编码器
掩码预测 + 去噪增强
SUPERB 通用语音任务
Conformer
log-mel 特征
CNN + Transformer 混合
有监督/CTC-Attention
语音识别
Whisper
log-mel 频谱
编码器-解码器
弱监督多任务
多语言识别与翻译
EnCodec
原始波形
CNN + RVQ
重建 + 对抗训练
音频离散 Token 化
MusicGen
音频 Token
解码器型语言模型
文本条件生成
音乐生成
VALL-E
音频 Token
自回归 + 并行语言模型
文本/提示条件生成
零样本语音合成
17. 实战:构建一个音频分类 Transformer
下面给出一个简化但完整的 AST 风格音频分类模型训练示例。读者可以替换自己的音频数据集,快速跑通“音频 → log-mel → patch → Transformer → 分类”的完整流程。
import torch
import torch.nn as nn
import torchaudio
class PatchEmbed(nn.Module):
def init(self, embed_dim=128, patch_size=16):
super().init()
self.proj = nn.Conv2d(1, embed_dim, kernel_size=patch_size, stride=patch_size)
def forward(self, x):
x = self.proj(x)
return x.flatten(2).transpose(1, 2)
class SimpleAudioTransformer(nn.Module):
def init(self, n_classes=10, embed_dim=128, depth=6, n_heads=4):
super().init()
self.patch_embed = PatchEmbed(embed_dim)
self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim))
self.pos_embed = nn.Parameter(torch.zeros(1, 513, embed_dim))
self.blocks = nn.ModuleList([
nn.TransformerEncoderLayer(
d_model=embed_dim,
nhead=n_heads,
batch_first=True,
dim_feedforward=embed_dim * 4,
activation="gelu",
) for _ in range(depth)
])
self.norm = nn.LayerNorm(embed_dim)
self.head = nn.Linear(embed_dim, n_classes)
def forward(self, x):
# x: [B, 1, 128, 512] 的 log-mel 频谱图
x = self.patch_embed(x) # [B, N, embed_dim]
cls = self.cls_token.expand(x.shape[0], -1, -1)
x = torch.cat([cls, x], dim=1) # 在序列前加入分类 Token
x = x + self.pos_embed[:, :x.shape[1]]
for blk in self.blocks:
x = blk(x)
x = self.norm(x[:, 0]) # 取分类 Token 的输出
return self.head(x)
model = SimpleAudioTransformer(n_classes=10)
waveform, sr = torchaudio.load("audio.wav")
log_mel = torchaudio.transforms.MelSpectrogram(
sample_rate=sr, n_mels=128, n_fft=400, hop_length=160
)(waveform)
log_mel = torch.log(log_mel + 1e-9)[:, :, :512].unsqueeze(0)
logits = model(log_mel)
print(logits.shape)
在实际项目中,还需要处理好不同长度音频的对齐、数据增强、类别不平衡、学习率调度等问题。上面的代码可作为骨架,结合 Hugging Face 的 AST 模型替换为自己训练的版本。
18. 挑战与未来方向
18.1 长音频与流式处理
Transformer 的计算复杂度限制了直接处理超长音频。如何在保持全局建模能力的同时,支持低延迟流式推理,是会议转写、实时翻译等场景的核心挑战。线性注意力、状态空间模型(如 Mamba)与 Transformer 的融合是近期热点。
18.2 模型规模与效率的平衡
音频大模型参数量持续增长,但端侧设备计算、内存和功耗有限。蒸馏、剪枝、量化、投机采样解码等技术,将决定音频 Transformer 能否大规模落地。
18.3 多模态统一
音频与文本、图像、视频的联合建模正在加速。CLAP 把音频与文本映射到同一表征空间;Qwen-Audio、AudioGPT 等探索音频与语言模型的统一。未来,音频 Transformer 将不再孤立,而是成为通用多模态智能体的组成部分。
18.4 可控性与版权伦理
语音克隆、音乐生成带来了真实性与版权问题。如何在技术上实现内容溯源、水印和可控生成,同时遵守伦理规范,是音频生成模型必须面对的课题。
19. 总结
音频 Transformer 的发展,本质上是把音频从“连续信号”重新表达为“可学习序列”的过程。无论是基于频谱图 patch 的 AST,基于 CNN 隐层的 wav2vec 2.0 与 HuBERT,还是基于神经编解码 Token 的 MusicGen 与 VALL-E,核心都是让 Transformer 在音频序列上发挥长程建模与自监督学习的威力。
从技术演进看,有三条清晰的主线:编码器路线解决“听懂”问题,支撑语音识别、说话人识别与音频分类;编码器-解码器路线推动多语言语音识别和翻译的通用化;解码器路线借助音频 Token 化,打通了语音合成、音乐生成等“发出声音”的任务。三者并非割裂,而是共享自监督表征与离散化思想。
对实践者而言,建议按以下路径深入:先掌握 log-mel 特征与基本 Transformer 组件;再选择一个代表性模型(如 AST 或 HuBERT)复现并理解其数据流;随后结合 Whisper 或 MusicGen 等预训练模型完成实际应用;最后关注长序列优化、高效部署与多模态融合等前沿方向。
音频 Transformer 已经证明了其在理解与生成两个方向上的巨大潜力。随着音频 Token 化、自监督预训练与硬件效率的持续进步,它正逐渐成为连接声音与语言、音乐与智能的关键桥梁。更多推荐

所有评论(0)