F5-TTS 是基于 Flow Matching (CFM) 的文本转语音(TTS)模型,支持中英文语音合成与零样本声音克隆。模型架构采用 DiT (Diffusion Transformer) 骨干网络 + Vocos 声码器。
本仓库提供 F5-TTS Emilia-ZH-EN 在**华为昇腾 NPU(Ascend910)**上的适配推理方案及评测报告。
| 属性 | 说明 |
|---|---|
| 模型名称 | SWivid/F5-TTS_Emilia-ZH-EN (F5TTS_v1_Base) |
| 任务类型 | 文本到语音(Text-to-Speech, TTS) |
| 架构 | DiT Backbone + Flow Matching (CFM) + Vocos Vocoder |
| 参数量 | ~330M |
| 支持语言 | 中文 (zh) + 英文 (en) |
| 采样率 | 24000 Hz |
| 特色能力 | Zero-shot 语音克隆, 中英混合合成 |
| 适配硬件 | Ascend910_9362 |
| 精度模式 | float16 (推理) |
| 适配状态 | ✅ 已验证 |
| 上游仓库 | SWivid/F5-TTS |
| 模型下载 | ModelScope |
| 组件 | 版本 / 型号 |
|---|---|
| NPU | Ascend910_9362 × 2 (64GB HBM) |
| CANN | 25.5.2 |
| torch | 2.9.0+cpu |
| torch_npu | 2.9.0.post1+gitee7ba04 |
| f5-tts | 1.1.20 |
| Python | 3.11.14 |
| OS | Linux (ARM64) |
# 验证 NPU 可用性
python -c "import torch; import torch_npu; print(torch.npu.device_count())"
# 输出: 2
# 验证 NPU 型号
python -c "import torch; print(torch.npu.get_device_name(0))"
# 输出: Ascend910_9362pip install f5-tts safetensors omegaconf soundfile torch_npu# 从 ModelScope 下载
pip install modelscope
modelscope download --model SWivid/F5-TTS_Emilia-ZH-EN --local_dir ./ckpts/F5TTS_v1_Base模型文件清单:
| 文件 | 大小 | 用途 |
|---|---|---|
model_1250000.safetensors | ~630MB | DiT 模型权重 |
vocab.txt | ~4KB | 词表文件 |
configuration.json | ~1KB | 模型配置 |
# 基本推理命令
python inference.py \
--ref_audio /path/to/reference.wav \
--ref_text "参考音频对应的文本内容。" \
--gen_text "这是要在昇腾NPU上生成的语音合成文本。" \
--output output.wav
# 完整参数示例
python inference.py \
--ref_audio /opt/atomgit/pretrained_models/CosyVoice-300M/asset/zero_shot_prompt.wav \
--ref_text "希望你以后能够做的比我还好呦。" \
--gen_text "在当今快速发展的科技时代,人工智能正在深刻改变着我们的生活方式。" \
--output output.wav \
--nfe_step 32 \
--cfg_strength 2.0 \
--speed 1.0from inference import patch_mel_spec_for_npu, patch_vocoder_for_npu, load_model_npu
from f5_tts.infer.utils_infer import load_vocoder
import soundfile as sf
# 加载模型
model = load_model_npu(
ckpt_path="ckpts/F5TTS_v1_Base/model_1250000.safetensors",
vocab_file="ckpts/F5TTS_v1_Base/vocab.txt",
device="npu:0",
)
vocoder = load_vocoder(vocoder_name="vocos", is_local=False, local_path="", device="npu:0")
patch_vocoder_for_npu(vocoder)
# 推理... (参考 inference.py 中的 infer_on_npu 函数)测试条件:Ascend910_9362 × 1 卡,float16 精度,nfe_step=32,cfg_strength=2.0。
| 文本类型 | 文本长度 | 推理延迟 (s) | 生成音频时长 (s) | RTF ↓ | 实时率 (x) ↑ |
|---|---|---|---|---|---|
| 短文本 | 7 字符 | 1.212 ± 0.018 | 1.86 | 0.653 | 1.53x |
| 中文本 | 33 字符 | 1.393 ± 0.017 | 8.81 | 0.158 | 6.33x |
| 长文本 | 81 字符 | 1.994 ± 0.048 | 21.29 | 0.094 | 10.67x |
| 指标 | 数值 |
|---|---|
| 模型加载时间 | ~10-15s (含 Vocos 下载缓存) |
| HBM 占用 (推理) | ~5.2 GB |
| HBM 占用 (峰值) | ~8.2 GB |
| 模型参数量 | ~330M |
采用 NPU float16 vs float32 对比评测方法:
由于 F5-TTS 基于 Flow Matching (CFM) 确定性采样,在相同随机种子和输入下,不同精度的输出应当高度一致。
| 测试用例 | Mel 余弦相似度 | F16 音频有效性 |
|---|---|---|
| 中文短文本 | 0.9649 | ✅ 通过 |
| 英文短文本 | 0.9814 | ✅ 通过 |
| 指标 | 中文短文本 | 英文短文本 |
|---|---|---|
| Mel 余弦相似度 | 0.9649 | 0.9814 |
| F16 推理时间 | 1.539s | 1.367s |
| F32 推理时间 | 2.160s | 1.875s |
| f16/f32 加速比 | 1.40x | 1.37x |
| 测试项 | 结果 |
|---|---|
| Mel 余弦相似度 > 0.95 (中英均值 0.973) | ✅ PASS |
| F16 音频无 NaN/Inf | ✅ PASS |
| F16 音频非静音 | ✅ PASS |
| 总体通过 | ✅ PASS |
说明:F5-TTS 为 DiT 扩散生成模型,float16 vs float32 的 Mel 余弦相似度 0.96-0.98 属于优异的 TTS 生成精度。f16 推理速度较 f32 提升约 1.4x。
本适配针对 Ascend NPU 架构特点进行了以下关键修改:
| 问题 | 原因 | 解决方案 |
|---|---|---|
| torchaudio 不可用 | torchaudio 2.9.0 依赖 torchcodec / libnvrtc.so (CUDA 库) | 全部音频 I/O 改用 soundfile;重采样改用 scipy.signal.resample |
| NPU STFT float16 不支持 | aclnnStft 不支持 DT_FLOAT16 | Mel 频谱计算移至 CPU 执行 (patch_mel_spec_for_npu) |
| NPU STFT abs 失败 | float32 STFT 返回 complex64,.abs() 触发 aclnnAbs dtype 不匹配 (expected DT_FLOAT, got DT_COMPLEX64) | Mel 频谱整体在 CPU 执行 |
| NPU ISTFT UnfoldGrad 错误 | aclnnUnfoldGrad 不支持非连续输入,Vocos vocoder 的 torch.istft 触发此 bug | Vocoder ISTFT 模块移至 CPU 执行 (patch_vocoder_for_npu) |
| wandb 未安装 | f5-tts 代码中无条件 import wandb | 在导入 f5_tts 前注入 mock wandb 模块 |
def patch_mel_spec_for_npu(model):
"""将 MelSpec 计算移至 CPU 执行,规避 NPU stft 系列算子问题。"""
original_forward = model.mel_spec.forward
dummy = torch.randn(1, 1200).float()
try:
original_forward(dummy) # 预热 CPU 缓存
except Exception:
pass
def patched_forward(wav):
orig_device, orig_dtype = wav.device, wav.dtype
wav_cpu = wav.detach().cpu().float()
mel_cpu = original_forward(wav_cpu)
return mel_cpu.to(device=orig_device, dtype=orig_dtype)
model.mel_spec.forward = patched_forwarddef patch_vocoder_for_npu(vocoder):
"""将 Vocos ISTFT 移至 CPU 执行,规避 aclnnUnfoldGrad bug。"""
try:
istft_module = vocoder.head.istft
except AttributeError:
return
istft_module.to("cpu")
original_forward = istft_module.forward
def patched_forward(spec):
spec_cpu = spec.detach().cpu() # 保持 complex dtype
result = original_forward(spec_cpu)
return result.to(device=spec.device)
istft_module.forward = patched_forwarddef load_audio(path, target_sr=None):
"""使用 soundfile 加载音频(替代 torchaudio.load)。"""
data, sr = sf.read(path)
if data.ndim == 1:
data = data.reshape(1, -1)
audio = torch.from_numpy(data.astype(np.float32))
if target_sr is not None and sr != target_sr:
from scipy import signal
new_len = int(audio.shape[-1] * target_sr / sr)
audio = torch.from_numpy(signal.resample(audio.numpy(), new_len, axis=-1).astype(np.float32))
return audio, (target_sr or sr)# 完整评测(精度 + 性能)
python evaluate_npu.py \
--ckpt_path ckpts/F5TTS_v1_Base/model_1250000.safetensors \
--ref_audio /path/to/real_reference_speech.wav \
--output_dir ./eval_results \
--warmup 2 \
--benchmark 5
# 仅性能评测
python evaluate_npu.py --skip_accuracy --warmup 2 --benchmark 5
# 仅精度评测
python evaluate_npu.py --skip_performance
# 查看评测报告
cat eval_results/evaluation_report.json--ref_text 必须与参考音频的实际内容一致,这是 F5-TTS zero-shot 克隆的关键| 交付件 | 说明 | 路径 |
|---|---|---|
inference.py | NPU 适配推理脚本 | inference.py |
evaluate_npu.py | 精度/性能评测脚本 | evaluate_npu.py |
eval_results/evaluation_report.json | 评测结果报告 | evaluation_report.json |
eval_results/f16_sample_*.wav | NPU 生成的音频样本 | eval_results/ |
README.md | 本文档 (部署指南) | README.md |
#+NPU #+Ascend910
本适配方案由 Claude Code (Model Agent) 自动生成并验证,2026-05-14
@misc{f5tts,
title={F5-TTS: A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching},
author={Yushen Chen and Zhikang Niu and et al.},
year={2024},
}