
WavLM 语音特征提取4 行代码出特征3 种规格覆盖识别到说话人验证【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm手里有一段 3 分钟的会议录音想先看清模型听到的时序信息再决定拿它做识别、分离还是验证人。WavLM 做的就是这个把 16kHz 语音压成一串逐帧特征下游任务在这串特征上各取所需。下面把它从下载到出特征走一遍。用几行代码加载 WavLM拿到一段音频的逐帧特征张量对比 Base / Base / Large 三种规格按显存和精度挑一个用分层特征加权融合让微调比单用最后一层更稳算出两段语音的说话人余弦相似度判断是否同一人 如何跑通 WavLM从装依赖到提取第一段特征依赖很少WavLM.py只用到 PyTorch 和 NumPypip install torch numpy模型权重按 wavlm/README.md 的 Pre-Trained Models 一节下载.pt到本地。然后在wavlm/目录下运行因为要import modulesimport torch from WavLM import WavLM, WavLMConfig # 需在 wavlm/ 目录下运行 ckpt torch.load(WavLM-Base.pt) # 换成你下载的文件路径 model WavLM(WavLMConfig(ckpt[cfg])) model.load_state_dict(ckpt[model]) model.eval() wav torch.randn(1, 10000) # 16kHz 单通道形状 (1, T) if model.cfg.normalize: wav torch.nn.functional.layer_norm(wav, wav.shape) rep model.extract_features(wav)[0] # 最后一层特征 print(rep.shape)预期输出Base 规格、10000 个采样点torch.Size([1, 31, 768])T 随输入长度变化。跑通这一步说明环境、权重、特征链路都对。核心入口wavlm/WavLM.py⚖️ WavLM 选型Base / Base / Large 怎么挑参数量和训练数据直接决定显存、速度和精度一张表看全规格资源消耗精度/速度适用场景获取方式Base约 94.7M 参数、12 层精度最低速度最快轻量部署、快速验证README 表格给 Azure / Google Drive 下载.ptBase约 94.7M 参数、12 层精度高于 Base速度接近 Base精度与速度的平衡点同上Large约 316.6M 参数、24 层精度最高速度最慢高准确率需求同上默认选 Base参数量和 Base 一样小却用了多约 90 倍的训练数据精度明显更高速度几乎不亏。规格细节与下载wavlm/README.mdPre-Trained Models 一节 WavLM 语音实战从特征到识别、分离与说话人验证仓库本体只负责出特征下面三件事都建立在同一个extract_features上差别只在取哪一层、怎么用。把一段 16kHz 音频转成逐帧语音特征拿到录音后先看模型输出的时序长什么样确认链路正常。wav load_wav_16k(meeting.wav) # 换成你的加载函数输出 (1, T) if model.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])输入必须是 16kHz、单通道、形状(1, T)多通道要先取一路卷积下采样后帧率约 50Hz每 20ms 一帧T 随音频长短变化按层取特征并加权融合微调更稳微调下游任务时README 建议把每层特征加权求和而不是只用最后一层。L model.cfg.encoder_layers rep, layer_results model.extract_features( wav, output_layerL, ret_layer_resultsTrue)[0] layer_reps [x.transpose(0, 1) for x, _ in layer_results] # (1, T, D) print(len(layer_reps), layer_reps[0].shape) # 对 layer_reps 加权求和即可layer_results里张量是(T, B, D)务必transpose(0, 1)才是(B, T, D)output_layer传 1..encoder_layers传 0 会拿到进 encoder 之前的特征判断两段语音是不是同一个人说话人验证本质是比两个说话人向量的相似度向量用逐帧平均得到。def spk_vec(model, wav): rep model.extract_features(wav)[0] return rep.mean(dim1) # 逐帧平均 - (1, D) a, b spk_vec(model, wav_a), spk_vec(model, wav_b) sim (a * b).sum(1) / (a.norm(dim1) * b.norm(dim1)) print(sim.item()) # 越接近 1 越可能同一人仓库只出特征判定阈值 / 分类头要自己加要开箱即用改用 HuggingFace 或 s3prl 里微调好的 WavLM 模型README 有说明embedding 归一化后再比余弦比直接比原始向量稳README 报告加 Large Margin 微调后WavLM Large 在 VoxCeleb1-O 上 EER 降到 0.33明显低于传统 ECAPA-TDNN 的 0.87越低越好。 WavLM 的能力边界与下一步WavLM 本体是特征提取器识别、分离、验证的具体任务头不在仓库里需要借 HuggingFace 或 s3prl 微调接上。值得关注的方向是把它的高层特征接进大语言模型做更自然的语音理解。觉得有用收藏或关注即可。下期可以看用 WavLM 特征接一个轻量说话人验证头把阈值调对。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考