---
title: SoulX-Singer-onnx-directml
canonical_url: "https://www.modelscope.cn/models/syxppp/SoulX-Singer-onnx-directml"
md_url: "https://www.modelscope.cn/models/syxppp/SoulX-Singer-onnx-directml.md"
repository: syxppp/SoulX-Singer-onnx-directml
chinese_name: "SoulX-Singer ONNX+Directml支持"
last_updated: 2026-10-24
license: "Apache License 2.0"
pipeline_tag: text-to-speech
tasks:
  - text-to-speech
base_model:
  - Soul-AILab/SoulX-Singer
  - Soul-AILab/SoulX-Singer-Preprocess
base_model_relation: quantized
library_name:
  - onnx
  - other
frameworks:
  - other
language:
  - en
  - zh
downloads: 6
stars: 1
tags:
  - svs
  - onnx
  - fp32
  - directml
---

# SoulX-Singer-onnx-directml

> SoulX-Singer-onnx-directml - syxppp 在 ModelScope 开源的模型。使用pytorch把模型转换为onnx，并利用Olive对SoulX-Singer中的diff_step.onnx进行优化以支持DirectML加速推理。vocoder.onnx暂不支持DirectML

syxppp/SoulX-Singer-onnx-directml 是 ModelScope 魔搭社区上的text-to-speech模型，采用 Apache License 2.0 许可，基于 Soul-AILab/SoulX-Singer、Soul-AILab/SoulX-Singer-Preprocess 构建。

- **Repository**: syxppp/SoulX-Singer-onnx-directml
- **License**: Apache License 2.0
- **Tasks**: text-to-speech
- **Base model**: Soul-AILab/SoulX-Singer, Soul-AILab/SoulX-Singer-Preprocess
- **Tags**: svs, onnx, fp32, directml
- **Downloads**: 6
- **Stars**: 1
- **Last updated**: 2026-10-24

Source: https://www.modelscope.cn/models/syxppp/SoulX-Singer-onnx-directml

---

# SoulX-Singer ONNX 模型

> ## ⚠️ 必须立即升级到 v2
>
> **2026-10-24** · 修复 RMVPE 音高检测的致命缺陷
>
> 旧版 `preprocess/rmvpe_model.onnx` 输出是 `(1, T, 360)`，应用却按 `(T, 2560)` 解码：
> `base = t * 2560` 很快越界，`Float32Array` 越界返回 `undefined`，argmax 永远停在索引 0，
> **整条 F0 曲线锁死在 30 Hz**（前 2 秒是错位数据的乱跳）。这是形状契约错误，
> 不是精度问题 —— 旧模型在当前应用里 100% 不可用。
>
> 修复版模型：输入 `audio (1, N)` 动态长度（mel 帧数按 32 对齐），输出 `salience (1, T, 360)`；
> 清音帧由应用按 `max(salience) ≤ 0.03` 判为 0。**新旧模型互不兼容**，
> 新代码会直接抛 `INVALID_MODEL_OUTPUT` 拒绝加载旧模型。
>
> **请立即在应用内「模型管理 → 更新模型」升级到 v2，不要停留在旧版本。**
>
> <sub>English: fixes RMVPE F0 stuck at 30 Hz (output was read as `(T,2560)` instead of
> `(1,T,360)`). The model is now dynamic-length and emits `(1,T,360)` salience. Old and new
> models are mutually incompatible — update immediately via Model Manager.</sub>


SoulX-Singer 模型转换为 ONNX 格式，用于非 PyTorch 环境的推理部署。

## 导出模型

### SoulXSinger 模型 (`onnx_models/`)

