Local speech recognition & synthesis
Last updated
Fish Audio Drama 3 int4: 41.5 GB down to 22 GB
Checking whether the voice survives a 4-bit fold
An unofficial 4-bit fold of Drama 3: the download drops from 41.5 GB to 22.1 GB and published WER stays level with the FP81 original, at about 8 percent more latency per request.
A checkpoint that folds 41.5 GB into 22 GB
Fish Audio Drama 3 is a multi-speaker speech model that computes 3B of its 35B per token2. The original needs 41.5 GB in bf163, which no single 24 GB card holds; this checkpoint4 folds the weights to 4 bits and lands at 22.1 GB.
What got folded matters more than the size. Only the routed experts and some attention5 projections drop to int4, while the shared expert every token passes through and the audio decoder that builds the waveform stay in bf16, which is why it is labelled a W4A16 hybrid.
The licence is the Fish Audio community licence, so check its terms before commercial use.
| Component | Precision | Share of memory |
|---|---|---|
| Routed experts | int4 | Most of the weights sit here |
| Some attention projections | int4 | Stored at 4 bits, computed at 16 |
| Shared expert | bf16 | Every token passes through |
| Audio decoder | bf16 | It builds the output waveform |

Serving takes more memory than the weights
The weights are 20.8 GB, but serving memory is much larger, which is why a 24 GB card stalls at start-up. On an A100 80 GB the engine already held 57.3 GB at start and peaked at 57.9 GB across five generations.
The rest is KV cache6 and engine overhead. Longer lines and more speakers grow the cache, so headroom counted from weights alone disappears quickly.
It needs Ampere or newer, because the 4-bit kernel uses GPTQ-Marlin. Turing and earlier cards do not open that path.

Serving it with the same command as the original
The runtime7 is SGLang Omni: clone it, build a Python 3.12 virtualenv, then install the fishaudio extra with pre-releases allowed.
| What you need | Needs |
|---|---|
| GPU | Ampere (sm80) or newer |
| Python | 3.12 virtualenv |
| Install | --prerelease=allow |
| Checkpoint | 22.1 GB download |
After downloading the checkpoint, use the same sgl-omni serve command as the original. The checkpoint carries its quantization8 settings, so the loader needs no patch.
git clone https://github.com/sgl-project/sglang-omni.git
cd sglang-omni
uv venv -p 3.12 .venv && . .venv/bin/activate
uv pip install --prerelease=allow -e ".[fishaudio]"
hf download akhaliq/drama-3-int4
sgl-omni serve \
--model-path akhaliq/drama-3-int4 \
--port 8000The API9 is unchanged: post input to /v1/audio/speech, attach a reference clip through references, and the [sighs] and [laughs] tags, multi-speaker scenes and previous_takes editing all behave as on the original.
curl -s localhost:8000/v1/audio/speech \
-H 'content-type: application/json' \
-d '{"input":"오늘 회의는 여기까지입니다. [sighs] 정리해 둘게요.",
"references":[{"audio":"ref.wav","text":"참조 음성 대본"}]}' \
--output out.wavIn the published runs the quality holds
The run covers 1,088 Seed-TTS English prompts10 on one H200, concurrency 8, non-streaming, with WER measured by transcribing the output with Qwen3-ASR-1.7B.
Latency grows about 8 percent per request and throughput11 falls from 6.47 to 5.99, while WER came out lower than the original at 1.63 percent.
That gap is not a quality gap: a second run of the same FP8 checkpoint measured 1.365 s and 2.02 percent, a run-to-run spread as large as the difference between the two.
Scroll sideways to compare all columns.
| Checkpoint | Weights | Latency mean | p95 | RTF | Requests/s | WER |
|---|---|---|---|---|---|---|
| FP8 original | 37.0GB | 1.235 s | 1.902 s | 0.281 | 6.47 | 1.99% |
| int4 | 20.8GB | 1.334 s | 2.178 s | 0.320 | 5.99 | 1.63% |

Measured against another quantisation
A second evaluation on one A100 ran the same eight prompts against an int8 dense quantisation built for 32 GB cards.
On the long paragraph the comparison checkpoint hallucinated an ending and scored 0.667 against 0.028 here, while speaker similarity tied at 0.846.
Scroll sideways to compare all columns.
| Checkpoint | Mean WER | Excluding Chinese | Speaker similarity |
|---|---|---|---|
| int4 hybrid (22.1GB) | 0.197 | 0.082 | 0.846 |
| int8 dense (24.5GB) | 0.259 | 0.154 | 0.846 |
Both scored 1.0 on the Chinese prompt although the transcripts nearly matched, a tokenisation artifact of unspaced Chinese rather than a difference between models.
Do not compare this table with the Seed-TTS table above: both the dataset and the transcription model differ.
When to take this and when to take the original
If memory binds first, take int4: 22 GB of weights opens up 24 and 32 GB cards.
If latency binds first, take the FP8 original; 8 percent per request shows up in tight real-time conversation.
Both sit on pre-release ground: sglang-omni moves fast, so the install command and supported GPUs can change between releases. Listen to one sentence before putting it into production.
Terminology notes
FP8 — A floating-point format that represents each value with 8 bits.
Back to the textToken — A unit into which a model divides input or output for processing.
Back to the textBF16 — A 16-bit floating-point format for model values. Its exponent has the same width as FP32, giving it a similarly wide value range.
Back to the textCheckpoint — A file containing saved model weights and related state. Versions or tasks in one model family may use different checkpoints.
Back to the textAttention — A neural-network operation that calculates relationships between input tokens and combines information from each position into the current representation.
Back to the textKV cache — Memory that stores attention keys and values from earlier tokens for reuse during later token generation. Its size depends on context length and batch size.
Back to the textRuntime — The software environment that provides facilities needed while a program runs. In local AI, it can also refer to a model execution engine.
Back to the textQuantization — A way to represent model weights or values with fewer bits, reducing storage and memory use. The coarser representation can also affect accuracy.
Back to the textAPI — A defined interface that lets other code call a program’s functions.
Back to the textPrompt — The input text sent to a model. For generative models it describes the desired result and strongly shapes the output.
Back to the textThroughput — The amount of work processed or generated over time. Comparisons need the unit, such as tokens per second or requests per second.
Back to the text
Frequently asked questions
- What should you check first in this article?
- An unofficial 4-bit fold of Drama 3: the download drops from 41.5 GB to 22.1 GB and published WER stays level with the FP8 original, at about 8 percent more latency per request.
- How much memory does it need?
- The weights are 20.8 GB, but serving memory is much larger, which is why a 24 GB card stalls at start-up. On an A100 80 GB the engine already held 57.3 GB at start and peaked at 57.9 GB across five generations.
- Where can you check the conditions and sources?
- The licence is the Fish Audio community licence, so check its terms before commercial use.
Read next
Local speech recognition & synthesis
Make a two-speaker dialogue WAV with Fish Audio Drama 3
Local speech recognition & synthesis
Compare local TTS models: languages, hardware and speed evidence
Local speech recognition & synthesis
mlx-audio: TTS and STT from a single install
read first
llmfit: find the models your Mac can actually run
