wav2vec2-base-960h 是 Facebook 提出的自监督语音识别模型 Wav2Vec2 的基线模型,在 960 小时的 Librispeech 数据集上进行微调。该模型将原始音频波形映射到潜在表示,然后通过 CTC 解码器进行语音识别。
wav2vec2-base-960h-ascend/
├── inference.py # 推理测试脚本
├── log.txt # 测试日志
├── README.md # 本文档
└── test_audio/ # 测试音频
├── test_1.wav # 测试音频1
└── test_2.wav # 测试音频2docker exec -it test-modelagent bashsource /usr/local/Ascend/ascend-toolkit/set_env.sh模型文件位于 /data/ysws/agentsp/5-15/wav2vec2-base-960h/ 目录下:
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运行精度对比测试,验证 NPU 计算结果与 CPU 一致性:
cd /data/ysws/agentsp/5-15/wav2vec2-base-960h-ascend/
python3 inference.py --mode precision_test| 参数 | 说明 | 默认值 |
|---|---|---|
--mode | 测试模式: inference 或 precision_test | inference |
--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)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)| 组件 | 说明 |
|---|---|
| feature_extractor | CNN 特征提取器 |
| encoder | Transformer 编码器 |
| masked_spec_embed | 掩码嵌入 (预训练) |
| lm_head | CTC 解码头 |
从 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
}A: 这是正常现象。NPU 使用 bfloat16 精度,CPU 使用 float32,会导致约 1-2% 的数值差异。对于语音识别任务,这不影响最终的文本输出。
A: 首次推理会有算子编译开销。后续推理会更快。对于短音频 (1s),CPU 可能更快;长音频 NPU 更有优势。
A: 使用正弦波生成的测试音频不是真实的语音内容,所以模型没有输出。这属于正常现象。
A: 使用真实的人声音频数据。wav2vec2-base-960h 在 LibriSpeech clean 测试集上 WER 为 3.4%。
完整测试日志保存在 log.txt。包括:
本项目遵循 Apache-2.0 许可证