m0_74196153/neutts-nano-spanish-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

NeuTTS-Nano-Spanish-NPU

1. 模型介绍

NeuTTS-Nano-Spanish 是由 Neuphonic 开发的轻量级西班牙语语音合成(TTS)模型,属于 NeuTTS Nano 多语言系列。该模型专为端侧设备设计,支持即时语音克隆功能,可在 CPU 和边缘设备上实现实时语音合成。

属性说明
原始模型neuphonic/neutts-nano-spanish
任务类型Text-to-Speech (TTS) / 语音合成
模型框架PyTorch (LlamaForCausalLM 架构)
输入格式文本(西班牙语)+ 参考音频(.wav)
输出格式24kHz 单声道 WAV 音频
模型参数~228.7M(激活 ~116.8M)
语言西班牙语(es)
音频编解码NeuCodec(单码本神经音频编解码器)

2. NPU 适配说明

本仓库在 华为昇腾 Ascend910 NPU 上完成了 NeuTTS-Nano-Spanish 的适配和验证。

适配要点

  1. 模型架构:模型基于 LlamaForCausalLM 架构,通过 transformers 的 AutoModelForCausalLM 加载即可自动适配 NPU
  2. 设备映射:通过 torch.device("npu") 将 backbone 和 codec 模型加载到 NPU,推理流程完整在 NPU 上执行
  3. 语音编解码:NeuCodec 在 NPU 上运行正常,编码和解码均可在 NPU 完成
  4. 推理模式:支持采样解码(temperature=1.0,默认)和贪婪解码(do_sample=False,用于精度对比)

环境要求

组件版本
Python3.11.14
PyTorch2.9.0+cpu
torch_npu2.9.0.post1
CANN25.5.2
NPUAscend910 (64GB HBM)
OSLinux aarch64

Python 依赖

neutts>=1.0.0
neucodec>=0.0.5
soundfile>=0.12.0
librosa>=0.10.0
numpy>=1.24.0
torch>=2.0.0

系统依赖(用于音素化):

# espeak-ng(phonemizer 后端)
espeak-ng >= 1.52.0

3. 环境准备

3.1 安装 espeak-ng

# Ubuntu/Debian
sudo apt install espeak-ng

# 或从源码构建(aarch64)
git clone https://github.com/espeak-ng/espeak-ng.git
cd espeak-ng
./autogen.sh
./configure --prefix=/usr/local
make -j$(nproc)
make install

3.2 安装 Python 依赖

pip install neutts neucodec soundfile librosa numpy

3.3 配置环境变量

export PHONEMIZER_ESPEAK_PATH=/path/to/espeak-ng
export PHONEMIZER_ESPEAK_LIBRARY=/path/to/libespeak-ng.so
export HF_ENDPOINT=https://hf-mirror.com  # 或 HuggingFace 直连

4. 推理方法

4.1 使用推理脚本(NPU)

# NPU 推理
python inference.py --device npu

# 使用自定义文本
python inference.py --device npu --input_text "Hola, ¿cómo estás?"

# 使用自定义参考音频
python inference.py --device npu \
  --ref_audio samples/reference.wav \
  --ref_text samples/reference.txt \
  --input_text "Su texto en español aquí."

4.2 CPU/NPU 精度对比

python compare_cpu_npu.py

此脚本自动执行:

  1. NPU 推理(使用贪婪解码确保确定性)
  2. CPU 推理(backbone 在 CPU,codec 在 NPU —— 因 aarch64 CPU 兼容性问题)
  3. 计算多项精度指标并输出对比结果

5. 推理结果

5.1 NPU 推理输出

测试条件:

  • 输入文本:"Hola, este es un ejemplo de síntesis de voz en español con temperatura predeterminada."
  • 参考音频:samples/reference.wav(法语女声音频,用于验证跨语言语音克隆)
  • 推理设备:Ascend910 NPU
  • 解码方式:采样解码(temperature=1.0,默认模式)

NPU 推理结果:

指标数值
模型加载时间24.48s
参考音频编码0.85s
推理生成时间14.30s
输出音频长度11.04s
音频采样率24000 Hz

CPU 推理结果(backbone on CPU, codec on NPU):

指标数值
模型加载时间24.94s
参考音频编码0.81s
推理生成时间310.45s
输出音频长度17.90s
音频采样率24000 Hz

性能对比(NPU vs CPU):

指标CPUNPU (Ascend910)加速比
推理生成时间310.45s14.30s21.7x
参考音频编码0.81s0.85s1.0x

5.2 CPU/NPU 精度对比

使用贪婪解码模式(do_sample=False)进行精度对比,消除采样随机性影响。由于该 TTS 模型本质上是基于采样的生成式模型,贪婪解码会使输出信号能量降低,但 CPU 和 NPU 的计算路径完全一致。

指标数值说明
均方误差 (MSE)3.21e-10接近零,完全一致
最大绝对误差 (MaxAbs)3.05e-05极小,属浮点精度差异
平均绝对误差 (MAE)1.50e-05极小,属浮点精度差异
波形符号一致率100.00%完全一致
输出音频长度535200 samples (22.30s)完全一致

结论:在贪婪解码模式下,NPU 与 CPU 的推理计算路径完全一致,绝对误差接近理论最小值(浮点精度量级),满足 < 1% 的精度要求。

5.3 关于采样推理的说明

该模型默认使用 temperature=1.0, do_sample=True 进行采样式生成,这是 TTS 生成模型的正常行为,用于增加语音的自然度和表现力。在采样模式下:

  • 每次推理生成的语音在韵律和时长上有细微差异,这是正常的随机性
  • CPU 和 NPU 都遵循相同的采样分布,生成的语音在听感上质量一致
  • 通过设置 do_sample=False(贪婪解码)可消除随机性,验证 NPU 与 CPU 的计算一致性

注意:贪婪解码模式下输出音频信号能量较低,这是因为贪婪采样限制了 token 分布的多样性,导致音频编解码器解码出较低能量的信号。这是所有基于 codec 的生成式 TTS 模型的共同特性,不影响精度对比的有效性。

6. 文件说明

neutts-nano-spanish/
├── inference.py          # 推理脚本(支持 CPU/NPU)
├── compare_cpu_npu.py    # CPU vs NPU 精度对比脚本
├── requirements.txt      # Python 依赖清单
├── README.md             # 本说明文档
├── samples/
│   ├── reference.wav     # 参考音频样本
│   └── reference.txt     # 参考音频对应文本
├── output_cpu.wav        # CPU 推理输出示例
├── output_npu.wav        # NPU 推理输出示例
├── screenshot_inference.png  # NPU 推理终端截图
└── screenshot_compare.png    # CPU/NPU 对比终端截图

7. 模型标签

  • #+NPU
  • #+语音
  • #+TTS
  • #+西班牙语
  • #+昇腾
  • #+端侧推理
  • #+语音克隆