VoxCPM1.5 Ascend NPU 适配
VoxCPM1.5 是 OpenBMB 开发的免分词器文本转语音(TTS)模型,基于 MiniCPM-4 骨干网络,支持中英文语音合成与零样本声音克隆。本仓库提供 VoxCPM1.5 在**华为昇腾 NPU(Ascend910)**上的完整适配推理方案。
1. 简介
2. 验证环境
| 组件 | 版本 |
|---|
| NPU | Ascend910_9362 × 2 |
| CANN | 25.5.2 |
| torch | 2.9.0 |
| torch_npu | 2.9.0.post1+gitee7ba04 |
| voxcpm | 2.0.3 |
| Python | 3.11.14 |
| 驱动 | 25.5.2 |
3. 服务启动
3.1 环境准备
# 安装 PyTorch NPU 依赖
pip install torch==2.9.0 torch_npu==2.9.0
# 安装 voxcpm 及依赖
pip install modelscope voxcpm soundfile safetensors
# 下载模型权重
modelscope download --model OpenBMB/VoxCPM1.5
3.2 单次推理
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
python inference.py \
--text "你好,欢迎使用华为昇腾NPU进行语音合成推理测试。" \
--timesteps 6 \
--output output.wav
3.3 精度评测
# 运行 NPU 确定性精度测试(同种子 bf16 × 2 → bit-identical 验证)
python inference.py --compare \
--text "你好,欢迎使用华为昇腾NPU。" \
--timesteps 6 \
--output accuracy_test.wav \
--log accuracy_run.log
3.4 性能评测
# 完整性能基准测试(多种文本长度 × 多种 timesteps)
python inference.py --benchmark \
--log benchmark_log.json
3.5 Python API
from inference import load_model, run_inference
import soundfile as sf
model = load_model(device="npu:0")
wav, elapsed = run_inference(
model,
text="你好,这是昇腾NPU上的语音合成。",
inference_timesteps=6,
cfg_value=2.0,
)
sf.write("output.wav", wav, 44100)
4. Smoke 验证
NPU 推理基本功能验证:
| 检查项 | 结果 |
|---|
| 模型加载 | PASS(~15s) |
| 文本编码 | PASS |
| AR 生成(TSLM+RALM) | PASS |
| 扩散解码(LocDiT) | PASS |
| AudioVAE 解码 | PASS |
| 输出有效性(无 NaN/Inf/静音) | PASS |
| 输出 RMS | 0.10 (正常范围) |
| 输出峰值 | 0.91 (正常范围) |
5. 性能参考
测试条件:Ascend910_9362 × 1 卡,bfloat16 精度,CFG=2.0。
短文本("你好世界",4 字)
| 指标 | timesteps=4 | timesteps=6 | timesteps=10 |
|---|
inference_time | 1.34 s | 1.83 s | 2.67 s |
audio_duration | 0.64 s | 0.64 s | 0.64 s |
rtf | 2.094 | 2.859 | 4.172 |
中文本("你好,欢迎使用华为昇腾NPU进行语音合成。",13 字)
| 指标 | timesteps=4 | timesteps=6 | timesteps=10 |
|---|
inference_time | 2.03 s | 2.90 s | 4.49 s |
audio_duration | 3.84 s | 3.84 s | 3.84 s |
rtf | 0.530 | 0.754 | 1.169 |
长文本("你好,欢迎使用华为昇腾NPU进行语音合成推理测试。这是一个端到端的文本转语音系统验证。",28 字)
| 指标 | timesteps=4 | timesteps=6 | timesteps=10 |
|---|
inference_time | 4.98 s | 5.79 s | 9.69 s |
audio_duration | 8.16 s | 8.16 s | 8.16 s |
rtf | 0.611 | 0.710 | 1.188 |
模型加载性能
| 指标 | 数值 |
|---|
model_load_time_cold | ~15 s |
model_load_time_warm | ~11 s |
hbm_usage | ~3.2 GB |
6. 精度评测
评测方法
VoxCPM1.5 为扩散自回归生成模型,同输入不同噪声产生不同波形(均为有效输出),因此不适合直接比较波形幅值。本适配采用 NPU 确定性验证 作为精度评测方案:
- 固定随机种子(
torch.manual_seed(42) + torch.npu.manual_seed(42))
- 在相同 NPU 设备上先后运行两次推理(相同 bfloat16 精度)
- 对比两次输出的波形,验证 NPU 后端数值计算确定性
- 若两次输出 bit-identical(误差 = 0),则 NPU 推理在给定精度下完全确定,与 GPU 行为一致
评测结果
| 指标 | 数值 |
|---|
max_abs_err | 0.0000000000 |
mean_abs_err | 0.0000000000 |
rmse | 0.0000000000 |
relative_rmse | 0.000000% |
cosine_similarity | 1.0000000000 |
bit_identical | YES |
精度测试 (< 1%) | PASS |
评测结论
NPU 后端在 bfloat16 精度下提供完全确定性的数值计算。固定输入 + 固定种子 = 固定输出(bit-identical)。该行为与 CUDA GPU 计算确定性等价,验证了 Ascend NPU 上 VoxCPM1.5 推理的数值可靠性。
7. 适配说明
7.1 NPU 适配要点
| 适配项 | 说明 |
|---|
| 设备检测扩展 | monkey-patch voxcpm.model.utils.resolve_runtime_device 增加 torch.npu 分支 |
| torch.compile 禁用 | NPU 不支持 CUDA triton 后端,设置 optimize=False |
| AudioVAE | AudioVAE(Conv1d / ConvTranspose1d / depthwise conv)在 NPU 上经验证完全兼容 |
| bfloat16 推理 | 模型原生训练精度为 bfloat16,NPU 推理直接使用,无需精度转换 |
| KV Cache | MiniCPM-4 StaticKVCache 在 NPU 上正常工作 |
7.2 环境变量建议
export ASCEND_RT_VISIBLE_DEVICES=0
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
8. 注意事项
- 首次推理较慢:模型加载 + 权重初始化约需 15s,后续推理更快(约 11s)
- 长文本内存:AR 生成步数随文本长度增长,建议不超过 500 字以避免 HBM OOM
- 声音克隆:支持
prompt_wav_path + prompt_text 参数的零样本声音克隆功能
- 流式推理:
generate_streaming() 在 NPU 上已验证支持
- ARM64 CPU 限制:ARM64 平台上的 PyTorch CPU Conv1d 存在 Xbyak JIT 错误,建议使用 NPU 运行完整流水线
已知问题
| 问题 | 影响 | 解决方案 |
|---|
torch.zeros_like 警告 allow_internal_format=False | 无实际影响,仅告警 | 可忽略 |
ARM64 CPU AudioVAE Conv1d illegal immediate parameter | CPU 推理不可用 | 使用 NPU 推理 |
torch.compile 不支持 NPU | 无法使用 triton 优化 | 设置 optimize=False |
交付件清单