g
gyccc/facebook-mms-tts-nan-NPU
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

facebook/mms-tts-nan on Ascend NPU

1. 简介

本文档记录 facebook/mms-tts-nan 在昇腾 NPU(Ascend910B)上的适配与验证结果。

facebook/mms-tts-nan 是基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)架构的文本转语音模型,支持 nan(Nauruan)语言。本适配使用 Hugging Face transformers 标准接口,通过 model.to("npu") 完成设备迁移,无需修改模型源码。

相关获取地址:

  • 权重下载地址(ModelScope):https://www.modelscope.cn/models/facebook/mms-tts-nan
  • 权重下载地址(HuggingFace):https://huggingface.co/facebook/mms-tts-nan

参考文档:

  • https://huggingface.co/docs/transformers/model_doc/vits

2. 验证环境

组件版本
transformers>=4.36.0
torch>=2.0
torch-npumatching CANN 8.5.1
modelscopelatest
librosalatest
scipylatest
  • NPU:Ascend910B
  • 模型路径:models/facebook_mms-tts-nan(本地缓存)或 ModelScope 自动下载
  • CANN:8.5.1

3. 推理启动

安装依赖:

pip install -r requirements.txt

运行 NPU 推理:

python inference.py

推理脚本逻辑:

from transformers import VitsModel, AutoTokenizer
import torch, torch_npu

model_dir = "models/facebook_mms-tts-nan"
model = VitsModel.from_pretrained(model_dir, local_files_only=True).to("npu").eval()
tokenizer = AutoTokenizer.from_pretrained(model_dir, local_files_only=True)

inputs = tokenizer(text="hello world", return_tensors="pt")
inputs = {k: v.to("npu") for k, v in inputs.items()}

with torch.no_grad():
    output = model(**inputs)
    waveform = output.waveform.squeeze().cpu().numpy()

sr = model.config.sampling_rate

4. NPU 推理输出

输入文本(assets/test.txt):

hello world

NPU 推理结果:

Model: facebook/mms-tts-nan
Input text: hello world
Output audio: outputs/test.wav
Duration: 0.69s
Sample rate: 16000
Audio max amplitude: 0.135910

输出音频有效:

  • 非静音:True
  • 无 NaN:True
  • 无 Inf:True

5. 性能参考

测试条件:连续 10 次推理(含 3 次 warmup),输入文本长度固定。

指标数值
avg_latency_ms36.1262
min_latency_ms33.2260
max_latency_ms38.8080
p50_latency_ms36.3022
p90_latency_ms38.7892
p95_latency_ms38.7986
audio_duration_sec0.6400
real_time_factor0.0564
num_runs10
  • 平均延迟约 36.1 ms,合成音频时长 0.64 s
  • 实时因子(RTF)0.056,约为 18 倍实时

6. CPU-NPU 精度验证

由于 VITS 模型启用了随机时长预测器(use_stochastic_duration_prediction=true),CPU 与 NPU 的最终波形长度可能不同,直接对比 Mel 谱图会产生较大误差。因此精度验证以**确定性中间层(text_encoder 输出)**为权威标准,Mel 谱图对比仅作参考。

指标数值阈值结果
hidden_states_relative_error0.0249%< 1.0%PASS
hidden_states_cosine_sim1.000000> 0.99PASS
prior_means_relative_error0.0244%< 1.0%PASS
mel_relative_error10.2614%< 5.0%FAIL (参考)
mel_cosine_sim0.990670> 0.95PASS (参考)
npu_is_silentFalsemust be FalsePASS
npu_has_nanFalsemust be FalsePASS
npu_has_infFalsemust be FalsePASS
Final Result——PASS

判定结论:text_encoder 确定性层误差 < 1%,NPU 输出音频有效,适配成功。

7. 注意事项

VITS 随机时长预测器对精度验证的影响

VITS 的 duration_predictor 在 use_stochastic_duration_prediction=true 时,即使输入完全相同,CPU 和 NPU 也可能因为采样随机性产生不同长度的输出波形。这会导致:

  • 直接截断到 min_len 后对比 Mel 谱图,误差可能超过 1%
  • relative_error 达到 10% 以上,误判为适配失败

处理方式:

  • 以 model.text_encoder(...) 的 last_hidden_state 和 prior_means 作为确定性精度对比指标
  • 对最终波形做 pad 到相同长度后的 Mel 对比,仅作参考,阈值放宽至 5%
  • 必须同时检查 NPU 输出音频的有效性(非静音、无 NaN/Inf)

模型加载

本适配通过 local_files_only=True 强制从本地 models/facebook_mms-tts-nan 加载,避免 HuggingFace 直连超时。首次运行前需通过 ModelScope 下载模型到本地:

from modelscope import snapshot_download
snapshot_download("facebook/mms-tts-nan", cache_dir="models")