本文档记录 fishaudio/openaudio-s1-mini 在华为昇腾 NPU(Ascend910)上的完整适配与验证结果。OpenAudio S1-mini 是 FishAudio 发布的开源文本转语音(TTS)模型,基于 DualAR Transformer 架构,支持 13 种语言,具备情感和语调控制能力。
| 属性 | 值 |
|---|---|
| 模型名称 | OpenAudio S1-mini |
| 参数量 | 1.17B (DualAR 860M + DAC 315M) |
| 架构 | DualAR Transformer (28L Slow + 4L Fast) + DAC RVQ Codec |
| 隐藏维度 | 1024 (Slow/Fast) |
| 注意力头 | 16Q / 8KV (GQA, Slow) ; 16Q / 8KV (GQA, Fast) |
| VQ 码本 | 10 codebooks (1语义 + 9声学), 每个 1024-dim |
| 采样率 | 44100 Hz |
| 最大序列长度 | 8192 tokens |
| 支持语言 | 中文、英语、日语、德语、法语、西班牙语、韩语、阿拉伯语、俄语、荷兰语、意大利语、波兰语、葡萄牙语 |
| 精度 | BF16 (推理) / FP32 (精度验证) |
| 框架 | PyTorch 2.9 + torch_npu + fish_speech |
| 硬件要求 | Ascend910 NPU (≥16GB HBM) |
| 原始模型 | fishaudio/openaudio-s1-mini |
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.9.0 |
torch_npu | 2.9.0.post1 |
fish_speech | ≥ 1.10.0 |
safetensors | ≥ 0.4 |
soundfile | ≥ 0.12 |
numpy | ≥ 1.24 |
loguru | ≥ 0.7 |
Python | 3.11 |
1 卡 Ascend910 (64GB HBM)/opt/atomgit/.cache/modelscope/hub/models/fishaudio/openaudio-s1-minimodel.pth (1.7GB) + codec.pth (1.9GB)# 安装依赖
pip install torch_npu fish_speech soundfile numpy loguru
# 设置环境变量(可选)
export FISH_SPEECH_MODEL_PATH=/path/to/openaudio-s1-minipip install modelscope
modelscope download --model fishaudio/openaudio-s1-mini# 中文 TTS
python inference.py --text "你好,欢迎使用华为昇腾NPU进行语音合成测试。" --output output.wav
# 英文 TTS
python inference.py --text "Hello, this is a test of the NPU text-to-speech system." --output output_en.wav
# 带情感标记的 TTS
python inference.py --text "(excited)今天天气真好啊!" --output output_emo.wav
# 仅 NPU 推理(跳过 CPU 对比验证,速度更快)
python inference.py --text "你好,世界。" --output output.wav --no-verify
# 带随机种子控制
python inference.py --text "Hello world." --seed 42 --temperature 0.8 --top-p 0.8OpenAudio S1-mini 支持丰富的情感、语调和特殊标记:
情感标记(部分):(angry) (sad) (excited) (surprised) (satisfied) (anxious) (delighted) (scared) (worried) (joyful) (confident) (curious) (confused) (grateful) (relaxed) 等 50+ 种
语调标记:(in a hurry tone) (shouting) (screaming) (whispering) (soft tone)
特殊标记:(laughing) (chuckling) (sobbing) (crying loudly) (sighing) (panting) (groaning)
基础功能检查:
# 检查 NPU 可用性
python3 -c "import torch_npu; print(torch_npu.npu.device_count(), torch_npu.npu.get_device_name(0))"
# 中文短文本 TTS
python inference.py --text "你好。" --output /tmp/test_short.wav --no-verify
# 中文中长文本 TTS
python inference.py --text "你好,欢迎使用华为昇腾NPU进行语音合成测试。" --output /tmp/test_medium.wav --no-verify
# 长文本 TTS
python inference.py --text "人工智能技术正在深刻改变着我们的生活方式,从语音识别到自然语言处理,从计算机视觉到自动驾驶,AI的应用无处不在。" --output /tmp/test_long.wav --no-verify验证结果:
测试条件:单卡 Ascend910 (64GB HBM)、BF16 精度、2 次预热后计时。
运行命令:
python evaluate.py --mode perf完整性能数据:
| 文本 | 类型 | 文本Token | 生成VQToken | 音频时长 | 推理耗时 | DAC耗时 | 总耗时 | RTF |
|---|---|---|---|---|---|---|---|---|
| "你好。" | Short | 10 | 16 | 0.70s | 2.41s | 0.130s | 2.54s | 3.65 |
| "你好,欢迎使用华为昇腾NPU进行语音合成测试。" | Medium | 22 | 83 | 3.81s | 12.49s | 0.047s | 12.54s | 3.29 |
| "人工智能技术正在深刻改变..." | Long | 37 | 209 | 9.66s | 31.34s | 0.098s | 31.44s | 3.25 |
性能汇总:
| 指标 | 数值 |
|---|---|
| 平均 RTF | 3.40(AR 生成模型典型值) |
| 平均 Token 生成速率 | 6.6 tok/s (DualAR) |
| DAC 解码速度 | < 0.13s(接近实时解码) |
| DAC NPU vs CPU 加速比 | 15.6x |
| 模型加载时间 | ~22s (DualAR 18s + DAC 4s) |
| 硬件 | Ascend910 (64GB HBM) |
| 推理精度 | BF16 |
RTF 说明:OpenAudio S1-mini 采用逐 token 自回归生成方式(DualAR),每生成一个 VQ token 需经过 28 层 Slow AR + 4 层 Fast AR 前向传播。RTF ≈ 3.4 意味着生成 1 秒音频需约 3.4 秒推理时间。DAC 解码器部分接近实时(RTF ≈ 0.005)。整体性能受限于自回归生成模式,这在 AR-based TTS 模型中属于正常范围。CPU 上相同推理需数分钟(估计 30-50x 以上加速比)。
使用 evaluate.py --mode accuracy 对 DualAR Transformer 和 DAC Codec 分别进行 CPU (FP32) 与 NPU (FP32) 的逐层精度对比。
运行命令:
python evaluate.py --mode accuracy| 组件 | MAE | 相对误差 | 相关系数 | 判定 |
|---|---|---|---|---|
| Slow AR - Logits | 0.0000160 | 0.0004% | 1.000000 | PASS |
| Slow AR - Hidden States | 0.0000944 | 0.0004% | 1.000000 | PASS |
| Fast AR - Codebook 1 | 0.0000060 | 0.0001% | 1.000000 | PASS |
| Fast AR - Codebook 2 | 0.0000074 | 0.0002% | 1.000000 | PASS |
| Fast AR - Codebook 3 | 0.0000073 | 0.0002% | 1.000000 | PASS |
| Fast AR - Codebook 4 | 0.0000080 | 0.0002% | 1.000000 | PASS |
| Fast AR - Codebook 5 | 0.0000182 | 0.0005% | 1.000000 | PASS |
| Fast AR - Codebook 6 | 0.0000308 | 0.0009% | 1.000000 | PASS |
| Fast AR - Codebook 7 | 0.0000417 | 0.0021% | 1.000000 | PASS |
| Fast AR - Codebook 8 | 0.0000422 | 0.0026% | 1.000000 | PASS |
| Fast AR - Codebook 9 | 0.0000224 | 0.0005% | 1.000000 | PASS |
| DualAR 平均 | — | 0.0005% | 1.000000 | PASS |
| 组件 | MAE | 相对误差 | 相关系数 | 判定 |
|---|---|---|---|---|
| Quantizer (潜变量 z) | 0.001783 | 0.0419% | 1.000000 | PASS |
| Decoder (音频输出) | 0.000040 | 0.0778% | 1.000000 | PASS |
| DAC 平均 | — | 0.0778% | 1.000000 | PASS |
| 指标 | 数值 |
|---|---|
| DualAR Transformer 误差 | 0.0005% |
| DAC Codec 误差 | 0.0778% |
| 整体精度误差 | 0.0392% |
| 阈值 | < 1.00% |
| 判定 | PASS |
精度说明:CPU (FP32) 与 NPU (FP32) 在相同随机种子下的前向传播结果几乎 bit-exact 一致。所有组件的相关系数均为 1.000000,相对误差远低于 1% 阈值。DualAR 部分误差仅 0.0005%(约 5ppm),DAC Codec 部分误差 0.0778%(主要来自 RVQ 量化器的查表操作在 NPU 上的微小浮点累积差异)。整体精度 0.0392% 远优于 1% 要求。
输入文本 → Tokenizer(tiktoken) → Token IDs
↓
DualAR Transformer ─────────────┐
├─ 28L Slow AR (GQA + RoPE) │
│ └─ 逐 Token 自回归生成语义 Token │
└─ 4L Fast AR (GQA + RoPE) │
└─ 并行生成 9 层声学 Token │
↓ │
RVQ Codec (DAC) │
├─ DownsampleRVQ (9 codebooks) │
│ └─ WindowLimitedTransformer │
└─ Decoder (4× upsampling) │
└─ 因果卷积上采样 │
↓
44100Hz Waveform Audio| 组件 | 层数 | 隐藏维度 | 注意力头 | 说明 |
|---|---|---|---|---|
| Slow AR (DualAR) | 28 | 1024 | 16Q/8KV | GQA + RoPE (theta=1M),QK Norm,自回归生成 |
| Fast AR (DualAR) | 4 | 1024 | 16Q/8KV | GQA + RoPE,并行解码 9 层声学码本 |
| DAC RVQ Quantizer | 9 codebooks | 1024 | — | 残差矢量量化,窗限制 Transformer 前后模块 |
| DAC Decoder | 4 stages | 1536 | — | 因果卷积上采样(8×,8×,4×,2×),总 512× |
| 权重文件 | 大小 | 内容 |
|---|---|---|
model.pth | 1.7GB | DualAR Transformer 完整权重 (860.2M 参数) |
codec.pth | 1.9GB | DAC Quantizer + Decoder 完整权重 (314.6M 参数) |
tokenizer.tiktoken | 1.2MB | Tiktoken 分词器词表 |
config.json | 844B | DualAR 模型配置 |
special_tokens.json | 123KB | 特殊 Token 映射 |
权重加载状态:所有 key 完全匹配(All keys matched successfully),0 missing, 0 unexpected。
本方案是 OpenAudio S1-mini 的昇腾 NPU 独立推理部署方案,基于 fish_speech 开源框架:
DualARTransformer.from_pretrained() 加载 860M 参数,通过 torch.load 加载 DAC 权重,完整映射无缺失torch_npu 替代 CUDA,利用 sdpa_kernel(SDPBackend.MATH) 进行注意力计算加速tokenizer.tiktoken)| 特性 | OpenAudio S1-mini | Voxtral-4B-TTS-2603 |
|---|---|---|
| 参数规模 | 1.17B | 4.00B |
| 生成方式 | 自回归 (AR) | 并行 (非AR) |
| 采样率 | 44100 Hz | 24000 Hz |
| 推理 RTF | 3.40 (AR) | 0.005 (并行) |
| 情感控制 | 50+ 内联标记 | 无 |
| 音色控制 | 无预设音色(prompt-based) | 20 种预设音色 |
OpenAudio S1-mini 采用 DualAR 自回归架构,每次推理需逐 token 生成 VQ 序列。RTF ≈ 3.4 意味着生成速度约为实时的 1/3。这是 AR-based TTS 模型的固有特性,非 NPU 适配问题。相比 CPU(估计 100-200s 以上),NPU 已有数十倍加速。
精度验证在 FP32 下进行 CPU vs NPU 逐层对比,使用固定的随机输入(torch.manual_seed(42)),确保对比的公平性。FP32 精度验证通过后,推理使用 BF16 以节省显存和加速计算。
1.17B 参数在 BF16 精度下约占用 2.3GB HBM(权重)+ 运行时激活内存。Ascend910 (64GB HBM) 有充足余量。若使用 FP32 精度(仅精度验证场景),权重约占用 4.7GB。
模型权重以 .pth 格式(PyTorch 标准 checkpoint)存储,而非 safetensors。加载时需确保 weights_only=True 以保证安全性。DAC 权重(codec.pth)采用键名前缀映射方式分别加载到 quantizer 和 decoder 模块。
模型最大序列长度为 8192 tokens。对于超长文本,建议分段合成。当前测试中 37 个文本 token 生成 209 个 VQ token,总计约 246 token,远低于限制。
openaudio-s1-mini-npu/
├── inference.py # NPU 推理主脚本(含 CPU 对比验证,约 415 行)
├── evaluate.py # 评测脚本(精度 + 性能,约 397 行)
├── logs/
│ ├── inference_smoke.log # 推理烟雾测试运行日志
│ ├── accuracy_test.log # 精度验证运行日志
│ └── performance_test.log # 性能基准运行日志
└── README.md # 本文件(部署指南 + 评测报告)本模型基于 FishAudio OpenAudio S1-mini,遵循 CC BY-NC-SA 4.0 许可。适配代码基于 Apache 2.0 许可。
@misc{fishaudio2025openaudio,
title={OpenAudio S1: Frontier Open-Source Text-to-Speech},
author={FishAudio Team},
year={2025},
url={https://fish.audio}
}
@misc{ascend2025npu,
title={Ascend NPU Adaptation for OpenAudio S1-mini},
author={Ascend NPU Adaptation Team},
year={2025},
url={https://gitcode.com/weixin_62994174/OpenAudio-S1-mini}
}