本文档记录 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") 完成设备迁移,无需修改模型源码。
相关获取地址:
参考文档:
| 组件 | 版本 |
|---|---|
transformers | >=4.36.0 |
torch | >=2.0 |
torch-npu | matching CANN 8.5.1 |
modelscope | latest |
librosa | latest |
scipy | latest |
Ascend910Bmodels/facebook_mms-tts-nan(本地缓存)或 ModelScope 自动下载安装依赖:
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输入文本(assets/test.txt):
hello worldNPU 推理结果:
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输出音频有效:
TrueTrueTrue测试条件:连续 10 次推理(含 3 次 warmup),输入文本长度固定。
| 指标 | 数值 |
|---|---|
avg_latency_ms | 36.1262 |
min_latency_ms | 33.2260 |
max_latency_ms | 38.8080 |
p50_latency_ms | 36.3022 |
p90_latency_ms | 38.7892 |
p95_latency_ms | 38.7986 |
audio_duration_sec | 0.6400 |
real_time_factor | 0.0564 |
num_runs | 10 |
由于 VITS 模型启用了随机时长预测器(use_stochastic_duration_prediction=true),CPU 与 NPU 的最终波形长度可能不同,直接对比 Mel 谱图会产生较大误差。因此精度验证以**确定性中间层(text_encoder 输出)**为权威标准,Mel 谱图对比仅作参考。
| 指标 | 数值 | 阈值 | 结果 |
|---|---|---|---|
hidden_states_relative_error | 0.0249% | < 1.0% | PASS |
hidden_states_cosine_sim | 1.000000 | > 0.99 | PASS |
prior_means_relative_error | 0.0244% | < 1.0% | PASS |
mel_relative_error | 10.2614% | < 5.0% | FAIL (参考) |
mel_cosine_sim | 0.990670 | > 0.95 | PASS (参考) |
npu_is_silent | False | must be False | PASS |
npu_has_nan | False | must be False | PASS |
npu_has_inf | False | must be False | PASS |
| Final Result | — | — | PASS |
判定结论:text_encoder 确定性层误差 < 1%,NPU 输出音频有效,适配成功。
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 作为确定性精度对比指标本适配通过 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")