本文档记录 CAM++ 中文说话人验证模型在昇腾 NPU (Ascend 910B3) 上的迁移适配与精度验证结果。
CAM++ 是基于密集连接时延神经网络 (Dense TDNN) 的说话人识别模型,使用 Context-aware Masking 机制提取说话人特征。模型输入 16kHz 音频,输出 192 维说话人嵌入向量,可用于说话人确认、说话人日志等任务。
相关获取地址:
参考文档:
| 组件 | 版本 |
|---|---|
CANN | 8.5.1 |
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
torchaudio | 2.8.0 |
modelscope | 1.37.0 |
soundfile | 0.13.1 |
numpy | 2.2.6 |
Ascend 910B3,单卡推理conda create -n speech_campplus_sv python=3.10 -y
conda activate speech_campplus_sv# PyTorch + Ascend NPU 后端
pip install torch==2.8.0 torch_npu==2.8.0.post4 torchaudio==2.8.0 \
-i https://mirrors.huaweicloud.com/repository/pypi/simple \
--trusted-host mirrors.huaweicloud.com
# 模型与工具库
pip install modelscope==1.37.0 soundfile numpy Pillow \
sortedcontainers simplejson pyyaml addict datasets pyarrow \
-i https://mirrors.huaweicloud.com/repository/pypi/simple \
--trusted-host mirrors.huaweicloud.com# 使用 modelscope CLI
modelscope download --model damo/speech_campplus_sv_zh-cn_16k-common \
--local_dir ./speech_campplus_sv_zh-cn_16k-common
# 或使用 HuggingFace 镜像
huggingface-cli download --resume-download \
damo/speech_campplus_sv_zh-cn_16k-common \
--local-dir ./speech_campplus_sv_zh-cn_16k-common \
--local-dir-use-symlinks False# CPU 推理
python inference.py --wav1 speaker1.wav --wav2 speaker2.wav --device cpu
# NPU 推理
python inference.py --wav1 speaker1.wav --wav2 speaker2.wav --device npufrom inference import run_verification
result = run_verification("speaker1.wav", "speaker2.wav", device="npu")
print(f"相似度: {result['similarity']:.4f}")
print(f"同一说话人: {result['is_same_speaker']}")
print(f"耗时: {result['time_ms']:.2f} ms")使用随机噪声音频(1秒,16kHz)进行 Smoke 测试:
测试条件:3 路音频并行提取说话人嵌入,30 轮取平均。
| 指标 | CPU | NPU (Ascend 910B3) | 加速比 |
|---|---|---|---|
| 总耗时 (3路) | 5244.90 ms | 50.04 ms | 104.81x |
| 单路耗时 | 1748.30 ms | 16.68 ms | 104.81x |
| 中位耗时 (3路) | 5265.62 ms | 49.96 ms | 105.39x |
| 标准差 | — | — | — |
对比 CPU (PyTorch) 与 NPU (torch_npu) 在相同 Fbank 特征输入下的嵌入向量输出:
| 指标 | 数值 |
|---|---|
| 嵌入维度 | [1, 192] |
| 最大绝对误差 | 0.0051 |
| 平均绝对误差 | 0.0014 |
| 平均相对误差 | 0.5670% |
| P99 相对误差 | 6.3427% |
| Cosine 相似度 | 0.99999774 |
本模型采用 hybrid 架构:特征提取在 CPU 执行,CAMPPlus 嵌入模型在 NPU 执行。
核心适配步骤:
pipeline(Tasks.speaker_verification, model=model_dir)model._SpeakerVerificationCAMPPlus__extract_feature(audio)model.embedding_model.to("npu:0")feature.to("npu:0")model.embedding_model(feature_npu)为什么特征提取在 CPU?
Kaldi Fbank 特征提取包含 torchaudio.compliance.kaldi.fbank 调用,该函数内部使用了 NPU 不支持的算子(如动态 shape 操作)。特征提取计算量极小(占整体 < 1%),放在 CPU 对性能几乎无影响。
| 依赖 | 用途 |
|---|---|
torch_npu | Ascend NPU 的 PyTorch 后端 |
torchaudio | Kaldi Fbank 特征提取 |
modelscope | 模型加载与 pipeline 管理 |
soundfile | 音频文件读取 |
addict / datasets | ModelScope 依赖 |
librosa.resample 转换feature.cat() 合并多路特征并行推理