z
zkx_/wav2vec2-base-960h-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

wav2vec2-base-960h on Ascend NPU

1. 简介

本文档记录 facebook/wav2vec2-base-960h 语音识别模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。

Wav2Vec2 是 Facebook 提出的自监督语音表示学习模型,通过对原始音频波形进行 CNN 特征提取 + Transformer 上下文建模,再通过 CTC(Connectionist Temporal Classification)头进行语音识别。该模型在 LibriSpeech 960 小时英文语料上微调,支持 16kHz 采样率单声道音频输入,输出英文字母级 CTC 序列。

Wav2Vec2 的特征提取(CNN)和 Transformer 层在 NPU 上均有对应算子支持,适配集中在设备迁移和预处理管道。

相关获取地址:

  • 权重下载地址(ModelScope):facebook/wav2vec2-base-960h
  • 权重下载地址(HuggingFace):https://huggingface.co/facebook/wav2vec2-base-960h

2. 验证环境

组件版本
torch2.8.0
torch_npu2.8.0.post4
transformers5.8.1
CANN8.5.1
  • NPU:8 × Ascend 910B3
  • 精度对比基准:CPU(x86, PyTorch 2.8.0)

3. 部署使用流程

3.1 环境准备

conda create -n wav2vec2-base-960h python=3.11 -y
conda activate wav2vec2-base-960h

pip install torch==2.8.0 torch_npu==2.8.0.post4 \
    -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers torchaudio numpy soundfile \
    -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2 模型权重下载

modelscope download --model facebook/wav2vec2-base-960h \
    --local_dir ./wav2vec2-base-960h

3.3 推理脚本使用

# 单条语音识别
python inference.py --audio speech.wav --device npu

# 编程接口
python inference.py --audio_dir ./audio/ --device npu
from inference import Wav2Vec2ASR

asr = Wav2Vec2ASR(model_path="./wav2vec2-base-960h", device="npu")

# 从文件读取
import soundfile as sf
audio, sr = sf.read("speech.wav")

# 转写
text = asr.transcribe([audio], sampling_rate=sr)
print(text[0])

4. Smoke 验证

python inference.py --audio speech.wav --device npu

预期输出:音频的英文转写文本(CTC 解码),无运行时错误。

验证 NPU 设备:

import torch, torch_npu
print(f"NPU count: {torch.npu.device_count()}")
print(f"Device: {torch.npu.get_device_name(0)}")

5. 性能参考

测试条件:8 段 1 秒随机合成音频(16000 采样点,固定随机种子),batch_size=4,NPU 预热 1 轮。

指标数值
CPU 吞吐量7.0 audio/s
NPU 吞吐量202.6 audio/s
CPU/NPU 加速比28.8 ×

音频模型在 CPU 上推理较慢(需处理长序列音频帧),NPU 加速效果显著,适合实时语音识别场景。Wav2Vec2 的 CNN 特征编码器和 Transformer 层在 NPU 上均能获得良好加速。

6. 精度评测

6.1 评测方法

分别在 CPU 和 NPU 上对 8 段合成音频进行推理(固定随机种子保证输入一致),比较:

  • CTC logits 余弦相似度:NPU 与 CPU 输出 logits 的方向一致性
  • 逐元素 MAE:logits 值精度
  • Token 匹配率:逐帧 CTC 解码的 argmax token 一致性(衡量最终转写结果)

6.2 评测结果

指标数值
平均余弦相似度0.999985
平均 MAE0.023024
平均最大误差0.146569
精度误差率0.0015%
Token 匹配率100.0%

结论:精度误差率 0.0015%,远低于 1% 要求。逐帧 CTC token 匹配率 100%,转写结果与 CPU 完全一致,评测通过。

注:音频模型的 logits MAE(0.023)高于图像/文本模型,这是因为 Wav2Vec2 的 CNN 特征提取包含多层卷积,卷积累加效应导致单元素误差偏大,但余弦相似度和 Token 匹配率证明语义方向完全一致,不影响最终转写结果。

7. 迁移适配说明

7.1 模型结构

Wav2Vec2 由三部分组成:

  1. Feature Encoder:7 层 CNN(Conv1d + GroupNorm + GELU),将 16kHz 音频波形编码为每 20ms 一帧的特征向量(512 维)
  2. Transformer:12 层 Transformer Encoder(768 维隐藏层,12 头注意力),对帧级特征进行上下文建模
  3. CTC Head:线性层(768 → 32),输出字母表(含 blank token)的 logits

7.2 适配要点

  1. 使用 AutoModelForCTC.from_pretrained() 加载,model.to("npu:0") 迁移
  2. 音频预处理(AutoProcessor)在 CPU 完成:重采样到 16kHz → 归一化 → 转为 tensor
  3. CNN 特征提取(Conv1d 等)和 Transformer 注意力在 NPU 上原生支持
  4. CTC 解码(argmax + 去重 blank)在 CPU 端完成(processor.batch_decode())
  5. 注:masked_spec_embed 参数在新版 checkpoint 中缺失(TF 导出遗留),会自动初始化,不影响推理精度

7.3 关键代码

import torch, torch_npu
from transformers import AutoProcessor, AutoModelForCTC

model = AutoModelForCTC.from_pretrained("wav2vec2-base-960h").to("npu:0")
processor = AutoProcessor.from_pretrained("wav2vec2-base-960h")

inputs = processor(audio, sampling_rate=16000, return_tensors="pt", padding=True)
inputs = {k: v.to("npu:0") for k, v in inputs.items()}

with torch.no_grad():
    logits = model(**inputs).logits
    pred_ids = torch.argmax(logits, dim=-1)
    text = processor.batch_decode(pred_ids)

8. 注意事项

  1. 采样率要求:模型仅支持 16kHz 单声道音频。非 16kHz 音频需先重采样,可使用 torchaudio.functional.resample() 或 scipy.signal.resample()
  2. 音频长度:transformer 的复杂度与音频长度平方成正比,长音频(>30s)建议分段处理以避免 NPU 内存溢出
  3. masked_spec_embed 缺失:从 HuggingFace 下载的权重可能缺少该参数(原 TF 导出格式遗留),会自动初始化,不影响推理
  4. batch 处理:不同长度音频通过 padding=True 自动填充到 batch 内最长长度,超长样本可能造成大量填充浪费,建议先按长度分组
  5. CTC 空白符:Wav2Vec2 使用 CTC loss 训练,输出包含空白符(blank token),解码时需去重和去空白
  6. 语言限制:该模型仅支持英文语音识别,中文等非英文输入不会产生有意义的转写结果