Run Fish Audio Drama 3, a 35B text-to-speech model for voice cloning,
dialogue and inline cues such as [sighs] or [whispers], natively in ComfyUI on cards from 8 GB. 90% of the model
is routed experts and each audio frame uses only 8 of the 256 in a layer, so the experts stay in system RAM and the
GPU keeps a cache of the ones in use. The pack also brings a native Qwen3-ASR that writes a voice clip's
transcript for you, and nodes to save a cloned voice and load it again. Built with Fish Audio.
Note
3× faster since 2026-10-17. The pack's own CUDA kernels read the experts the cache misses straight from RAM while the CPU computes others, and every layer replays as a CUDA graph: one RTX 3090 now speaks a 9 s line in 6.7 s instead of 16.7 s, about twice as fast as real time, two GPUs take 2.8 s, and an 8 GB card keeps pace with real time. Nothing new to install. Numbers.
Drama 3 FP8 · experts in RAM · temperature 1.0, top_p 0.9, top_k 30 · RTX 3090 and RTX 4090 · no real person cloned: the clones copy voices the model made up, the rest are voices it invents per seed. Click to listen.
Clone a voice from seconds of audio A clip and its transcript are all it takes; save the voice and reuse it without the codec. |
Up to 16 speakers in one text Start each line with <|speaker:N|> and give each speaker a voice. |
Cues where they should land [laughs], [whispers], [sighs] and plain-language directions inside the text (how to write them). |
Long texts in one go Read in chunks the way Fish Audio's server does, each chunk hearing the ones before it. |
Faster than real time, experts in RAM About 6 GB of the model stays on the GPU; custom CUDA kernels read the 32 GB of experts from RAM through a VRAM cache. |
Transcripts by Qwen3-ASR Native 1.7B and 0.6B speech recognition in 30 languages, no extra packages. |
-
Install the nodes. Clone into
custom_nodesand restart ComfyUI. There's nothing topip install: the nodes only use what ComfyUI already has.cd ComfyUI/custom_nodes git clone https://github.com/PedroMarinhoDev/ComfyUI-Drama3 -
Download the files from PedroMarinhoDev/Drama-3-ComfyUI and PedroMarinhoDev/Qwen3-ASR-ComfyUI:
File Folder Size drama3_fp8experts_bf16.safetensorsmodels/diffusion_models38.6 GB drama3_codec.safetensorsmodels/vae1.6 GB qwen3_asr_1.7b_bf16.safetensorsmodels/asr4.1 GB qwen3_forced_aligner_0.6b_bf16.safetensors(optional: word timing in Drama 3 Editor)models/asr1.8 GB hf download PedroMarinhoDev/Drama-3-ComfyUI drama3_fp8experts_bf16.safetensors --local-dir ComfyUI/models/diffusion_models hf download PedroMarinhoDev/Drama-3-ComfyUI drama3_codec.safetensors --local-dir ComfyUI/models/vae hf download PedroMarinhoDev/Qwen3-ASR-ComfyUI qwen3_asr_1.7b_bf16.safetensors --local-dir ComfyUI/models/asr hf download PedroMarinhoDev/Qwen3-ASR-ComfyUI qwen3_forced_aligner_0.6b_bf16.safetensors --local-dir ComfyUI/models/asr
-
Open the workflow and queue. Drag
example_workflows/drama3_voice_clone.jsoninto ComfyUI, pick a few seconds of clean speech in Load Audio, write your text in Drama 3 Generate, run. -
Keep the voice. Unmute Save Drama 3 Voice in the workflow: it writes the encoded voice (codes and transcript, a
.safetensorsof a few KB) tooutput/drama3_voices. Load Drama 3 Voice brings it back later, with no clip to load and nothing to encode or transcribe again.
Tip
Qwen3-ASR fills in the voice's transcript. Cut the clip between sentences: a transcript that misses the clip's last words is the most common reason a take falls silent.
Directions are free natural language, not a fixed list: any wording works, and the examples below are Fish Audio's. The full syntax is Appendix C of their Drama 3 technical report.
| Control | How to write it | Examples |
|---|---|---|
| Speaker | <|speaker:N|> at the start of a line, N from 0 to 15; the voice in Generate's slot voiceN speaks for speaker N, unless its transcript starts with a tag of its own. The lines reach the model joined by <|audio_separator|>, the dialogue layout of Fish's report (Figure 11) |
<|speaker:0|> Ready? <|speaker:1|> Always. |
| Point tag | [tag] where the sound should land |
Well [sighs] fine, you win. [laughs] [pause] [gasps] [clears throat] |
| Scoped tag | <tag>...</tag> around the words it shapes |
Promise me <whisper>you won't tell her</whisper>. <slow>...</slow> <emphasis>...</emphasis> |
| Style prefix | [style] at the start of a line |
[with bright eager excitement] We won! |
| Director's note | Direction: with the note, then Line: with the text on the next line |
Direction: icy calm, as if you already accepted it. Line: So this is goodbye. |
| Language hint | [language: xx] after a line; it is not spoken |
Welcome back to the show. [language: en] |
Text in round parentheses is spoken. Long text is cut into chunks of about 300 bytes without splitting a tag; keep a
director's note in one chunk with its line, or turn off split_long_text. Notes against an earlier take ("softer than
before") need that take in the prompt, which these nodes don't send.
| Minimum | Tested | |
|---|---|---|
| GPU | NVIDIA, 8 GB of VRAM with experts in RAM | RTX 4090 and RTX 3090 (24 GB); 12 GB and 8 GB simulated on the 3090 |
| System RAM | the model file plus ~8 GB: ~32 GB for W4A8, ~48 GB for FP8 | 188 GB |
| CPU | any; with int8 experts in RAM it computes part of the experts, so more cores help on small cards | Intel Core i9-14900K |
| Disk | 26 GB (W4A8 and the codec) | NVMe |
| ComfyUI | v0.40 | v0.41.0 and master after v0.41.2 |
Start with FP8: it holds Fish Audio's own expert weights, byte for byte, next to the checkpoint's bf16 layers. On a card under 24 GB take int8: it is the same size and measured as close to the original, and only int8 experts are computed by the CPU when the VRAM cache misses them, which makes it twice as fast as FP8 with a 4 GB cache. Take a smaller file when your RAM is short of the FP8 file's ~48 GB; on a 24 GB card they are also the fastest.
| File | Size | Experts | RAM with experts in RAM | Notes |
|---|---|---|---|---|
drama3_fp8experts_bf16 |
38.6 GB | FP8, as Fish Audio ships them | ~48 GB | the original weights |
drama3_int8experts_bf16 |
38.7 GB | int8 ConvRot | ~48 GB | the fastest on cards under 24 GB; no silent take in 12 cloned test takes |
drama3_w6a8experts_bf16 |
32.7 GB | W6A8 | ~40 GB | no silent take in 16 cloned test takes |
drama3_w4a8experts_bf16 |
24.6 GB | W4A8 | ~32 GB | falls silent more often with real voice clips |
Qwen3-ASR comes in two sizes, qwen3_asr_1.7b_bf16 (4.1 GB) and qwen3_asr_0.6b_bf16 (1.6 GB). In our tests both
wrote nearly the same transcripts of clean speech, and the 0.6B took half the time. qwen3_forced_aligner_0.6b_bf16
(1.8 GB, also on Qwen3-ASR-ComfyUI) gives Drama 3 Editor the time of every word; on a 40 s
take its times match Qwen's own aligner within 0.16 s, 121 of 131 words exactly.
Drama 3 makes 21.5 audio frames per second of speech, so 46 ms per frame is real time. Since 2026-10-17 one 24 GB card decodes 2–4× faster than real time, and a 9 s line takes 4–8 s in all on one GPU, under 3 s on two. Measured on 2026-10-17 as ComfyUI runs the nodes (dynamic VRAM), a cloned voice, a 9 s line, the mean of two seeds (five for int8 with a 4 GB cache on the 3090), with an Intel Core i9-14900K and ComfyUI v0.41; before is the pack of 2026-10-16 measured the same way. The line's time includes the prompt pass.
| GPU | File | Expert cache | ms per frame, before → now | 9 s line, before → now | Peak VRAM |
|---|---|---|---|---|---|
| RTX 4090 (PCIe 4.0 ×8) | W4A8 | 16 GB | 56.9 → 11.7 | 13.6 → 3.9 s | 21.8 GB |
| RTX 4090 (PCIe 4.0 ×8) | int8 | 16 GB | 67.0 → 20.2 | 16.4 → 6.1 s | 21.8 GB |
| RTX 4090 (PCIe 4.0 ×8) | W4A8 | 4 GB | 75.3 → 29.5 | 16.9 → 6.9 s | 10.7 GB |
| RTX 4090 (PCIe 4.0 ×8) | int8 | 4 GB | 102.9 → 32.7 | 23.0 → 7.6 s | 10.8 GB |
| RTX 3090 (PCIe 4.0 ×8) | W4A8 | 16 GB | 56.7 → 14.4 | 13.3 → 4.7 s | 21.8 GB |
| RTX 3090 (PCIe 4.0 ×8) | W6A8 | 16 GB | 61.5 → 19.2 | 14.7 → 6.2 s | 21.8 GB |
| RTX 3090 (PCIe 4.0 ×8) | int8 | 16 GB | 68.8 → 23.2 | 16.7 → 6.7 s | 21.8 GB |
| RTX 3090 (PCIe 4.0 ×8) | FP8 | 16 GB | 67.6 → 24.8 | 16.6 → 7.7 s | 21.8 GB |
| RTX 3090 (PCIe 4.0 ×8) | int8 | 4 GB | 104.2 → 34.4 | 22.9 → 8.0 s | 10.6 GB |
| RTX 3090 (PCIe 4.0 ×8) | W4A8 | 4 GB | 76.2 → 31.7 | 16.7 → 7.7 s | 10.6 GB |
| RTX 3090 (PCIe 4.0 ×8) | FP8 | 4 GB | 107.5 → 58.0 | 23.4 → 13.5 s | 10.6 GB |
| RTX 3090 held to 12 GB | int8 | automatic | 110.1 → 37.5 | 24.0 → 8.4 s | 9.6 GB |
| RTX 3090 held to 12 GB | FP8 | automatic | 115.1 → 63.9 | 24.8 → 14.5 s | 9.6 GB |
| RTX 3090 held to 8 GB | int8 | automatic | 145.2 → 45.8 | 30.6 → 9.9 s | 6.7 GB |
| RTX 3090 held to 8 GB | FP8 | automatic | 148.6 → 97.3 | 30.7 → 20.7 s | 6.7 GB |
| RTX 3090 + RTX 4090, experts in VRAM | int8 | – | 56.7 → 13.2 | 12.6 → 2.8 s | 18.8 + 18.7 GB |
| RTX 3090 + RTX 4090, experts in VRAM | FP8 | – | 48.9 → 12.9 | 10.7 → 2.9 s | 18.7 + 18.5 GB |
The held rows ran with the rest of the 3090's memory taken by another process, as on a 12 GB or 8 GB card. With int8 experts the CPU computes part of the experts the cache misses, so int8 holds up on small cards where FP8 slows down: a CPU with fewer or slower cores gets less of that help. ComfyUI after v0.41.2 decodes about 2% faster again. Qwen3-ASR transcribes a 6.6 s clip in ~2 s with the 1.7B model and ~1 s with the 0.6B (RTX 3090, model load included).
Nodes
| Node | What it does |
|---|---|
| Load Drama 3 | Loads a model file. experts: in RAM (default) or in VRAM; expert_cache_gb: VRAM for cached experts (0 = what is free); advanced: a second GPU for the experts-in-VRAM split. |
| Load Drama 3 Codec | Loads the codec from models/vae. |
| Drama 3 Encode Voice | A voice to clone: an audio clip and its exact transcript. |
| Save Drama 3 Voice / Load Drama 3 Voice | Keep an encoded voice (codes and transcript, a few KB) in output/drama3_voices and use it again without the codec. |
| Drama 3 Generate | Text and any number of voices to audio codes. Long text is generated in chunks, each continuing from the first and the latest chunk; speakers can generate each speaker on their own (per line or per speaker). |
| Save Drama 3 Codes / Load Drama 3 Codes | Keep a generated take (codes and line timing, a few hundred KB) in output/drama3_codes and decode or edit it again without generating it again. |
| Drama 3 Decode | Codes to 44.1 kHz audio; separately generated takes are joined with 0.3 s of silence. |
| Drama 3 Editor | Codes to audio, with captions that follow the voice word by word (with Qwen3-ForcedAligner on aligner) and one track per voice. Edit opens the editor over ComfyUI: pick how the silences sound (as generated, natural, tight, or your own values), check the lines it flags (a line short or long for its words, long silences), cut, add silence, name the voices and set their volume. Use these edits runs the node again with them; they stay in the workflow. |
| Load Qwen3-ASR | Loads a Qwen3-ASR or Qwen3-ForcedAligner file from models/asr. |
| Qwen3-ASR Transcribe | Audio to text and its language; language detects it or forces one of 30; context takes names and terms that help recognition. |
The codec runs only before and after generation, so it never sits in VRAM next to the model.
How it fits on an 8 GB card
Drama 3 is a Qwen3.5-style mixture of experts: 40 layers, each with 256 routed experts of which 8 run per frame, plus attention or DeltaNet, a shared expert and a 13-layer codebook decoder. Everything except the routed experts is about 6 GB and stays on the GPU. With experts in RAM the 32 GB of experts stay in pinned system memory and the VRAM left free caches the most used ones (83% of reads hit a 15 GB cache); the cache lasts a whole Generate run.
The pack's CUDA kernels, compiled at run time by PyTorch's NVRTC (no compiler or package to install), look each expert up in the cache on the GPU, run the cached ones in place and read the missed ones straight from RAM over PCIe, filling free cache slots as they go. With int8 experts the CPU computes part of the misses at the same time, and the most used of them are copied into the cache between frames. Since nothing in a frame waits on the CPU, every layer and the codebook decoder replay as CUDA graphs. The prompt pass groups its rows by expert and splits the experts between the GPU and the CPU the same way. Where PyTorch can't compile the kernels the nodes copy the experts instead, at the previous version's speed.
With experts in VRAM the whole file sits on the GPU and the same kernels read the experts in place; two 24 GB
cards can split the layers (second_gpu).
Settings
- temperature 1.0, top_p 0.9, top_k 0 (no cap) are the defaults of Fish Audio's Drama 3 Space. Their server's top_k 30 makes takes fall silent at pauses: 11 of 40 takes in Fish Audio's test, 2 of 4 cloned takes here, each losing a sentence. Lower temperature or top_p make takes slower, flatter and more likely to fall silent.
- The model copies the reference's delivery: a flat clip gives a flat take, a lively one a lively take.
- max_frames caps each chunk (21.5 frames per second); generation stops earlier at the end of speech.
- speakers sets how a dialogue is generated. one take per line (default) generates each line on its own, with
only its speaker's voices and earlier takes in the prompt, as Fish Audio's Space voices a scene: voices cannot bleed
into each other, but lines do not hear each other. one take per line, hearing the line before adds the take before
as context, so lines react again but that voice can bleed in. one take per speaker says all of a speaker's lines in
one take (in 300-byte chunks with
split_long_text), cuts it at the line breaks it says and puts the lines back in script order. together is one script in which every line hears the others. Decode joins separate takes with 0.3 s of silence. Pause cues are riskier in a solo take: a line that opens with[long pause]can stay silent. - As in Fish Audio's Space: Encode Voice trims the clip's silent edges and normalizes its peak; Generate takes a
chunk once more when it has no sound or stalls in its first 2.5 s; Decode's
shorten_long_pauses(on) shortens pauses over 0.75 s to 0.75 s, cuts the silence before the first sound and keeps 0.15 s at the end.
Building the files yourself
From the official checkpoints, one GPU visible (CUDA_VISIBLE_DEVICES=N), with ComfyUI on PYTHONPATH:
python tools/convert.py model <drama-3 folder> drama3_fp8experts_bf16.safetensors --format fp8
python tools/convert.py model <drama-3 folder> drama3_int8experts_bf16.safetensors --format int8_convrot
python tools/convert.py model <drama-3 folder> drama3_w6a8experts_bf16.safetensors --format w6a8
python tools/convert.py model <drama-3 folder> drama3_w4a8experts_bf16.safetensors --format w4a8
python tools/convert.py codec <drama-3 folder>/codec.pth drama3_codec.safetensors
python tools/convert.py asr <Qwen3-ASR-1.7B folder> qwen3_asr_1.7b_bf16.safetensors
python tools/convert.py asr <Qwen3-ASR-0.6B folder> qwen3_asr_0.6b_bf16.safetensors
python tools/convert.py asr <Qwen3-ForcedAligner-0.6B folder> qwen3_forced_aligner_0.6b_bf16.safetensorsHow close it is to the official code
- Drama 3: against Fish Audio's own PyTorch code, with the same frames forced, the main token's distribution differs by a KL of 0.004–0.007 nats and the top token agrees 93–94% of the time, the noise of bf16 arithmetic; the FP8 and int8 files measure the same. Prompt rows match the builders of Fish Audio's server and of fish-speech token for token, and the codec produces 99.94% of the same codes.
- Qwen3-ASR: against Qwen's
qwen-asrpackage, the prompt ids are identical, the encoder output matches within 1e-6 in fp32 and the first token is the same; transcripts match on clips up to 8 s. On longer clips the encoder attends in Qwen's 8 s windows, as their vLLM backend does, which can move a comma.
A take falls silent after a second, or speaks only part of the text
Set top_k to 0: workflows saved before this fix keep the old 30, which makes takes fall silent at pauses. Then check
the voice: the transcript must cover every word of the clip, and the clip should be clean speech cut between
sentences. Some clips make the model fall silent in Fish Audio's own code too (known issue); try another stretch of the
recording. A take that goes silent is stopped and its silent tail cut, with a warning in the console; a new seed
usually helps.
Speakers swap voices in a dialogue
Give every speaker a voice. A long dialogue is generated in chunks, and an earlier chunk's take in the prompt hands the voice it ends in to the next chunk: with two cloned voices, 6 of 16 lines after the first chunk came out in the other voice. When every speaker has a voice, Generate leaves earlier takes out of dialogue chunks and the references keep the voices apart (1 of 18). A speaker without a voice still needs them to keep the voice the model made up.
Speech is slow or flat
Keep temperature at 1.0 and top_p at 0.9 or above, and use a reference with the delivery you want.
Out of memory, or the first run takes minutes
Lower expert_cache_gb, or pick a smaller file if system RAM is the limit. The first run reads the whole model file
from disk once; later runs start in seconds.
The code in this repository is under the GNU GPL v3, except the parts ported from Fish Audio's code and
Fish Audio's tokenizer and config, which remain under the Fish Audio Community License, and the
parts adapted from Qwen's qwen-asr, under the Apache License 2.0. NOTICE lists them.
Note
Drama 3's weights and outputs fall under the Fish Audio Community License: free for research and non-commercial use, and for commercial use below USD 500k annual revenue; a hosted TTS service needs a license from Fish Audio. Don't clone the voice of an identifiable person without their consent.
Built with Fish Audio. Drama 3 and its codec are by Fish Audio; Qwen3-ASR is by the Qwen team. This project is not affiliated with or endorsed by either.
