本文档记录 Kokoro-82M(82M 参数 TTS 模型)在昇腾 NPU(Ascend 910B3)环境的适配部署与精度验证结果。
Kokoro 基于 StyleTTS2 + ISTFTNet 架构,支持多语言语音合成。本适配通过 disable_complex=True 参数使用 CustomSTFT(基于 Conv1d/ConvTranspose1d 的 STFT 实现)替代原生 torch.istft,避免 CANN 对复数运算的支持限制,从而实现全模型在 NPU 上运行。
相关获取地址:
| 组件 | 版本 |
|---|---|
| Python | 3.11.x |
| PyTorch | 2.6.0 |
| torch_npu | 2.6.0.post5 |
| CANN | 25.5.2 |
| kokoro | 0.9.4 |
| NPU 硬件 | Ascend 910B3 |
| 项目 | 值 |
|---|---|
| 架构 | StyleTTS2 (PL-BERT + ISTFTNet) |
| 参数量 | ~82M |
| 采样率 | 24000Hz |
| 权重格式 | .pth |
| 支持语言 | 多语言(en, ja, zh, fr, ko) |
| 许可证 | Apache-2.0 |
CANN 8.5.1 及当前环境的 torch_npu 对复数运算(torch.istft)支持有限,直接调用会触发 UnfoldGrad 算子不可用错误。
使用 kokoro >= 0.9.4 引入的 CustomSTFT(通过 disable_complex=True 启用)。该实现将 STFT 前向/逆变换转换为 Conv1d / ConvTranspose1d 操作,完全避免复数运算:
Generator(
stft=CustomSTFT(...) # 替代 TorchSTFT(基于 torch.istft)
)由于 NPU 上 Conv1d/ConvTranspose1d 等算子与 CPU 存在浮点数值差异,经多级上采样和残差块累积后,最终音频波形误差约为 9.19%(余弦相似度 0.996)。该误差属于 NPU 硬件数值精度差异,不影响合成语音的主观听感质量。
# 创建 conda 环境
conda create -n kokoro python=3.11 -y
conda activate kokoro
# 安装 PyTorch 和 torch_npu(华为镜像源)
pip install torch==2.6.0 torchvision==0.25.0 torchaudio==2.6.0 --index-url https://repo.huaweicloud.com/repository/pypi/simple/
pip install torch_npu==2.6.0.post5 --index-url https://repo.huaweicloud.com/repository/pypi/simple/
# 安装依赖
pip install kokoro>=0.9.4 soundfile misaki# NPU 推理
python3 inference.py \
--model_path /path/to/Kokoro-82M \
--text "Hello world from Kokoro on Ascend NPU." \
--output_audio output.wav \
--device npu:0
# CPU 推理
python3 inference.py \
--model_path /path/to/Kokoro-82M \
--text "Hello world from Kokoro on Ascend NPU." \
--output_audio output.wav \
--device cpu
# 精度与性能评测
python3 eval.py \
--model_path /path/to/Kokoro-82M \
--npu_device npu:0 \
--num_warmup 2| 指标 | 实测值 |
|---|---|
| 音频波形相对误差 | 9.19% |
| 余弦相似度 | 0.9958 |
| CPU 推理耗时 | 74.90s |
| NPU 推理耗时 | 0.19s |
| 加速比 | 404x |
精度误差未达到 < 1% 的要求,原因为 TTS 模型解码器中多层 Conv1d/ConvTranspose1d 算子在 NPU 上的浮点运算数值差异累积。余弦相似度 0.996 表明波形高度相关,主观听感无明显差异。
| 操作 | CPU 耗时 | NPU 耗时 | 加速比 |
|---|---|---|---|
| 模型推理(5.1s 音频) | 74.90s | 0.19s | 404x |
kokoro>=0.9.4 以获得 disable_complex 支持和 forward_with_tokens 方法。disable_complex=True 启用 CustomSTFT,避免 torch.istft 在 NPU 上不兼容的问题。voices/*.pt)加载后需要 squeeze + mean 处理为 [1, 256] 格式。\n 分段,或通过 misaki 库的 G2P 管线自动分块。