本项目完成了 IndexTTS-2(Bilibili IndexTeam 开源的零样本文本转语音模型)在华为昇腾 NPU 上的适配与验证工作。
IndexTTS2 是一款突破性的零样本文本转语音(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 Forward | 0.02 秒 |
| S2Mel 扩散 | 0.54-0.59 秒 |
| BigVGAN 声码器 | 0.06-0.13 秒 |
# 安装依赖
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# 从 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/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 \
--verbosePYTHONPATH="$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:0 | torch.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) 显式指定 |
torchaudio.compliance.kaldi.fbank: torch.fft.rfft 在 NPU 上返回 complex64 tensor,.abs() 操作报错 DT_COMPLEX64 → DT_FLOAT 不匹配。修复:将音频数据移到 CPU 执行 fbank,结果再转回 NPU。
TextNormalizer (front.py): Linux 默认使用 tn 模块(依赖 pynini),pynini 在 ARM64 上无法编译。修复:添加 try-except 回退到 wetext。
使用固定随机种子 (seed=42),在 NPU 上运行两次相同输入的推理:
| 指标 | 值 |
|---|---|
| Cosine Similarity | 1.000000 (完全一致) |
| MSE | 0.000000 |
| MAE | 0.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 属性:
| 项目 | 规格 |
|---|---|
| NPU | 华为昇腾 Ascend 910 |
| CANN | 8.5.1 |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| Python | 3.11.14 |
| 系统 | Linux (aarch64) |
本项目适配代码遵循 MIT 许可证。模型权重与原始代码遵循其各自的许可证(Bilibili IndexTTS License)。