IAMCCS Drama 3 · Voice ID + Qwen ASR
Voice cloning in Drama 3 starts with the transcript nobody wants to type
- codec
- audio
- voice
- reference_transcript
Every zero-shot cloner advertises "five seconds of reference audio and you're done". Almost none of them are done: the good ones also want the words that were spoken in those five seconds, and that's the step users skip. IAMCCS_Drama3GPUEncodeVoice - the "Voice ID + Qwen ASR" node - is built around exactly that requirement, and it's the reason this node pair is worth understanding instead of just wiring.
What it is
In the Drama 3 family, this is the node that turns a recording plus its words into a DRAMA3_VOICE the generator can perform in. It's the front half of the clone workflow; IAMCCS_Drama3GenerateGPU is the back half. If you only want a default speaker, skip this node entirely and leave the generator's voice socket empty.
The wider TTS picture is worth one line of context: cloning is the job that moved fastest in open TTS, and the models split cleanly into "fast and generic" (Kokoro, 82M, no cloning at all) versus "clone from a short reference" (this territory). Drama 3 sits in the second camp, where a short clean reference and a correct transcript are the difference between a usable voice and a mush of accent.
How it works
The logic in iamccs_drama3_gpu.py is short and readable, and the branch is the whole story:
text = transcript.strip()
if not text:
if asr_model == "none":
raise ValueError(...)
So - if you typed the transcript, it goes straight through. If you left it blank, the node loads a Qwen3-ASR model, transcribes your reference clip with language='auto' and a 4096-token budget, and uses that text. Either way, the final call is upstream Drama3EncodeVoice(codec, audio, transcript), and the transcript is returned to you as a string output.
Why it matters: the encoder is aligning your audio against known words. Hand it the wrong words and it has nothing correct to align against - the resulting voice identity is approximate at best. Automatic Whisper-style downloads are deliberately not part of this path; the pack's docstring says no implicit downloads, and the code holds to it.
Two of its outputs are more useful than they look. voice is the DRAMA3_VOICE for the generator's optional socket. reference_transcript is the text it actually used - wire it into a text display or a prompt, because when a clone sounds wrong, the first thing to check is whether the ASR gave you back something sane.
The inputs a beginner actually sets
- codec - from
IAMCCS_Drama3GPUCodecLoader. Yes, the voice encoder needs the codec too; that's where the model's voice space lives. - audio - one reference clip. Clean, single speaker, no music bed, no room reverb doing the work. Garbage in is the normal outcome of a phone recording in a kitchen.
- transcript - the exact words, including the "um" if it's audible. Getting this right is worth two minutes.
- asr_model -
noneplus any file inComfyUI/models/asrwhose name startsqwen3_asr_. Pick a model and leave the transcript blank if you'd rather bootstrap; then readreference_transcript, fix its mistakes, and paste it back in as the manual transcript for the take that counts. That loop is the practical way to use this node.
Installing it
Standard pack install - ComfyUI Manager, search IAMCCS Nodes, restart, hard-refresh - or:
cd ComfyUI/custom_nodes
git clone https://github.com/IAMCCS/IAMCCS-nodes.git
Then, specific to this node: the pinned ComfyUI-Drama3 runtime must be installed as its own pack (this node calls Qwen3ASRLoader, Qwen3ASRTranscribe and Drama3EncodeVoice through it). For the ASR route you also need a Qwen3-ASR model in a new folder, ComfyUI/models/asr - the pack registers that folder path itself on import, so you don't have to touch extra_model_paths.yaml. CUDA is mandatory; the node refuses CPU.
Where people get burned
"Enter the exact reference transcript or choose the installed Qwen3-ASR model." Both routes are shut: transcript empty, asr_model on none. Type the words or install an ASR file.
"Qwen3-ASR returned no reference words." The clip is silent, mostly music, or too short to transcribe. Trim a clean 5–15 second stretch of speech and try again - then fix the transcript by hand.
The ASR dropdown only shows none. Nothing in models/asr starts with qwen3_asr_. Same filename-prefix rule as everywhere else in this pack.
A cloned voice that keeps drifting. Nine times out of ten it's a sloppy transcript or a reference clip with a second speaker bleeding in. Re-encode from a cleaner take before you go hunting for settings.
One voice per node. Want two speakers in one scene? Encode two clips through two of these nodes; the wrapper generator takes a single voice socket, so a real two-hander goes through the upstream runtime's multi-voice input.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| codec | DRAMA3_CODEC | — | |
| audio | AUDIO | — | |
| transcript | STRING | — | |
| asr_model | COMBO | none | 1 options: none |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| voice | DRAMA3_VOICE | — |
| reference_transcript | STRING | — |