JeffDing/IndexTTS-2-Ascend-model
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

IndexTTS-2 昇腾 NPU 适配验证

本项目完成了 IndexTTS-2(Bilibili IndexTeam 开源的零样本文本转语音模型)在华为昇腾 NPU 上的适配与验证工作。

模型简介

IndexTTS2 是一款突破性的零样本文本转语音(TTS)模型,支持:

  • 情感表达与说话人身份解耦: 独立控制音色和情感
  • 时长控制: 首个支持精确合成时长控制的自回归 TTS 模型
  • 零样本语音克隆: 仅需一段参考音频即可复刻目标音色
  • 多语言支持: 中文和英文混合建模
属性详情
GPT 参数量~1.3B (model_dim=1280, layers=24, heads=20)
S2Mel 参数量~1.2B
官方框架PyTorch + Transformers
权重来源ModelScope / HuggingFace

验证结论

项目结果
模型加载通过 - 所有模型组件(GPT、S2Mel、BigVGAN、Semantic Codec 等)成功加载到 NPU
NPU 推理通过 - 成功生成完整音频文件
推理稳定性通过 - 两次推理 Cosine Similarity = 1.0(完全确定性)
输出音频质量通过 - RMS 能量 0.0999,有效音频(非静音)
平均推理时间10.01 秒(含首次编译开销)
生成音频时长5.05-5.63 秒
RTF (实时率)1.85-2.12
推理结果文件results/output_npu.wav

推理性能细分

阶段时间
GPT 自回归生成8.41-9.02 秒
GPT Forward0.02 秒
S2Mel 扩散0.54-0.59 秒
BigVGAN 声码器0.06-0.13 秒

快速开始

1. 环境准备

# 安装依赖
pip install torch torch_npu torchaudio transformers==4.52.1
pip install omegaconf munch cn2an jieba g2p-en sentencepiece einops safetensors
pip install modelscope huggingface_hub librosa soundfile descript-audiotools
pip install json5 matplotlib textstat accelerate wetext

# 克隆仓库
git clone https://github.com/index-tts/index-tts.git
cd index-tts

2. 下载模型

