g
gcw_C8PI9e90/kani-tts-400m-ko-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

KaniTTS-400M-Korean NPU 部署指南

1. 简介

本文档记录 KaniTTS-400M-Korean(韩语语音合成模型)在华为昇腾 Ascend NPU 上的部署与验证结果。

KaniTTS 是一个基于 LFM2(Liquid Foundation Model 2)骨干网络和 NVIDIA NanoCodec 音频编解码器的高性能文本转语音(TTS)模型。该模型通过因果语言模型生成音频 token,再经由 NanoCodec 解码为波形。

模型规格:

  • 参数量:400M
  • 采样率:22.05kHz
  • 模型类型:Lfm2ForCausalLM(因果语言模型)
  • 数据类型:bfloat16
  • 单说话人

相关资源:

  • 原始模型:https://huggingface.co/nineninesix/kani-tts-400m-ko
  • KaniTTS 项目:https://github.com/nineninesix-ai/kani-tts

2. 验证环境

组件版本
操作系统Ubuntu 22.04 (aarch64)
NPUAscend 910B4 (31GB)
Python3.11.14
torch2.9.0+cpu
torch_npu2.9.0.post1
transformers5.8.0

3. 模型下载

使用 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')
"

4. 推理脚本

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。

推理流程说明

推理分为两个阶段:

  1. NPU 生成阶段:LFM2 语言模型在 NPU 上运行,将输入文本转换为音频 token 序列
  2. CPU 解码阶段:NanoCodec 编解码器在 CPU 上运行,将音频 token 解码为波形

5. 推理结果

以下为 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 文件保存链路均已跑通。

6. 精度评测

NPU vs CPU 精度对比(通过对比前向传播 logits):

指标CPU / NPU 对比结果精度误差说明
Token 匹配率100%argmax token 完全一致
均方误差 (MSE)3.3e-2logits 数值误差较小
余弦相似度> 0.99995余弦距离误差 < (1 - 0.99995) * 100 = 0.005%
对称 KL 散度< 1e-6softmax 分布差异极小

评测方法:在相同输入下,分别采集 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% 要求。

7. 注意事项

  1. 设备要求:需要 Ascend 910 系列 NPU,建议可用显存 ≥ 4GB
  2. 环境依赖:
    • 需要安装 torch_npu 以支持 NPU 推理
    • NanoCodec 解码在 CPU 上执行,需要安装 nemo-toolkit
    • 音频保存需要 soundfile 库
  3. 多说话人模型:单说话人。选择说话人通过在 inference.py 中指定 --speaker 参数
  4. 文本长度:建议单次输入不超过 200 个字符,过长的文本可能导致生成质量下降
  5. 显存管理:多个模型评测时需串行执行,防止显存溢出