本文档记录 KaniTTS-400M-Korean(韩语语音合成模型)在华为昇腾 Ascend NPU 上的部署与验证结果。
KaniTTS 是一个基于 LFM2(Liquid Foundation Model 2)骨干网络和 NVIDIA NanoCodec 音频编解码器的高性能文本转语音(TTS)模型。该模型通过因果语言模型生成音频 token,再经由 NanoCodec 解码为波形。
模型规格:
相关资源:
| 组件 | 版本 |
|---|---|
| 操作系统 | Ubuntu 22.04 (aarch64) |
| NPU | Ascend 910B4 (31GB) |
| Python | 3.11.14 |
| torch | 2.9.0+cpu |
| torch_npu | 2.9.0.post1 |
| transformers | 5.8.0 |
使用 Hugging Face 镜像站下载模型权重到本地:
# 设置镜像
export HF_ENDPOINT=https://hf-mirror.com
# 下载模型
python3 -c "
from huggingface_hub import snapshot_download
snapshot_download(repo_id='nineninesix/kani-tts-400m-ko', local_dir='./kani-tts-400m-ko')
"inference.py 是 NPU 推理脚本,支持单次文本和批量文件输入。
# 单句合成
python inference.py --text "안녕하세요" --output output.wav
# 从文件读取文本
echo "안녕하세요, 오늘 기분은 어떠세요?" > input.txt
python inference.py --text-file input.txt --output-dir ./output
# 自定义参数
python inference.py \
--text "안녕하세요, 오늘 기분은 어떠세요?" \
--temperature 0.7 \
--top-p 0.9 \
--max-tokens 3000 \
--output output.wav| 参数 | 说明 |
|---|---|
--model-path | 本地模型目录,默认读取当前目录下的 kani-tts-400m-ko |
--text | 单句韩语输入文本 |
--text-file | 批量输入文本文件,UTF-8 编码,每次读取文件全文作为输入 |
--output | 单句推理输出 WAV 文件路径 |
--output-dir | 未指定 --output 时的默认输出目录 |
--max-tokens | 最大生成 token 数,默认 3000 |
--temperature / --top-p | 采样参数,用于控制语音生成多样性 |
推理成功后,脚本会生成 WAV 音频文件,并在终端输出输入文本与音频时长。若指定 --output output.wav,成功产物为当前目录下的 output.wav。
推理分为两个阶段:
以下为 NPU 上的推理测试结果:
| 项目 | 数值 |
|---|---|
| 模型加载时间 | ~11s |
| Token 生成时间 | ~27s |
| 音频解码时间 | ~18s |
| 输出音频时长 | ~6s |
| 采样率 | 22050 Hz |
| 峰值显存 | ~2.5 GB |
注:以上为单次推理耗时,实际性能受文本长度和 max-tokens 参数影响。
本仓库的 inference.py 调用 KaniTTSNPU.generate() 完成 NPU 生成,并调用 save_audio() 保存 WAV 文件。一次成功推理应包含以下关键输出:
[KaniTTSEngine] Model loaded on NPU in ...s
[NanoCodecEngine] NanoCodec loaded in ...s
[KaniTTSNPU] Generation: ...s | Decode: ...s | Audio: ...s at 22050Hz
[KaniTTSNPU] Audio saved to output.wav
Input text: 안녕하세요
Audio duration: ...s已记录的 NPU 推理结果显示:模型加载约 11s,token 生成约 27s,音频解码约 18s,输出音频约 6s,采样率 22050 Hz,说明 NPU 文本到音频 token 生成、CPU NanoCodec 解码和 WAV 文件保存链路均已跑通。
NPU vs CPU 精度对比(通过对比前向传播 logits):
| 指标 | CPU / NPU 对比结果 | 精度误差说明 |
|---|---|---|
| Token 匹配率 | 100% | argmax token 完全一致 |
| 均方误差 (MSE) | 3.3e-2 | logits 数值误差较小 |
| 余弦相似度 | > 0.99995 | 余弦距离误差 < (1 - 0.99995) * 100 = 0.005% |
| 对称 KL 散度 | < 1e-6 | softmax 分布差异极小 |
评测方法:在相同输入下,分别采集 NPU 和 CPU 前向传播的输出 logits,计算逐 token 的误差指标。
精度结论:基于
eval_accuracy.py/kani_npu_eval.py中的 CPU vs NPU logits 对比,主判据采用 TTS/因果语言模型适用的 logits 余弦相似度。已记录结果为余弦相似度 > 0.99995,因此 CPU 与 NPU 的余弦距离精度误差为< 0.005%,小于 1% 的精度要求。
一致性结论:Token 匹配率为
100%,对称 KL 散度< 1e-6,说明 NPU 与 CPU 在 token 选择和输出概率分布上保持一致。
python eval_accuracy.py评测脚本会依次输出 NPU 加载、NPU forward、CPU 加载、逐条测试文本指标和最终 RESULT: PASS / RESULT: FAIL。当所有测试文本的 Cosine Similarity > 0.999 时,脚本判定通过;当前 README 记录的 > 0.99995 对应误差 < 0.005%,满足 < 1% 要求。
torch_npu 以支持 NPU 推理nemo-toolkitsoundfile 库--speaker 参数