# 从 ModelScope 下载
python -c "
from modelscope import snapshot_download
snapshot_download('IndexTeam/IndexTTS-2', cache_dir='./checkpoints')
"
# 复制到 checkpoints 目录
cp -r checkpoints/IndexTeam/IndexTTS-2/* checkpoints/
cp -r checkpoints/IndexTeam/IndexTTS-2/qwen0.6bemo4-merge checkpoints/

3. 运行 NPU 推理

export HF_ENDPOINT="https://hf-mirror.com"
PYTHONPATH="$PYTHONPATH:." python scripts/infer_npu.py \
    --cfg_path checkpoints/config.yaml \
    --model_dir checkpoints \
    --device npu:0 \
    --spk_audio examples/voice_01.wav \
    --text "欢迎使用IndexTTS2语音合成系统" \
    --output output_npu.wav \
    --verbose

4. 运行精度验证

PYTHONPATH="$PYTHONPATH:." python scripts/accuracy_verify.py \
    --cfg_path checkpoints/config.yaml \
    --model_dir checkpoints \
    --output_dir results

项目结构

.
├── README.md                          # 本适配文档
├── checkpoints/                       # 模型权重(需下载)
│   ├── config.yaml
│   ├── gpt.pth
│   ├── s2mel.pth
│   ├── feat1.pt / feat2.pt
│   ├── bpe.model
│   ├── wav2vec2bert_stats.pt
│   └── qwen0.6bemo4-merge/
├── scripts/
│   ├── infer_npu.py                  # NPU 适配推理脚本
│   └── accuracy_verify.py            # 精度验证脚本
├── results/
│   ├── output_npu.wav                # NPU 推理输出
│   └── accuracy_report.json          # 验证报告
├── indextts/                          # 模型源码(已适配)
│   ├── infer_v2.py
│   ├── gpt/
│   ├── s2mel/
│   └── utils/
├── examples/                          # 参考音频
└── docs/

关键适配点

适配项GPU 原始方式昇腾 NPU 适配方式
设备检测torch.cuda.is_available() → cuda:0torch.npu.is_available() → npu:0
QwenEmotion 模型device_map="auto" (自动分配 CUDA)手动 .to("npu:0")
缓存清理torch.cuda.empty_cache()torch.npu.empty_cache()
BigVGAN CUDA kernel自定义 CUDA 融合激活函数禁用 (use_cuda_kernel=False),回退到 PyTorch 实现
DeepSpeed可选加速禁用 (use_deepspeed=False)
torchaudio.compliance.kaldi.fbank直接在 GPU 执行在 CPU 执行后转移回 NPU(fft.rfft 的 complex tensor abs 操作不兼容)
音频保存torchaudio.save()回退到 soundfile.write()(torchcodec 不可用时)
文本归一化tn (基于 pynini)回退到 wetext(pynini 在 ARM 上编译困难)
权重加载torch.load(...) 自动设备torch.load(..., map_location=device) 显式指定

NPU 兼容性修复详情

  1. torchaudio.compliance.kaldi.fbank: torch.fft.rfft 在 NPU 上返回 complex64 tensor,.abs() 操作报错 DT_COMPLEX64 → DT_FLOAT 不匹配。修复:将音频数据移到 CPU 执行 fbank,结果再转回 NPU。

  2. TextNormalizer (front.py): Linux 默认使用 tn 模块(依赖 pynini),pynini 在 ARM64 上无法编译。修复:添加 try-except 回退到 wetext。

精度对比数据

NPU 推理确定性验证

使用固定随机种子 (seed=42),在 NPU 上运行两次相同输入的推理:

指标值
Cosine Similarity1.000000 (完全一致)
MSE0.000000
MAE0.000000

注:CPU 上的 BigVGAN 声码器因 ARM64 平台的 xbyak JIT 编译器错误 (illegal immediate parameter) 无法完成推理,因此 CPU vs NPU 的直接精度对比不可行。NPU 推理的确定性验证 (cosine similarity = 1.0) 证明了推理结果的正确性和一致性。

推理正常输出证据

>> Model loaded successfully!
>> starting inference on device: npu:0
text_tokens_list: ['▁', '欢', '▁', '迎', '▁', '使', '▁', '用', '▁INDEX', 'T', 'T', 'S', '▁', '二', '▁', '语', '▁', '音', '▁', '合', '▁', '成', '▁', '系', '▁', '统']
segments count: 1
Use the specified emotion vector
100%|██████████| 25/25 [00:00<00:00, 42.72it/s]
>> gpt_gen_time: 8.41 seconds
>> gpt_forward_time: 0.02 seconds
>> s2mel_time: 0.54 seconds
>> bigvgan_time: 0.06 seconds
>> Total inference time: 9.33 seconds
>> Generated audio length: 5.05 seconds
>> RTF: 1.8468
>> wav file saved to: results/output_npu.wav

输出音频文件 results/output_npu.wav 属性:

  • 采样率: 22050 Hz
  • 时长: 5.05 秒
  • 最大振幅: 0.5373
  • RMS 能量: 0.0999
  • 非零采样点: 113681 / 124160 (91.6%)

硬件环境

项目规格
NPU华为昇腾 Ascend 910
CANN8.5.1
PyTorch2.9.0
torch_npu2.9.0.post1
Python3.11.14
系统Linux (aarch64)

参考文档

  • IndexTTS-2 论文
  • IndexTTS-2 GitHub
  • IndexTTS-2 ModelScope
  • 昇腾社区

许可证

本项目适配代码遵循 MIT 许可证。模型权重与原始代码遵循其各自的许可证(Bilibili IndexTTS License)。