Instructions to use moonbox-dev/s2-pro-MLX with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use moonbox-dev/s2-pro-MLX with MLX:
# Download the model from the Hub pip install huggingface_hub[hf_xet] hf download moonbox-dev/s2-pro-MLX --local-dir s2-pro-MLX
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Atomic Chat
Fish Audio S2 Pro MLX
MLX builds of Fish Audio S2 Pro, made by Moonbox for Apple Silicon Macs. Each precision is a folder; keep a folder's files together. Only the parts listed below are converted: the rest of the pipeline comes from the original repository unless the section below says otherwise.
Files
The last column is how far each build is from the original PyTorch model on the same inputs (see the section below for what was measured).
| Precision | File | Size | sha256 | Checked against the original |
|---|---|---|---|---|
| bf16 | bf16/chat_template.jinja |
4.1 kB | 87a2728cb8dc |
WER 0.0 % / CER 0.0 %, speaker sim 0.956 / 0.952, DNSMOS 3.24 / 2.92 (original 0.0 % / 0.0 %, 0.952 / 0.949, 3.21 / 2.76) |
| bf16 | bf16/codec.safetensors |
2.78 GB | fde06aa1f23b |
WER 0.0 % / CER 0.0 %, speaker sim 0.956 / 0.952, DNSMOS 3.24 / 2.92 (original 0.0 % / 0.0 %, 0.952 / 0.949, 3.21 / 2.76) |
| bf16 | bf16/config.json |
2.1 kB | 870046f617ca |
WER 0.0 % / CER 0.0 %, speaker sim 0.956 / 0.952, DNSMOS 3.24 / 2.92 (original 0.0 % / 0.0 %, 0.952 / 0.949, 3.21 / 2.76) |
| bf16 | bf16/model-00001-of-00002.safetensors |
5.35 GB | 13c1b614ac67 |
WER 0.0 % / CER 0.0 %, speaker sim 0.956 / 0.952, DNSMOS 3.24 / 2.92 (original 0.0 % / 0.0 %, 0.952 / 0.949, 3.21 / 2.76) |
| bf16 | bf16/model-00002-of-00002.safetensors |
3.78 GB | a75a5d2e91dd |
WER 0.0 % / CER 0.0 %, speaker sim 0.956 / 0.952, DNSMOS 3.24 / 2.92 (original 0.0 % / 0.0 %, 0.952 / 0.949, 3.21 / 2.76) |
| bf16 | bf16/model.safetensors.index.json |
30.4 kB | 65dc730b4e46 |
WER 0.0 % / CER 0.0 %, speaker sim 0.956 / 0.952, DNSMOS 3.24 / 2.92 (original 0.0 % / 0.0 %, 0.952 / 0.949, 3.21 / 2.76) |
| bf16 | bf16/special_tokens_map.json |
0.1 MB | c2ff18fde6e4 |
WER 0.0 % / CER 0.0 %, speaker sim 0.956 / 0.952, DNSMOS 3.24 / 2.92 (original 0.0 % / 0.0 %, 0.952 / 0.949, 3.21 / 2.76) |
| bf16 | bf16/tokenizer.json |
12.2 MB | f24e08099d45 |
WER 0.0 % / CER 0.0 %, speaker sim 0.956 / 0.952, DNSMOS 3.24 / 2.92 (original 0.0 % / 0.0 %, 0.952 / 0.949, 3.21 / 2.76) |
| bf16 | bf16/tokenizer_config.json |
0.9 MB | b8d149343ae4 |
WER 0.0 % / CER 0.0 %, speaker sim 0.956 / 0.952, DNSMOS 3.24 / 2.92 (original 0.0 % / 0.0 %, 0.952 / 0.949, 3.21 / 2.76) |
| fp16 | fp16/chat_template.jinja |
4.1 kB | 87a2728cb8dc |
WER 0.0 % / CER 0.0 %, speaker sim 0.964 / 0.951, DNSMOS 3.21 / 2.86 |
| fp16 | fp16/codec.safetensors |
2.78 GB | fde06aa1f23b |
WER 0.0 % / CER 0.0 %, speaker sim 0.964 / 0.951, DNSMOS 3.21 / 2.86 |
| fp16 | fp16/config.json |
2.1 kB | 870046f617ca |
WER 0.0 % / CER 0.0 %, speaker sim 0.964 / 0.951, DNSMOS 3.21 / 2.86 |
| fp16 | fp16/model-00001-of-00002.safetensors |
5.35 GB | d70c8e348abd |
WER 0.0 % / CER 0.0 %, speaker sim 0.964 / 0.951, DNSMOS 3.21 / 2.86 |
| fp16 | fp16/model-00002-of-00002.safetensors |
3.78 GB | 94b99c94994c |
WER 0.0 % / CER 0.0 %, speaker sim 0.964 / 0.951, DNSMOS 3.21 / 2.86 |
| fp16 | fp16/model.safetensors.index.json |
30.4 kB | 65dc730b4e46 |
WER 0.0 % / CER 0.0 %, speaker sim 0.964 / 0.951, DNSMOS 3.21 / 2.86 |
| fp16 | fp16/special_tokens_map.json |
0.1 MB | c2ff18fde6e4 |
WER 0.0 % / CER 0.0 %, speaker sim 0.964 / 0.951, DNSMOS 3.21 / 2.86 |
| fp16 | fp16/tokenizer.json |
12.2 MB | f24e08099d45 |
WER 0.0 % / CER 0.0 %, speaker sim 0.964 / 0.951, DNSMOS 3.21 / 2.86 |
| fp16 | fp16/tokenizer_config.json |
0.9 MB | b8d149343ae4 |
WER 0.0 % / CER 0.0 %, speaker sim 0.964 / 0.951, DNSMOS 3.21 / 2.86 |
| 8bit | 8bit/chat_template.jinja |
4.1 kB | 87a2728cb8dc |
WER 0.0 % / CER 0.0 %, speaker sim 0.953 / 0.953, DNSMOS 3.22 / 2.83 |
| 8bit | 8bit/codec.safetensors |
2.78 GB | fde06aa1f23b |
WER 0.0 % / CER 0.0 %, speaker sim 0.953 / 0.953, DNSMOS 3.22 / 2.83 |
| 8bit | 8bit/config.json |
2.3 kB | 363895eff17c |
WER 0.0 % / CER 0.0 %, speaker sim 0.953 / 0.953, DNSMOS 3.22 / 2.83 |
| 8bit | 8bit/model-00001-of-00002.safetensors |
5.35 GB | 7d96671b6003 |
WER 0.0 % / CER 0.0 %, speaker sim 0.953 / 0.953, DNSMOS 3.22 / 2.83 |
| 8bit | 8bit/model-00002-of-00002.safetensors |
372.3 MB | 876e059805ce |
WER 0.0 % / CER 0.0 %, speaker sim 0.953 / 0.953, DNSMOS 3.22 / 2.83 |
| 8bit | 8bit/model.safetensors.index.json |
61.0 kB | 7815620c53eb |
WER 0.0 % / CER 0.0 %, speaker sim 0.953 / 0.953, DNSMOS 3.22 / 2.83 |
| 8bit | 8bit/special_tokens_map.json |
0.1 MB | c2ff18fde6e4 |
WER 0.0 % / CER 0.0 %, speaker sim 0.953 / 0.953, DNSMOS 3.22 / 2.83 |
| 8bit | 8bit/tokenizer.json |
12.2 MB | f24e08099d45 |
WER 0.0 % / CER 0.0 %, speaker sim 0.953 / 0.953, DNSMOS 3.22 / 2.83 |
| 8bit | 8bit/tokenizer_config.json |
0.9 MB | b8d149343ae4 |
WER 0.0 % / CER 0.0 %, speaker sim 0.953 / 0.953, DNSMOS 3.22 / 2.83 |
| 6bit | 6bit/chat_template.jinja |
4.1 kB | 87a2728cb8dc |
WER 0.0 % / CER 0.0 %, speaker sim 0.966 / 0.945, DNSMOS 3.24 / 2.80 |
| 6bit | 6bit/codec.safetensors |
2.78 GB | fde06aa1f23b |
WER 0.0 % / CER 0.0 %, speaker sim 0.966 / 0.945, DNSMOS 3.24 / 2.80 |
| 6bit | 6bit/config.json |
2.3 kB | e26146aa01b3 |
WER 0.0 % / CER 0.0 %, speaker sim 0.966 / 0.945, DNSMOS 3.24 / 2.80 |
| 6bit | 6bit/model.safetensors |
4.81 GB | 1c8b473cc7a9 |
WER 0.0 % / CER 0.0 %, speaker sim 0.966 / 0.945, DNSMOS 3.24 / 2.80 |
| 6bit | 6bit/model.safetensors.index.json |
50.2 kB | dc9f4a81f88b |
WER 0.0 % / CER 0.0 %, speaker sim 0.966 / 0.945, DNSMOS 3.24 / 2.80 |
| 6bit | 6bit/special_tokens_map.json |
0.1 MB | c2ff18fde6e4 |
WER 0.0 % / CER 0.0 %, speaker sim 0.966 / 0.945, DNSMOS 3.24 / 2.80 |
| 6bit | 6bit/tokenizer.json |
12.2 MB | f24e08099d45 |
WER 0.0 % / CER 0.0 %, speaker sim 0.966 / 0.945, DNSMOS 3.24 / 2.80 |
| 6bit | 6bit/tokenizer_config.json |
0.9 MB | b8d149343ae4 |
WER 0.0 % / CER 0.0 %, speaker sim 0.966 / 0.945, DNSMOS 3.24 / 2.80 |
| 4bit | 4bit/chat_template.jinja |
4.1 kB | 87a2728cb8dc |
WER 0.0 % / CER 0.0 %, speaker sim 0.963 / 0.944, DNSMOS 3.22 / 3.01 |
| 4bit | 4bit/codec.safetensors |
2.78 GB | fde06aa1f23b |
WER 0.0 % / CER 0.0 %, speaker sim 0.963 / 0.944, DNSMOS 3.22 / 3.01 |
| 4bit | 4bit/config.json |
2.3 kB | 04a6afe6a550 |
WER 0.0 % / CER 0.0 %, speaker sim 0.963 / 0.944, DNSMOS 3.22 / 3.01 |
| 4bit | 4bit/model.safetensors |
3.90 GB | f57eb1c13b76 |
WER 0.0 % / CER 0.0 %, speaker sim 0.963 / 0.944, DNSMOS 3.22 / 3.01 |
| 4bit | 4bit/model.safetensors.index.json |
50.2 kB | 5c1dd949a15f |
WER 0.0 % / CER 0.0 %, speaker sim 0.963 / 0.944, DNSMOS 3.22 / 3.01 |
| 4bit | 4bit/special_tokens_map.json |
0.1 MB | c2ff18fde6e4 |
WER 0.0 % / CER 0.0 %, speaker sim 0.963 / 0.944, DNSMOS 3.22 / 3.01 |
| 4bit | 4bit/tokenizer.json |
12.2 MB | f24e08099d45 |
WER 0.0 % / CER 0.0 %, speaker sim 0.963 / 0.944, DNSMOS 3.22 / 3.01 |
| 4bit | 4bit/tokenizer_config.json |
0.9 MB | b8d149343ae4 |
WER 0.0 % / CER 0.0 %, speaker sim 0.963 / 0.944, DNSMOS 3.22 / 3.01 |
How to run
Fish Audio S2 Pro (4.4B dual-autoregressive TTS: voice cloning, 80+ languages, inline [tag] control of emotion and
prosody) for mlx-audio. Built with Fish Audio. Each folder is a complete
mlx-audio model: model-*.safetensors (slow and fast AR transformers), codec.safetensors (the DAC codec, float32,
re-saved unchanged from the original codec.pth), the tokenizer and chat template. Tested with mlx-audio==0.6.5:
from mlx_audio.tts.utils import load_model
import mlx.core as mx, numpy as np, soundfile as sf, librosa
model = load_model("8bit") # a downloaded folder
ref = mx.array(librosa.load("voice.wav", sr=model.sample_rate)[0])
res = list(model.generate(text="Hello from Moonbox.", ref_audio=ref, ref_text="Exact transcript of voice.wav."))
sf.write("out.wav", np.concatenate([np.array(r.audio) for r in res]), res[0].sample_rate)
8bit/, 6bit/ and 4bit/ quantize the transformer layers (MLX affine, group size 64); the codec is not quantized.
License: Fish Audio Research License: research and non-commercial use only; commercial use needs a license from
Fish Audio. See LICENSE.md and NOTICE.md (what was changed).
How they were checked. Voice cloning of 6 English and 4 Chinese sentences, two seeds each, with the original (fish-speech's own inference code, PyTorch bfloat16) and every MLX build, the original's sampling (temperature 0.7, top-p 0.7, top-k 30). Judged like the original: Whisper large-v3-turbo WER / CER, WavLM speaker similarity to the prompt, DNSMOS. Pass: error rate at most 2 points above the original's, similarity at most 0.03 below, DNSMOS at most 0.2 below.
| Precision | Size | WER en / CER zh | Speaker similarity en / zh | DNSMOS en / zh | Real-time factor, M5 24 GB |
|---|---|---|---|---|---|
| original (PyTorch bf16, MPS) | - | 0.0 % / 0.0 % | 0.952 / 0.949 | 3.21 / 2.76 | 4.2 |
bf16/ |
11.9 GB | 0.0 % / 0.0 % | 0.956 / 0.952 | 3.24 / 2.92 | ~5 |
fp16/ |
11.9 GB | 0.0 % / 0.0 % | 0.964 / 0.951 | 3.21 / 2.86 | 4.7 |
8bit/ |
8.5 GB | 0.0 % / 0.0 % | 0.953 / 0.953 | 3.22 / 2.83 | 3.2 |
6bit/ |
7.6 GB | 0.0 % / 0.0 % | 0.966 / 0.945 | 3.24 / 2.80 | 3.1 |
4bit/ |
6.7 GB | 0.0 % / 0.0 % | 0.963 / 0.944 | 3.22 / 3.01 | 3.0 |
Real-time factor = generation time / audio length, one sentence at a time (slower than real time on a 24 GB M5).
How these were made
From Fish Audio S2 Pro at revision 1de9996b6b: the original weights loaded in MLX and stored as bf16 or fp16, or
quantized with MLX's affine quantization (8bit, 6bit, 4bit, group size 64; layers MLX can't quantize, such as
convolutions and norms, stay bf16). Every build was checked against the original before upload; the sha256 column
above is what the files must hash to.
License
other (Fish Audio research license). These files are a derivative of the original model and carry its license: it is copied in this repository, and it governs your use of these files. The original model card follows unchanged.
Original model card
Fish Audio S2 Pro
Technical Report | GitHub | Playground
Fish Audio S2 Pro is a leading text-to-speech (TTS) model with fine-grained inline control of prosody and emotion. Trained on over 10M+ hours of audio data across 80+ languages, the system combines reinforcement learning alignment with a dual-autoregressive architecture. The release includes model weights, fine-tuning code, and an SGLang-based streaming inference engine.
Architecture
S2 Pro builds on a decoder-only transformer combined with an RVQ-based audio codec (10 codebooks, ~21 Hz frame rate) using a Dual-Autoregressive (Dual-AR) architecture:
- Slow AR (4B parameters): Operates along the time axis and predicts the primary semantic codebook.
- Fast AR (400M parameters): Generates the remaining 9 residual codebooks at each time step, reconstructing fine-grained acoustic detail.
This asymmetric design keeps inference efficient while preserving audio fidelity. Because the Dual-AR architecture is structurally isomorphic to standard autoregressive LLMs, it inherits all LLM-native serving optimizations from SGLang β including continuous batching, paged KV cache, CUDA graph replay, and RadixAttention-based prefix caching.
Fine-Grained Inline Control
S2 Pro enables localized control over speech generation by embedding natural-language instructions directly within the text using [tag] syntax. Rather than relying on a fixed set of predefined tags, S2 Pro accepts free-form textual descriptions β such as [whisper in small voice], [professional broadcast tone], or [pitch up] β allowing open-ended expression control at the word level.
Common tags (15,000+ unique tags supported):
[pause] [emphasis] [laughing] [inhale] [chuckle] [tsk] [singing] [excited] [laughing tone] [interrupting] [chuckling] [excited tone] [volume up] [echo] [angry] [low volume] [sigh] [low voice] [whisper] [screaming] [shouting] [loud] [surprised] [short pause] [exhale] [delight] [panting] [audience laughter] [with strong accent] [volume down] [clearing throat] [sad] [moaning] [shocked]
Supported Languages
S2 Pro supports 80+ languages.
Tier 1: Japanese (ja), English (en), Chinese (zh)
Tier 2: Korean (ko), Spanish (es), Portuguese (pt), Arabic (ar), Russian (ru), French (fr), German (de)
Other supported languages: sv, it, tr, no, nl, cy, eu, ca, da, gl, ta, hu, fi, pl, et, hi, la, ur, th, vi, jw, bn, yo, xsl, cs, sw, nn, he, ms, uk, id, kk, bg, lv, my, tl, sk, ne, fa, af, el, bo, hr, ro, sn, mi, yi, am, be, km, is, az, sd, br, sq, ps, mn, ht, ml, sr, sa, te, ka, bs, pa, lt, kn, si, hy, mr, as, gu, fo, and more.
Production Streaming Performance
On a single NVIDIA H200 GPU:
- Real-Time Factor (RTF): 0.195
- Time-to-first-audio: ~100 ms
- Throughput: 3,000+ acoustic tokens/s while maintaining RTF below 0.5
Links
Technical Report
If you find our work useful, please consider citing our report:
@misc{liao2026fishaudios2technical,
title={Fish Audio S2 Technical Report},
author={Shijia Liao and Yuxuan Wang and Songting Liu and Yifan Cheng and Ruoyi Zhang and Tianyu Li and Shidong Li and Yisheng Zheng and Xingwei Liu and Qingzheng Wang and Zhizhuo Zhou and Jiahua Liu and Xin Chen and Dawei Han},
year={2026},
eprint={2603.08823},
archivePrefix={arXiv},
primaryClass={cs.SD},
url={https://arxiv.org/abs/2603.08823},
}
License
This model is licensed under the Fish Audio Research License. Research and non-commercial use is permitted free of charge. Commercial use requires a separate license from Fish Audio β contact business@fish.audio.
Quantized
Model tree for moonbox-dev/s2-pro-MLX
Base model
fishaudio/s2-pro