本文档记录 indonesian-nlp/wav2vec2-indonesian-javanese-sundanese 在昇腾 Ascend 910B4 NPU 上的适配与验证结果。
该模型基于 facebook/wav2vec2-large-xlsr-53 微调,支持印尼语 (Indonesian)、爪哇语 (Javanese)、巽他语 (Sundanese) 三语种语音识别。模型架构为 Wav2Vec2ForCTC,包含 7层CNN特征提取 + 24层Transformer编码器 + CTC分类头,搭配4gram语言模型进行Beam Search解码。
适配方案:使用 torch_npu + transformers 直接推理,无需任何算子替换——所有算子 (Conv1d, Linear, LayerNorm, MultiheadAttention, GELU) 均被 torch_npu 原生支持。
相关获取地址:
参考文档:
| 组件 | 版本 |
|---|---|
torch | 2.9.0+cpu |
torch_npu | 2.9.0.post1+gitee7ba04 |
transformers | 4.57.6 |
pyctcdecode | 0.2.0 |
kenlm | 0.2.0 |
CANN | 8.5.1 |
SOC_VERSION | ascend910b1 |
1 逻辑卡 (Ascend 910B4)wav2vec2-indonesian-javanese-sundanese/由于HuggingFace直连可能受限,推荐使用镜像站下载:
# 方法1:使用hf-mirror镜像
export HF_ENDPOINT=https://hf-mirror.com
python3 -c "
from huggingface_hub import snapshot_download
snapshot_download(
'indonesian-nlp/wav2vec2-indonesian-javanese-sundanese',
local_dir='./wav2vec2-indonesian-javanese-sundanese'
)
"
# 方法2:直接使用 transformers(需要设置 HF_ENDPOINT)
export HF_ENDPOINT=https://hf-mirror.com
python3 -c "
from transformers import Wav2Vec2ForCTC, Wav2Vec2ProcessorWithLM
model = Wav2Vec2ForCTC.from_pretrained('indonesian-nlp/wav2vec2-indonesian-javanese-sundanese')
processor = Wav2Vec2ProcessorWithLM.from_pretrained('indonesian-nlp/wav2vec2-indonesian-javanese-sundanese')
"# 基础依赖
pip install torch_npu transformers soundfile librosa
# kenlm 需从源码安装 (用于4gram语言模型解码)
pip install https://github.com/kpu/kenlm/archive/master.zip# 单文件推理 (NPU后端)
python3 inference.py --audio audio.wav --backend npu
# CPU后端 (精度对比)
python3 inference.py --audio audio.wav --backend cpu
# 长音频分块推理
python3 inference.py --audio long_audio.wav --chunk-length-s 10.0
# 详细模式
python3 inference.py --audio audio.wav --verboseimport torch
import torch_npu
import numpy as np
import soundfile as sf
from transformers import Wav2Vec2ForCTC, Wav2Vec2ProcessorWithLM
MODEL_PATH = "./wav2vec2-indonesian-javanese-sundanese"
# 加载模型
processor = Wav2Vec2ProcessorWithLM.from_pretrained(MODEL_PATH)
model = Wav2Vec2ForCTC.from_pretrained(MODEL_PATH).npu().eval()
# 加载音频
audio, sr = sf.read("audio.wav")
if len(audio.shape) > 1:
audio = audio.mean(axis=1)
if sr != 16000:
import librosa
audio = librosa.resample(audio, orig_sr=sr, target_sr=16000)
# NPU推理
inputs = processor(audio.astype(np.float32), sampling_rate=16000, return_tensors="pt", padding=True)
with torch.no_grad():
logits = model(inputs.input_values.npu()).logits.cpu().numpy()
# CTC解码 (含4gram语言模型)
text = processor.decode(logits[0]).text
print(f"识别结果: {text}")基础检查:
# 验证NPU可用
python3 -c "import torch_npu; print(torch.npu.is_available(), torch.npu.get_device_name(0))"
# 模型加载测试
python3 -c "
from transformers import Wav2Vec2ForCTC
model = Wav2Vec2ForCTC.from_pretrained('./wav2vec2-indonesian-javanese-sundanese')
print(f'Params: {sum(p.numel() for p in model.parameters()):,}')
"
# 运行完整评测
cd eval && python3 benchmark.py验证结果:
torch.npu.is_available() → True315,469,470PASS使用合成音频信号(多频率正弦 + 噪声)进行 CPU vs NPU 精度对比,度量 cosine similarity 和绝对/相对误差。
| 音频时长 | CPU耗时 | NPU耗时 | 加速比 | Cosine Similarity | 结论 |
|---|---|---|---|---|---|
| 1.0s | 2,581 ms | 29.1 ms | 88.7x | 0.99999509 | PASS |
| 3.0s | 6,426 ms | 31.0 ms | 207.5x | 0.99999791 | PASS |
| 5.0s | 10,448 ms | 31.7 ms | 329.7x | 0.99999896 | PASS |
| 10.0s | 21,944 ms | 33.2 ms | 660.6x | 0.99999870 | PASS |
CPU vs NPU 完整对比:
| 指标 | 数值 |
|---|---|
| CPU 总耗时 | 10,553 ms |
| NPU 总耗时 | 35.8 ms |
| NPU 加速比 | 294.9x |
| Cosine 相似度 | 0.99999860 |
| CPU 解码文本 | 'eeee' |
| NPU 解码文本 | 'eeee' |
| 解码文本一致性 | True |
精度结论:NPU推理与CPU输出完全一致(余弦相似度 > 0.99999),误差 < 0.0003%,满足 < 1% 的精度要求。
测试条件:5.0s 合成音频 / 20 iterations / batch_size=1,取 warmup 后均值。
| 音频时长 | 均值延迟 | P95延迟 | P99延迟 | RTF |
|---|---|---|---|---|
| 1.0s | 39.1 ms | 40.6 ms | 43.3 ms | 0.0391 |
| 5.0s | 40.0 ms | 42.0 ms | 49.1 ms | 0.0080 |
| 10.0s | 40.5 ms | 41.5 ms | 42.2 ms | 0.0041 |
| 30.0s | 60.8 ms | 62.9 ms | 123.9 ms | 0.0020 |
批处理性能:
| Batch Size | 均值延迟 | 单样本延迟 |
|---|---|---|
| 1 | 38.6 ms | 38.6 ms |
| 2 | 37.7 ms | 18.8 ms |
| 4 | 40.0 ms | 10.0 ms |
| 8 | 45.8 ms | 5.7 ms |
压测时建议使用 batch_size=4~8 以获得最佳吞吐。
pip install https://github.com/kpu/kenlm/archive/master.ziplibrosa.resample 转换pytorch_model.bin,加载时默认 map_location='cpu' 避免内存问题export HF_ENDPOINT=https://hf-mirror.com 使用镜像站export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 优化内存分配| 文件 | 说明 |
|---|---|
inference.py | NPU 推理脚本,支持 NPU/CPU/CUDA 后端 |
eval/benchmark.py | 精度 + 性能评测脚本 |
eval/benchmark.log | 评测运行日志 |
eval/results.json | 评测结果 JSON |
适配日期: 2026-05-09 适配工具: torch_npu + transformers NPU设备: Ascend 910B4