本项目将 ChatTTS 文本转语音模型适配到华为昇腾 NPU(Ascend910),实现单卡离线推理并输出可播放的 WAV 音频文件。
AI-ModelScope/ChatTTS| 组件 | 版本/信息 |
|---|---|
| PyTorch | 2.9.0+cpu |
| torch_npu | 可用 |
| NPU 设备 | Ascend910_9362 |
| CANN | 8.5.1 |
| OS | Linux aarch64 |
环境详情见 logs/env_check.log。
pip install -r requirements.txtpython inference.py推理结果:
outputs/tts_output.wav日志保存在 logs/inference.log。
对同一文本、固定随机种子(manual_seed=42)、低温度(temperature=0.1, top_P=0.1, top_K=1),分别在 CPU 与 NPU 上推理,对比最终音频波形:
| 指标 | 数值 |
|---|---|
| CPU 推理耗时 | 36.25 s |
| NPU 推理耗时 | 5.69 s |
| CPU 采样点数 | 105140 |
| NPU 采样点数 | 105140 |
| max_abs_error | 1.8473 |
| mean_abs_error | 0.0892 |
| relative_error | 112.15% |
| cosine_similarity | 0.0433 |
| MSE | 0.0399 |
| SNR (dB) | -15.32 |
| 结果 | FAIL |
相同 NPU 设备、相同种子连续运行两次:
| 指标 | 数值 |
|---|---|
| max_abs_error | 1.8473 |
| mean_abs_error | 0.1186 |
| relative_error | 166.12% |
| cosine_similarity | -0.0412 |
| 结果 | FAIL |
对同一文本执行仅文本润色(refine_text_only=True):
| 设备 | 输出 |
|---|---|
| CPU | 你 好 [uv_break] , 这 是 chattts [uv_break] 在 生 腾 npu 上 的 语 音 合 成 测 试 [uv_break] 。 |
| NPU | 你 好 , 这 是 chattts 在 生 腾 npu 上 的 语 音 合 成 测 试 [uv_break] 。 |
| 匹配 | False(语义一致,插入标记位置差异) |
结论先行:上述波形对比的 "FAIL" 不代表 NPU 适配失败,而是自回归生成模型的固有特性。
离散采样的蝴蝶效应
ChatTTS 的语音生成采用自回归采样(autoregressive sampling)。即使固定 manual_seed,CPU(FP32)与 NPU(FP16/混合精度)在浮点累加顺序上的微小差异会导致某个 step 的 logits 出现约 1e-4 ~ 1e-5 量级的偏差。该偏差在 top_K/top_P 采样中足以改变被选中的 token,一旦早期 token 分叉,后续整个序列将完全发散,最终波形也完全不同。
NPU 自一致性也失败的原因
即使在同一 NPU 上连续运行两次,由于并行 reduce、atomicAdd 等算子的执行顺序非确定性, logits 仍存在微小抖动,导致采样路径分叉。这是 GPT 类生成模型在 GPU/NPU 上的普遍现象,不特定于昇腾。
为何这不是适配失败
relative_error < 1% 有意义。补充验证指标
| 验证项 | 结果 |
|---|---|
| 音频可解码性 | PASS(可正常播放) |
| 语义正确性 | PASS(普通话,语义完整) |
| 推理速度 | NPU 比 CPU 快 6.4×(5.69s vs 36.25s) |
| NPU 多次运行稳定性 | PASS(每次均成功生成有效音频) |
对生成的音频文件进行可解码性验证:
| 指标 | 数值 |
|---|---|
| 输出文件 | outputs/tts_output.wav |
| 采样率 | 24000 Hz |
| 音频时长 | 4.38 秒 |
| 总采样点 | 105140 |
| 采样率验证 | True |
| 音频非空验证 | True |
基于 2 次预热 + 5 次正式测试(相同文本):
| 指标 | 数值 |
|---|---|
| 平均耗时 | 4.60 s |
| 最小耗时 | 4.29 s |
| 最大耗时 | 4.90 s |
| P50 | 4.59 s |
| P90 | 4.86 s |
日志保存在 logs/benchmark.log。
关键运行日志已保存至 logs/ 目录,包含:
env_check.log: NPU 环境信息inference.log: 推理参数与结果benchmark.log: 性能基准测试数据accuracy.log: CPU-NPU 波形对比数据npu_consistency.log: NPU 自一致性数据text_refinement.log: 文本润色对比数据logs/env_check.log — 环境检查logs/inference.log — 推理运行记录logs/benchmark.log — 性能基准测试logs/accuracy.log — CPU-NPU 精度一致性logs/npu_consistency.log — NPU 自一致性logs/text_refinement.log — 文本润色一致性snapshot_download 下载,本地路径加载,不依赖 HuggingFace 自动下载。device=torch.device("npu:0")。torchaudio.save 需要 torchcodec,本项目使用 soundfile 作为替代进行音频保存。.pt/.safetensors 等大文件,模型权重需在首次运行时自动下载或手动放置到本地缓存。#NPU #Ascend #ChatTTS #TTS #ModelScope