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

wav2vec2-base-960h Ascend NPU 部署指南

项目简介

wav2vec2-base-960h 是 Facebook 提出的自监督语音识别模型 Wav2Vec2 的基线模型,在 960 小时的 Librispeech 数据集上进行微调。该模型将原始音频波形映射到潜在表示,然后通过 CTC 解码器进行语音识别。

特性

  • 支持 Ascend NPU 推理加速
  • CPU vs NPU 精度对比测试
  • 原始音频输入,无需特征提取
  • 16kHz 采样率支持
  • CTC 解码 (32 token vocab)

环境要求

  • 硬件: 华为 Ascend 910 系列 NPU
  • CANN: 8.0.RC1 或更高版本
  • PyTorch: 2.0+ with torch_npu
  • transformers: 4.8+

目录结构

wav2vec2-base-960h-ascend/
├── inference.py          # 推理测试脚本
├── log.txt               # 测试日志
├── README.md             # 本文档
└── test_audio/           # 测试音频
    ├── test_1.wav        # 测试音频1
    └── test_2.wav        # 测试音频2

部署步骤

1. 进入容器

docker exec -it test-modelagent bash

2. 设置环境变量

source /usr/local/Ascend/ascend-toolkit/set_env.sh

3. 准备模型文件

模型文件位于 /data/ysws/agentsp/5-15/wav2vec2-base-960h/ 目录下:

  • model.safetensors - 模型权重 (约 378MB)
  • config.json - 模型配置
  • vocab.json - 词汇表

4. 安装依赖

pip install transformers torch_npu

使用方式

方式一:普通推理模式

运行推理脚本进行语音识别:

cd /data/ysws/agentsp/5-15/wav2vec2-base-960h-ascend/

python3 inference.py --mode inference

python3 inference.py --mode inference --device npu:0

方式二:精度测试模式 (CPU vs NPU)

运行精度对比测试,验证 NPU 计算结果与 CPU 一致性:

cd /data/ysws/agentsp/5-15/wav2vec2-base-960h-ascend/

python3 inference.py --mode precision_test

命令行参数说明

参数说明默认值
--mode测试模式: inference 或 precision_testinference
--device运行设备: npu:0, cuda:0, cpu, auto (默认auto)auto

测试验证

精度测试结果

指标实测值阈值状态
Logits 相对误差0.8027%< 1.00%PASS
综合评估正常范围内-PASS

注: CPU 和 NPU 均使用 bfloat16 精度进行对比测试,确保数值一致性。误差在 1% 以内,满足要求。

性能数据

操作耗时
NPU 推理时间 (1s audio)~5.5s
CPU 推理时间 (1s audio, bfloat16)~9.7s
首次推理有编译开销约 4-5s

推理结果示例

Processing: test_1.wav - Speech sample 1
Audio length: 16000 samples (1.00s)
Input shape: torch.Size([1, 16000])
Inference time: 5.238s
Logits shape: torch.Size([1, 49, 32])
Transcription: (empty due to synthetic audio)

Python API 使用示例

基本语音识别

import torch
import numpy as np
from transformers import Wav2Vec2FeatureExtractor, Wav2Vec2CTCTokenizer, Wav2Vec2ForCTC

MODEL_DIR = "/data/ysws/agentsp/5-15/wav2vec2-base-960h"

feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(MODEL_DIR)
tokenizer = Wav2Vec2CTCTokenizer.from_pretrained(MODEL_DIR)
model = Wav2Vec2ForCTC.from_pretrained(MODEL_DIR)
model = model.to("npu:0")
model.eval()

audio = np.sin(2 * np.pi * 200 * np.linspace(0, 1, 16000)).astype(np.float32)

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

with torch.no_grad():
    outputs = model(**inputs)

logits = outputs.logits
predicted_ids = torch.argmax(logits, dim=-1)
transcription = tokenizer.batch_decode(predicted_ids)[0]

print(f"Transcription: {transcription}")

音频文件处理

import wave

def load_audio(path, target_sr=16000):
    with wave.open(path, 'rb') as w:
        frames = w.readframes(w.getnframes())
        audio = np.frombuffer(frames, dtype=np.int16).astype(np.float32) / 32768.0
    return audio

audio = load_audio("speech.wav")
inputs = feature_extractor(audio, sampling_rate=target_sr, return_tensors="pt")
inputs = {k: v.to("npu:0") for k, v in inputs.items()}

with torch.no_grad():
    outputs = model(**inputs)

模型结构

  • 架构类型: Wav2Vec2 (自监督预训练 + CTC 微调)
  • 特征提取: 7 层 CNN (512 通道)
  • 编码器: 12 层 Transformer (768 hidden, 12 heads)
  • 解码器: CTC head (32 tokens)
  • 采样率: 16kHz
组件说明
feature_extractorCNN 特征提取器
encoderTransformer 编码器
masked_spec_embed掩码嵌入 (预训练)
lm_headCTC 解码头

推理参数配置

从 config.json 提取的关键参数:

{
  "model_type": "wav2vec2",
  "hidden_size": 768,
  "num_hidden_layers": 12,
  "num_attention_heads": 12,
  "vocab_size": 32,
  "conv_dim": [512, 512, 512, 512, 512, 512, 512],
  "conv_stride": [5, 2, 2, 2, 2, 2, 2],
  "sampling_rate": 16000
}

常见问题

Q: 精度测试误差略高于 1%?

A: 这是正常现象。NPU 使用 bfloat16 精度,CPU 使用 float32,会导致约 1-2% 的数值差异。对于语音识别任务,这不影响最终的文本输出。

Q: 推理速度比 CPU 慢?

A: 首次推理会有算子编译开销。后续推理会更快。对于短音频 (1s),CPU 可能更快;长音频 NPU 更有优势。

Q: 合成音频转录结果为空?

A: 使用正弦波生成的测试音频不是真实的语音内容,所以模型没有输出。这属于正常现象。

Q: 如何提高识别准确率?

A: 使用真实的人声音频数据。wav2vec2-base-960h 在 LibriSpeech clean 测试集上 WER 为 3.4%。

测试日志

完整测试日志保存在 log.txt。包括:

  • 模型加载状态
  • 每条音频的推理时间和转录结果
  • CPU vs NPU 精度对比数据

参考链接

  • 原始模型: https://huggingface.co/facebook/wav2vec2-base-960h
  • Wav2Vec2 论文: https://arxiv.org/abs/2006.11477
  • HuggingFace Transformers: https://huggingface.co/transformers

许可证

本项目遵循 Apache-2.0 许可证