Research notes · Notas de pesquisa

Notas de pesquisa · Research notes

What we read before measuring — with sources. (English only.)

Ali waving

What we read before measuring anything (13 Oct 2026), condensed. We stand on a lot of other people's work — thank you. Labels: [confirmed] = official source, maintainer, or a published measurement · [community] = a user's report · [estimate] = our own back-of-envelope reasoning (measured later where noted in the guide).

Why it is hard

Each audio frame (1/21.5 s) needs a read of the big "slow" model (≈4B params, ≈8 GB in BF16) and nine passes of the small "fast" model (≈400M). A 16 GB consumer card reads ~448 GB/s, so in BF16 the theoretical ceiling is around 30 frames/s while real time needs 21.5. [estimate] Quantizing roughly doubles that ceiling — which is why GGUF Q8/Q6/Q4 mattered so much on this card.

Which runtime streams for real

Quantization

Codec

The codec is causal: it can decode in chunks while keeping state (audio.cpp) or in windows with 20 tokens of overlap + crossfade (SGLang-Omni). Decoding 30 s at once is what gave a ~11 GB peak in our first PyTorch runs. Limiting max_seq_len to 4096 saves ~4.5 GB of cache in the official repo (https://github.com/fishaudio/fish-speech/pull/1306). A sibling model (Drama 3) decodes in fp16 by default, a hint that fp16 may be safe (https://github.com/sgl-project/sglang-omni/blob/main/docs/cookbook/fishaudio_drama3.md); audio.cpp keeps the codec in F16.

Smaller models

There is no "S2 mini". S1-mini (0.5B, CC-BY-NC-SA) is the previous generation: a bit worse (WER 0.011 vs 0.008) and uses (angry) style tags. https://huggingface.co/fishaudio/s1-mini

Emotion tags

S2/S2 Pro use square brackets with free text, e.g. [whisper], [laughing], [excited], [sad], [surprised], [pause], [low voice], [very excited] — 15 000+ tags. https://huggingface.co/fishaudio/s2-pro · https://docs.fish.audio/api-reference/emotion-reference Official tips: put the tag at the start of the sentence, combine ([sad][whispering]), add intensity ([slightly sad]), at most ~3 emotions per sentence. Spanish is "tier 2" (good, below English/Chinese/Japanese). In our listening tests the emotion already came from the text itself; we did not need tags (and did not evaluate them). A calm reference recording pulls everything toward calm.

RTX 50xx (sm_120) notes

What we did with it

We tried audio.cpp first (Q8 → Q6 → Q4). It won on memory and simplicity (single native binary, no Python/WSL for the model), and Q4 won on smoothness. The SGLang-Omni and INT8 paths stayed as plan B and were never needed.