| 模型文件 | 输入 | 输出 | 说明 |
|---------|------|------|------|
| `note_text_encoder.onnx` | `(batch, seq_len)` Long | `(batch, seq_len, embed_dim)` | 文本嵌入 |
| `note_pitch_encoder.onnx` | `(batch, seq_len)` Long | `(batch, seq_len, embed_dim)` | 音高嵌入 |
| `note_type_encoder.onnx` | `(batch, seq_len)` Long | `(batch, seq_len, embed_dim)` | 音符类型嵌入 |
| `f0_encoder.onnx` | `(batch, seq_len)` Long | `(batch, seq_len, embed_dim)` | F0 轮廓嵌入 |
| `preflow.onnx` | `(batch, seq_len, text_dim)` Float | `(batch, seq_len, text_dim)` Float | 预处理流 |
| `mel_transform.onnx` | `(batch, num_samples)` Float | `(batch, seq_len, mel_bins)` Float | 音频转梅尔频谱 |
| `vocoder.onnx` | `(batch, seq_len, mel_dim)` Float | `(batch, num_samples)` Float | 梅尔频谱转波形 |
| `cond_emb.onnx` | `(batch, seq_len, cond_emb_dim)` Float | `(batch, seq_len, hidden_size)` Float | 条件嵌入 |
| `diff_step.onnx` | `xt_input, t, cond, xt_mask` | `(batch, seq_len, mel_dim)` Float | 扩散步骤预测 |

### SVC 模型 (`onnx_models/svc/`)

| 模型文件 | 输入 | 输出 | 说明 |
|---------|------|------|------|
| `f0_encoder_svc.onnx` | `(batch, seq_len)` Long | `(batch, seq_len, embed_dim)` | F0 嵌入 (SVC专用) |
| `mel_transform.onnx` | `(batch, num_samples)` Float | `(batch, seq_len, mel_bins)` Float | 音频转梅尔频谱 |
| `vocoder.onnx` | `(batch, seq_len, mel_dim)` Float | `(batch, num_samples)` Float | 梅尔频谱转波形 |
| `cond_emb.onnx` | `(batch, seq_len, cond_emb_dim)` Float | `(batch, seq_len, hidden_size)` Float | 条件嵌入 |
| `diff_step.onnx` | `xt_input, t, cond, xt_mask` | `(batch, seq_len, mel_dim)` Float | 扩散步骤预测 |

## 使用示例

### Python (onnxruntime)

```python
import onnxruntime as ort
import numpy as np

# 加载模型
sess = ort.InferenceSession("onnx_models/mel_transform.onnx")

# 准备输入 (5秒音频，24kHz采样率)
audio = np.random.randn(1, 24000 * 5).astype(np.float32)

# 推理
outputs = sess.run(None, {"waveform": audio})
mel_spec = outputs[0]  # (batch, seq_len, mel_bins)
```

### C++ (ONNX Runtime)

```cpp
#include <onnxruntime/core/session/onnxruntime_cxx_api.h>

Ort::Env env(ORT_LOGGING_LEVEL_WARNING);
Ort::Session session(env, "onnx_models/vocoder.onnx", Ort::SessionOptions{nullptr});

std::vector<const char*> input_names = {"mel"};
std::vector<const char*> output_names = {"waveform"};

std::vector<float> mel_input(/* your mel input data */);
std::vector<float> waveform_output;

session.Run(Ort::RunOptions{nullptr},
            input_names.data(), &mel_input, 1,
            output_names.data(), &waveform_output, 1);
```

## 模型参数

- **采样率**: 24000 Hz
- **hop_size**: 480
- **n_fft**: 1920
- **win_length**: 1920
- **num_mels**: 128
- **mel_dim**: 100
- **hidden_size**: 1024

## 注意事项

1. **vocoder.onnx**: 使用 `torch-istft-onnx` 实现，支持复数 ISTFT 操作
2. **动态轴**: 所有模型支持动态 batch_size 和 seq_len
3. **数据类型**: 输入输出均为 Float32 类型
4. **WhisperEncoder**: 未导出（SVC 模型的 whisper 编码器无法导出到 ONNX）

## 依赖

- onnxruntime >= 1.17
- numpy >= 1.23

## 导出命令

```bash
python convert_to_onnx.py --model-type both
```

- `--model-type soulx`: 仅导出 SoulXSinger 模型
- `--model-type svc`: 仅导出 SVC 模型
- `--model-type both`: 导出两个模型（默认）
