Local speech recognition & synthesis

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.

Requirements and key details
  • The download shrinks from 41.5 GB to 22.1 GB.
  • Only routed experts and some attention projections go to int4.
  • The shared expert and audio decoder stay in bf16.
  • Published runs show about 8 percent more latency and level WER.

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.

What drops to 4 bits and what stays at 16
ComponentPrecisionShare of memory
Routed expertsint4Most of the weights sit here
Some attention projectionsint4Stored at 4 bits, computed at 16
Shared expertbf16Every token passes through
Audio decoderbf16It builds the output waveform
A black display case holding a grid board, a rack of cards and a roller on separate shelves, with a large translucent glass panel standing at the right
Folding the weights to 4 bits nearly doubles what fits in the same space, which is how 41.5 GB becomes 22.1 GB.

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.

Pencil drawing of a cabinet with one-colour blocks on the top shelf and many-coloured blocks below, while a block on screen splits into coloured blocks that take two separate paths
Only 3B of the 35B is computed per token. All the weights still have to be resident, but the slice in use is small.

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 has to be in place
What you needNeeds
GPUAmpere (sm80) or newer
Python3.12 virtualenv
Install--prerelease=allow
Checkpoint22.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.

Install and serve
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 8000

The 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.

A speech request
curl -s localhost:8000/v1/audio/speech \
  -H 'content-type: application/json' \
  -d '{"input":"오늘 회의는 여기까지입니다. [sighs] 정리해 둘게요.",
       "references":[{"audio":"ref.wav","text":"참조 음성 대본"}]}' \
  --output out.wav

In 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.

Seed-TTS English, one H200, concurrency 8
CheckpointWeightsLatency meanp95RTFRequests/sWER
FP8 original37.0GB1.235 s1.902 s0.2816.471.99%
int420.8GB1.334 s2.178 s0.3205.991.63%
A sunlit desk with a small speaker, a handheld recorder and a studio microphone side by side
Similar numbers can still sound different. Decide after listening to the same sentence with the same reference clip.

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.

A100, eight prompts
CheckpointMean WERExcluding ChineseSpeaker similarity
int4 hybrid (22.1GB)0.1970.0820.846
int8 dense (24.5GB)0.2590.1540.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

  1. FP8 — A floating-point format that represents each value with 8 bits.

    Back to the text
  2. Token — A unit into which a model divides input or output for processing.

    Back to the text
  3. BF16 — 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 text
  4. Checkpoint — A file containing saved model weights and related state. Versions or tasks in one model family may use different checkpoints.

    Back to the text
  5. Attention — A neural-network operation that calculates relationships between input tokens and combines information from each position into the current representation.

    Back to the text
  6. KV 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 text
  7. Runtime — 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 text
  8. Quantization — 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 text
  9. API — A defined interface that lets other code call a program’s functions.

    Back to the text
  10. Prompt — The input text sent to a model. For generative models it describes the desired result and strongly shapes the output.

    Back to the text
  11. Throughput — 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.