Fish Audio S2-Pro · native C + CUDA · DGX Spark

Speech faster than
it plays. No Python.

I wrote the whole S2-Pro inference path in C and CUDA — tokenizer, both transformers, the vocoder, the scheduler, the HTTP server. Nothing else is in the runtime. It synthesises at half of realtime on one DGX Spark, so a sentence is audible before you finish reading it.

$ docker pull ghcr.io/luka-loehr/s2pro-native:1.0.1
$ docker run --gpus all -p 8010:8010 \
    -v s2pro-data:/data \
    ghcr.io/luka-loehr/s2pro-native:1.0.1
Wall RTF
0.51
zero-shot, from 2.05
Time to first audio
0.14 s
0.20 s with a voice
Weight stream
4.5
bits per weight
Languages
80+
upstream S2-Pro
Optimization record
2.05 → 0.51
wall RTF, same stack

Sixteen measured steps, each gated on layer parity, MD5 bit-exactness or a listening test. The ones that lost are written down too — FP8 failed parity and stayed only as a memory-system probe.

One DGX Spark (GB10, sm_121), single stream, streamed over HTTP, temperature 0.8, top-p 0.8, fixed seed. RTF is compute ÷ audio, so below 1.0 means synthesis outruns playback.

One paste

Let your agent set it up

You were going to paste it into Claude anyway. I saved you the typing. It fetches the runbook, checks you actually have a Spark, pulls the image, waits out the checkpoint download and proves the server works with a real wav.

Paste into your agent
Set me up with s2pro-native — Fish Audio S2-Pro serving in native C and CUDA
on a DGX Spark. Run this first, then follow it exactly, top to bottom:

    curl -fsSL https://s2pro.lukaloehr.com/setup.txt

Ask me its first question before doing anything else. Never print my tokens.
Get started

Two commands

Ah, so you haven’t fallen for the vibe yet. Respect. I still read commands before I run them too.

01

Pull and run

Needs a DGX Spark (GB10, sm_121) with Docker and the NVIDIA runtime. The host needs no CUDA toolkit, no Python, no PyTorch. On first start the entrypoint downloads the S2-Pro checkpoint into the volume and converts the codec; every later start is warm.

$ docker pull ghcr.io/luka-loehr/s2pro-native:1.0.1
$ docker run --gpus all -p 8010:8010 \
    -v s2pro-data:/data ghcr.io/luka-loehr/s2pro-native:1.0.1

The checkpoint is under the Fish Audio Research License and is never baked into the image. Set HF_TOKEN if the repo asks for one, and S2P_TOKEN for bearer auth.

02

Ask it to say something

/v1/tts streams a WAV header and then S16LE frames as they are generated. Pass voice to pick a registry voice, or reference_audio_b64 plus reference_text to clone one (15 s max).

$ curl -X POST localhost:8010/v1/tts \
    -d '{"text":"Hello from a DGX Spark.","format":"wav"}' -o hello.wav

The server binds loopback and does not terminate TLS. Put it behind an authenticated proxy before exposing it, and read SECURITY.md first.

Reference

Measured on one Spark

Serving

Zero-shotRTF 0.51 · TTFA 0.14 s
60 s voice referenceRTF 0.52 · TTFA 0.20 s
~143 s long-formRTF 0.50 · TTFA 0.20 s
Decode per frame39.7 ms (INT8) vs 93.3 ms (BF16)
Process memory~8.5 GB INT8 · ~12 GB BF16
Audio out44.1 kHz mono S16LE

Runtime

RuntimeC11 + CUDA 13.0 · no Python
TargetDGX Spark GB10 · sm_121
Backbone36L d2560 GQA 32/8 + qk-norm
Fast-AR4L residual · 9 codebook steps
VocoderDAC / Firefly-GAN, bit-exact
Quantizationpacked g32 INT4 + QAT distill

HTTP API

GET /healthzengine + scheduler stats
GET /v1/voicesnamed-voice registry
POST /v1/ttsstreaming synthesis (WAV or PCM)
Port8010