Irodori-TTS-500M-v2 昇腾 NPU 适配测评报告
关于本项目
Irodori-TTS 是一款基于 Flow Matching 的日语文本转语音(TTS)模型,采用 RF-DiT(Rectified Flow Diffusion Transformer)架构,以 DACVAE 连续 latent 为生成目标。本仓库为 昇腾 NPU 原生 PyTorch 适配版本,基于 torch_npu + transfer_to_npu 自动迁移方案完成端到端推理验证。
模型概述
| 项目 | 说明 |
|---|
| 模型名称 | Irodori-TTS-500M-v2 |
| 模型来源 | Aratako/Irodori-TTS-500M-v2 |
| 模型架构 | RF-DiT (Rectified Flow Diffusion Transformer) |
| 参数量 | 494.99M (约 500M) |
| Codec | Semantic-DACVAE-Japanese-32dim |
| 应用场景 | 日语文本到语音合成 (TTS) |
| 输入格式 | 日文文本 |
| 输出格式 | 48 kHz 单声道 WAV 音频 |
| 适配框架 | torch_npu (原生 PyTorch 自动迁移) |
| 硬件平台 | Atlas 800 A2 (Ascend 910B4) |
环境信息
硬件环境
| 项目 | 规格 |
|---|
| 服务器型号 | Atlas 800 A2 |
| NPU 型号 | Ascend 910B4 |
| NPU 数量 | 1 卡 |
| NPU 内存 | 32 GB HBM |
软件环境
| 项目 | 版本 |
|---|
| 操作系统 | Linux (aarch64) |
| CANN | 8.5.1 |
| Python | 3.11.14 |
| PyTorch | 2.9.0+cpu |
| torch_npu | 2.9.0.post1+gitee7ba04 |
| transformers | >= 4.30 |
| torchaudio | >= 2.0 |
| dacvae | 源码安装 |
模型文件说明
| 文件/目录 | 说明 | 大小 |
|---|
model.safetensors | 主模型权重 (RF-DiT) | ~1.9 GB |
semantic-dacvae-japanese-32dim/weights.pth | DACVAE Codec 权重 | ~380 MB |
tokenizer | llm-jp/llm-jp-3-150m tokenizer (自动缓存) | - |
快速开始
1. 环境准备
# 加载 CANN 环境
source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0
# 国内镜像源(可选)
export PIP_INDEX_URL=https://repo.huaweicloud.com/repository/pypi/simple/
export HF_ENDPOINT=https://hf-mirror.com
2. 依赖安装
pip install torchaudio transformers safetensors soundfile sentencepiece huggingface-hub tqdm torchcodec
# DACVAE codec(从源码安装,无 CUDA 扩展)
git clone https://github.com/facebookresearch/dacvae.git /tmp/dacvae
pip install /tmp/dacvae
# torch_npu 运行时依赖
pip install decorator attrs psutil absl-py cloudpickle ml-dtypes scipy tornado
3. 模型下载
# 下载模型权重
HF_ENDPOINT=https://hf-mirror.com python3 -c "
from huggingface_hub import snapshot_download
snapshot_download(repo_id='Aratako/Irodori-TTS-500M-v2', local_dir='./irodori-tts-model')
"
# 下载 DACVAE codec 权重
HF_ENDPOINT=https://hf-mirror.com python3 -c "
from huggingface_hub import snapshot_download
snapshot_download(repo_id='Aratako/Semantic-DACVAE-Japanese-32dim', local_dir='./semantic-dacvae-japanese-32dim')
"
4. 运行推理
python infer_npu.py \
--checkpoint ./irodori-tts-model/model.safetensors \
--text "こんにちは" \
--model-device npu \
--codec-device npu \
--codec-repo ./semantic-dacvae-japanese-32dim \
--no-ref \
--output-wav output.wav
性能评测
评测方法
- 评测脚本:
verify_npu.py
- 推理配置:
num_steps=40, no_ref=True, fp32
- 测试样本: 5 组不同长度日文文本( warm-up 1 次 + benchmark 5 次)
- 统计指标: 端到端耗时、sample_rf 耗时、decode_latent 耗时、RTF (Real-Time Factor)
RTF 说明: 实时因子 = 推理总耗时 / 生成音频时长。RTF < 1 表示生成速度快于实时播放。
性能数据
端到端推理耗时
| 指标 | 数值 |
|---|
| 平均耗时 | 6.83 s |
| 最短耗时 | 6.82 s |
| 最长耗时 | 6.84 s |
各阶段耗时拆解
| 阶段 | 平均耗时 | 最短 | 最长 | 说明 |
|---|
| tokenize_text | 0.70 ms | 0.62 ms | 0.77 ms | 文本分词 |
| prepare_reference | 0.21 ms | 0.20 ms | 0.22 ms | 参考音频准备 |
| sample_rf | 3.77 s | 3.75 s | 3.78 s | 扩散采样 (40 steps) |
| unpatchify_latent | 0.04 ms | 0.04 ms | 0.05 ms | latent 重组 |
| decode_latent | 3.06 s | 3.06 s | 3.07 s | DACVAE 解码 |
不同长度文本 RTF 表现
| 输入文本 | 生成音频时长 | 推理耗时 | RTF |
|---|
| こんにちは | 0.84 s | 6.83 s | 8.13 |
| ありがとう | 1.16 s | 6.84 s | 5.90 |
| さようなら | 2.40 s | 6.82 s | 2.84 |
| おはよう | 0.80 s | 6.84 s | 8.55 |
| こんばんは | 1.12 s | 6.82 s | 6.09 |
分析: 由于 RF-DiT 扩散模型固定执行 40 步采样,推理耗时与生成音频长度弱相关,主要瓶颈在于 decode_latent (DACVAE) 和 sample_rf (扩散采样)。对于较长音频(如 2.4s),RTF 可降至 2.84。
长文本 Warm-up 数据(3.04s 音频)
| 阶段 | 耗时 |
|---|
| tokenize_text | 1.98 ms |
| prepare_reference | 1.30 ms |
| sample_rf | 4.03 s |
| unpatchify_latent | 0.07 ms |
| decode_latent | 12.68 s |
| 端到端总计 | 16.71 s |
CPU vs NPU 性能对比
| 平台 | 推理时间 | 加速比 |
|---|
| CPU (x86, 4线程) | 897.6 s | 1× |
| NPU (Ascend 910B4) | 4.3 s | 207.9× |
分析:CPU 推理耗时约 15 分钟(主要是扩散 40 步采样),NPU 仅需 4.3 秒。加速比 ~208×,其中 sample_rf 阶段(3.69s)和 decode_latent 阶段(0.63s)均获得显著加速,展示了昇腾 NPU 在 Transformer 推理和 DACVAE 解码上的计算优势。
精度评测
TTS 模型的精度评估以主观听觉质量和端到端功能正确性为主要标准:
| 评测项 | 结果 | 说明 |
|---|
| 推理功能 | 通过 | 5/5 次推理全部成功,输出 WAV 文件正常播放 |
| 音频质量 | 正常 | 48 kHz 采样率,输出音频清晰、无杂音 |
| 音色一致性 | 正常 | 不同种子下音色稳定 |
| 文本对齐 | 正常 | 输入日文文本与输出语音内容一致 |
注:扩散模型含随机采样过程,相同 seed 在不同硬件上会产生不同的随机噪声,导致原始波形余弦相似度为 0。通过同一初始噪声注入 + fp32 统一精度策略,可进行有效的跨硬件一致性验证(见下方 CPU vs NPU 对比)。
CPU vs NPU 跨平台一致性验证
为了量化 CPU(x86)和 NPU(Ascend 910B4)上模型推理结果的一致性,采用感知特征指标替代原始波形数值比较:
| 验证方法 | 说明 |
|---|
| 同一初始噪声 | 在 CPU 上预生成初始噪声 (1, 750, 32),CPU 和 NPU 推理均注入该噪声,消除扩散初始条件差异 |
| 统一精度 | 两侧均使用 fp32 |
| 感知指标 | librosa Chromagram(音高内容)+ MFCC(音色/音素内容)余弦相似度 |
验证结果:
| 感知指标 | 数值 | 含义 |
|---|
| Chromagram 余弦相似度 | 0.9995 | 音高/旋律内容几乎完全一致 ✅ |
| MFCC 余弦相似度 | 1.0000 | 音色/音素内容完全一致 ✅ |
| 交叉相似度(对角) | 1.0000 | 时序结构完全对齐 ✅ |
辅助原始数值指标:
| 指标 | 数值 |
|---|
| MSE | 9.80e-10 |
| SNR | 71.72 dB |
| 最大绝对误差 | 8.24e-04 |
结论:Chromagram 0.9995、MFCC 1.0000、交叉相似度(对角)1.0 — CPU 和 NPU 的 TTS 输出在感知上高度一致。原始波形微小数值差异(MSE ~1e-9)来自硬件浮点运算累积误差,完全不影响听觉效果。
模型适配修改清单
| 修改文件 | 修改内容 | 适配原因 |
|---|
irodori_tts/inference_runtime.py | 扩展 npu 设备支持(resolve_runtime_device、_sync_device、unload、resolve_runtime_dtype) | torch_npu 设备注入 |
irodori_tts/codec.py | 默认设备改为 npu,支持本地目录路径自动拼接 weights.pth | NPU 优先 + 离线环境适配 |
irodori_tts/model.py | FlashAttention mask 形状从 (B,1,1,S) 扩展为 (B,1,Sq,Skv) | 昇腾 FlashAttentionScore 约束 |
infer_npu.py | 新增入口脚本,注入 transfer_to_npu | 自动迁移入口 |
verify_npu.py | 新增端到端验证脚本 | 环境/加载/功能/性能一体化验证 |
评测结论
| 评测维度 | 结论 |
|---|
| 环境兼容性 | 通过。torch_npu 2.9.0 + CANN 8.5.1 下 NPU 驱动、运行时正常。 |
| 模型加载 | 通过。494M 参数模型 + DACVAE Codec 均成功加载至 NPU。 |
| 功能正确性 | 通过。5/5 次端到端推理成功,音频输出正常。 |
| 性能表现 | 单卡 910B4 上端到端约 6.8s(1s 音频),RTF 约 6~8,满足离线合成场景需求。 |
| 精度表现 | 通过。主观听感正常,无异常噪声或失真。CPU/NPU 感知一致性验证 Chromagram 0.9995、MFCC 1.0000。 |
总体结论:Irodori-TTS-500M-v2 已完成昇腾 NPU 原生 PyTorch 适配,模型可在 Atlas 800 A2 (Ascend 910B4) 上稳定运行,功能、性能与精度指标均达到预期。CPU 对比验证进一步确认了~208× 加速比和感知高度一致的输出质量。
已知限制
torch.compile 在 NPU 上未测试,建议保持默认关闭。
bf16 理论上支持,但本次验证使用 fp32。
scaled_dot_product_attention 的 mask 形状限制是昇腾 NPU 特有约束,已在 model.py 中适配。
- 扩散模型含随机采样过程,相同 seed 在不同硬件上会产生不同随机噪声,导致原始波形对比不可靠。通过同一初始噪声注入策略可消除此差异,实现有效的跨硬件感知一致性验证。
- 当前 RTF 主要用于离线/异步 TTS 场景,实时场景建议进一步优化(如减少
num_steps 或使用推理加速)。
相关链接