WavLM 实践教程:从下载权重到跑通语音特征提取
【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm
WavLM 是微软开源的大规模自监督预训练语音模型,把 16kHz 原始音频直接转成可用于语音识别、说话人验证、语音分离等任务的表示。本文基于官方仓库,覆盖环境准备、权重下载与最小特征提取示例,并讲解 Base、Base+、Large 三种检查点的选型,适合想快速跑通语音编码器的新手。
一、WavLM 是什么:面向全栈语音任务的编码器
WavLM 的定位不是"开箱即用的识别器",而是一个语音表示编码器:输入一段波形,输出每个时间帧的语义向量,识别、验证、分离等下游任务都在这些向量上接一个轻量任务头再微调。
它和 HuBERT、wav2vec 2.0 同属"自监督预训练"路线,区别在于训练目标同时考虑了语音内容与说话人信息,因此官方在 SUPERB 基准上同时公布了内容类(ASR、KS、QbE)和说话人类(SID、ASV、SD、ER)任务的统一评测结果。SUPERB 是一个覆盖 30 项以上语音任务、统一数据格式的评测基准,榜单截图如下:
对使用者的实际意义是:如果你要同时做多个语音任务,用同一个预训练编码器可以省去为每个任务单独找模型的工作。
二、准备环境与获取 WavLM 权重
wavlm/目录没有 requirements.txt,依赖从代码导入看只有两个:PyTorch和NumPy。
git clone https://gitcode.com/GitHub_Trending/un/unilm cd unilm/wavlm pip install torch numpy权重文件不随仓库分发。仓库 wavlm/README.md 的 "Pre-Trained Models" 一节列出了三个检查点的官方下载地址(Azure Storage 与 Google Drive 两种渠道),下载后得到形如WavLM-Base.pt的 checkpoint,后文代码里统一记为/path/to/wavlm.pt。
三、跑通第一个特征提取示例
下面的代码是官方 README 中的最小示例,在wavlm/目录下运行即可(代码里from WavLM import ...依赖当前目录能直接看到 WavLM.py)。
import torch from WavLM import WavLM, WavLMConfig checkpoint = torch.load('/path/to/wavlm.pt') cfg = WavLMConfig(checkpoint['cfg']) model = WavLM(cfg) model.load_state_dict(checkpoint['model']) model.eval() wav = torch.randn(1, 10000) # 16kHz 单声道,10000 个采样点 if cfg.normalize: wav = torch.nn.functional.layer_norm(wav, wav.shape) rep = model.extract_features(wav)[0] print(rep.shape) # torch.Size([1, 31, 768])预期输出说明:
- 输入形状是
(batch, 采样点数),这里 10000 个采样点约等于 0.6 秒音频; - 卷积特征提取器把时间轴按约 320 倍下采样,所以 10000 点变成31 个时间帧,即大约每秒 50 帧;
rep最后一维 768 是 Base 配置的隐藏层维度,Large 会更大(以 checkpoint 内cfg为准)。
如果需要每一层的中间表示(微调时常用来做多层加权),用官方推荐的写法:
rep, layer_results = model.extract_features( wav, output_layer=model.cfg.encoder_layers, ret_layer_results=True)[0] layer_reps = [x.transpose(0, 1) for x, _ in layer_results]四、WavLM 检查点怎么选:Base、Base+ 还是 Large
三个检查点结构同族,差别在预训练语料规模和参数量。参数量与 SUPERB 总分来自下表(论文 Table 3,与 wavlm/SUPERB_Results.png 一致):
| 检查点 | 预训练数据 | 参数量 | SUPERB 总分 |
|---|---|---|---|
| WavLM Base | 960 小时 LibriSpeech | 94.7M | 81.9 |
| WavLM Base+ | 60k Libri-Light + 10k GigaSpeech + 24k VoxPopuli | 94.7M | 82.8 |
| WavLM Large | 同上(约 94k 小时混合语料) | 316.6M | 84.6 |
选型建议:
- Base:语料只有 960 小时,适合快速验证 pipeline、显存紧张的场景;
- Base+:和 Base 同参数规模但语料扩大 100 倍,多数场景下是性价比最高的起点;
- Large:需要最高精度(如论文中的说话人验证、分离任务)时再上,代价是显存与推理时间明显增加。
三个检查点的cfg都保存在 checkpoint 内,同一套加载代码不用改,换权重文件即可。
五、三个典型用法与官方结果
仓库本身只提供编码器,下游训练代码需要搭配框架(README 建议通过 Hugging Face Transformers 或 s3prl 接入微调)。下面列出 README 中三组代表性结果,方便判断该编码器能达到的水平。
说话人验证(VoxCeleb1,EER% 越低越好)
在 "Large Margin Finetune and Score Calibration" 设置下:
| 模型 | Vox1-O | Vox1-E | Vox1-H |
|---|---|---|---|
| HuBERT large | 0.585 | 0.654 | 1.342 |
| WavLM large(New) | 0.33 | 0.477 | 0.984 |
说话人分离(CALLHOME,DER% 越低越好)
| 模型 | 2 人 | 3 人 | 全部 |
|---|---|---|---|
| EEND-EDA clustering | 7.11 | 11.88 | 11.84 |
| WavLM large | 6.46 | 10.69 | 10.35 |
语音分离(LibriCSS,SI-SDR dB 越高越好)
| 模型 | 0S | 0L | OV10 | OV20 | OV30 | OV40 |
|---|---|---|---|---|---|---|
| Conformer | 4.5 | 4.4 | 6.2 | 8.5 | 11 | 12.6 |
| WavLM large | 4.2 | 4.1 | 4.8 | 5.8 | 7.4 | 8.5 |
语音分离上 OV 档(overfit 数据少的设置)提升最明显,说明大规模预训练对低数据量场景帮助更大。
六、常见问题与调优建议
- 输入必须预处理成 16kHz 单声道。
extract_features直接吃波形张量(batch, samples),采样率不对时输出特征没有意义。 - 为什么要先做
layer_norm?当 checkpoint 的cfg.normalize为 True 时,预训练阶段输入经过了归一化,推理时不做同样的归一化会掉点,所以代码里判断if cfg.normalize后补一步layer_norm。 - 帧数太少是不是丢信息?不是。320 倍下采样是结构决定的(约每秒 50 帧),语义信息分布在 768 维特征里,不是靠帧数堆出来的。
- 特征层怎么选?官方 README 的建议是提取各层表示后做加权融合,而不是固定取某一层;
ret_layer_results=True就是为这个用途提供的接口。 - 长音频会爆显存吗?时间轴帧数与音频时长线性相关(50 帧/秒),10 分钟音频约 3 万帧;如果 batch 维度吃紧,可以按分钟切段推理,各段特征直接拼接。
- 训练下游任务从哪入手?仓库 README 指出 Hugging Face 与 s3prl 都已支持 WavLM,微调代码可以直接参考这两个生态,不必自己搭训练循环。
- 代码结构想深入看哪里?卷积特征提取器、Transformer 编码器和
WavLMConfig全在 wavlm/WavLM.py,多头注意力与归一化等基础组件在 wavlm/modules.py。
七、参考资料
- 官方说明(权重下载、加载示例、全部下游结果表):wavlm/README.md
- 模型主体:wavlm/WavLM.py(
WavLM、WavLMConfig、ConvFeatureExtractionModel、TransformerEncoder) - 基础模块:wavlm/modules.py
- 论文:WavLM: Large-Scale Self-Supervised Pre-training for Full Stack Speech Processing(arXiv: 2110.13900),引用格式见 README 末尾
- 许可证:仓库根目录 LICENSE(MIT)
WavLM 本身是一个"编码器"而非完整应用,把它接到识别、验证或分离的下游框架里,才是完整的工程链路。
【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考