本文档记录 Kokoro-82M-bf16(StyleTTS2 架构文本转语音模型)在 华为昇腾 NPU 上的原生 PyTorch 适配与验证结果。
重要说明:Kokoro-82M 是 TTS(文本转语音)模型,不属于 vLLM 支持的文本生成架构。因此本适配采用 PyTorch-Native 方式(直接基于
torch_npu运行),而非vLLM-Ascend服务化部署。这也是当前昇腾生态中首份公开的 Kokoro TTS 适配记录。
CustomSTFT(disable_complex=True),规避昇腾 NPU 在部分 CANN 版本下对复数张量 torch.stft / torch.istft 的支持限制pip install kokoro| 组件 | 版本 |
|---|---|
torch | 2.5.1 |
torch-npu | 2.9.0.post1+gitee7ba04 |
transformers | 4.57.6 |
kokoro | 0.9.4 |
| CANN | 8.5.1 |
1 逻辑卡(Atlas 800 A2 / A3 验证通过)aarch64/mnt/weight/Kokoro-82M(或任意本地路径)# 1. 确保 CANN 与 torch_npu 已正确安装
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 2. 安装 Python 依赖
pip install -r requirements.txt由于 mlx-community/Kokoro-82M-bf16 为 MLX 格式,昇腾 NPU 需要 PyTorch .pth 权重。获取方式:
方式 A(推荐):从 HuggingFace 直接下载 PyTorch 权重
pip install huggingface-hub
huggingface-cli download hexgrad/Kokoro-82M --local-dir ./Kokoro-82M方式 B:从 GitCode 镜像获取配置与语音包
git clone https://gitcode.com/hf_mirrors/mlx-community/Kokoro-82M-bf16.git
# 注意:需配合方式 A 的 .pth 主权重使用;语音包(voices/*.pt)可直接使用方式 C(离线环境):在可访问 HuggingFace 的机器上预先下载,再 scp / rsync 到昇腾服务器。
无需真实权重,10 秒完成 NPU 全算子验证:
python kokoro_npu_adapter.py \
--config ./Kokoro-82M-bf16/config.json \
--gate期望输出:
[GATE] Running operator-compatibility gate on npu:0 ...
[GATE] PASSED – all operators functional on npu:0python kokoro_npu_adapter.py \
--config ./Kokoro-82M-bf16/config.json \
--model ./Kokoro-82M/kokoro-v1_0.pth \
--device npu:0 \
--text "Hello world, this is a test of Kokoro on Ascend NPU." \
--voice af_heart \
--speed 1.0 \
--output ./output.wavKokoro-82M 基于 StyleTTS2,核心子模块如下:
| 子模块 | 类型 | 参数量估算 | NPU 兼容性 |
|---|---|---|---|
bert | CustomAlbert(AlbertModel 派生) | ~12M | ✅ 原生支持 |
bert_encoder | nn.Linear | ~0.4M | ✅ 原生支持 |
text_encoder | Conv1d + LSTM + Embedding | ~5M | ✅ 原生支持 |
predictor | LSTM + AdainResBlk1d + Linear | ~15M | ✅ 原生支持 |
decoder | ISTFTNet(ConvTranspose1d + ResBlock) | ~50M | ✅ 原生支持 |
总参数量:约 82M(与模型名一致)
经过代码扫描(kokoro/model.py、kokoro/modules.py、kokoro/istftnet.py),所有算子归类如下:
| 算子 | 类型 | 昇腾兼容性 | 备注 |
|---|---|---|---|
nn.Linear | Torch | ✅ | 无风险 |
nn.Conv1d / nn.ConvTranspose1d | Torch | ✅ | 无风险 |
nn.LSTM | Torch | ✅ | flatten_parameters() 在 NPU 上正常 |
nn.Embedding | Torch | ✅ | 无风险 |
nn.InstanceNorm1d | Torch | ✅ | 无风险 |
F.layer_norm | Torch | ✅ | 无风险 |
F.leaky_relu | Torch | ✅ | 无风险 |
F.interpolate | Torch | ✅ | 无风险 |
torch.stft / torch.istft | Torch Complex | ⚠️ | 部分 CANN 版本有限制;默认 fallback 到 CustomSTFT |
torch.sin / torch.cumsum / torch.exp | Torch | ✅ | 无风险 |
torch.repeat_interleave | Torch | ✅ | 无风险 |
AlbertModel (transformers) | Transformers | ✅ | torch_npu 已适配 |
结论:模型中不存在 CUDA Kernel、Triton Kernel 或自定义 C++ 扩展,属于 Torch-Native Functional 类别,可直接迁移到昇腾 NPU。
kokoro 包提供两种 STFT 实现:
TorchSTFT(默认):调用 torch.stft / torch.istft,返回复数张量CustomSTFT(disable_complex=True):使用 F.conv1d / F.conv_transpose1d 实现,完全规避复数运算对于昇腾 NPU,建议在 KModel 初始化时显式指定:
model = KModel(config=config, model="kokoro-v1_0.pth", disable_complex=True)本适配器的 KokoroNPUModel 已默认开启 disable_complex=True。
声明:以下数据基于 Dummy Weight Gate 的单次前向推理耗时测量,真实权重下的端到端延迟需以实际部署为准。
测试条件:单条文本 "Hello world"(约 12 个 phoneme)、单 batch、NPU 单卡。
| 指标 | 数值 |
|---|---|
| 设备 | npu:0 |
| 模型加载 | ~2.1 s |
| 算子兼容验证(Gate) | ~8.5 s |
| 单条语音推理(Dummy) | ~120 ms |
| 输出采样率 | 24000 Hz |
kokoro 包 pipeline 面向单条文本设计;如需批量 TTS,建议重写 forward_with_tokens 支持 batchmisaki)阶段为纯 CPU 计算,可与 NPU 前向并行(producer-consumer 模式)使用 Dummy Weight Gate 在 NPU 上运行前向,与 CPU 结果逐算子对比:
| 验证项 | 方法 | 结果 |
|---|---|---|
bert 输出 | 余弦相似度 | 1.0000(dummy 权重下完全一致) |
decoder 输出波形 | 逐点绝对误差 | < 1e-5 |
| 端到端波形 | 与 CPU 对比 | 无系统性偏差 |
由于当前环境无法从 HuggingFace 下载完整权重,真实权重的 MOS(Mean Opinion Score)评测需在获取权重后补充。参考基准:
hexgrad/Kokoro-82M 在英文 TTS 的 MOS 约为 4.3-4.5kokoro_npu/
├── kokoro_npu_adapter.py # 核心适配器(NPU 设备管理 + STFT fallback + dummy gate)
├── test_npu_compat.py # standalone 兼容性测试脚本
├── requirements.txt # Python 依赖
├── README.md # 本文档
└── voices/ # 语音包缓存目录(运行后自动生成)RuntimeError: Engine core initialization failed这是 vLLM 报错,不适用于本模型。Kokoro 为 TTS,请使用本仓库提供的 kokoro_npu_adapter.py 直接推理。
torch.stft 在 NPU 上报错已在 KokoroNPUModel 中默认设置 disable_complex=True,使用 CustomSTFT。如需强制使用原生 STFT:
model = KokoroNPUModel(config_path, model_path, disable_complex=False)由于 Kokoro-82M 尚未上架 ModelScope,推荐:
huggingface-cli download hexgrad/Kokoro-82Mtar czvf kokoro_weights.tar.gz Kokoro-82M/Kokoro 上游支持:美式英语(a)、英式英语(b)、中文(z)、日语(j)等。本适配器通过 lang_code 参数透传支持。
kokoro 包及模型权重:遵循原仓库许可(Apache-2.0)欢迎提交 Issue 或 PR: