ComfyUI Node

DiaTTS Run

Make two cloned voices have a conversation in one pass

By billwuhao·Created about a year ago·Updated about a year ago· 11
DiaTTS Run
  • audio_s1
  • audio_s2
  • audio
text
prompt
max_new_tokens3000
cfg_scale3.0
temperature1.30
top_p0.95
cfg_filter_top_k30
unload_modeltrue
save_speakerstrue
speakers_idA_and_B

What it is

This is the node the whole ComfyUI_Dia pack exists for: it takes two reference voice clips and a script, and generates a complete two-person conversation in a single pass - both voices cloned, no per-line generation, no stitching. The TTS landscape covered in the audio-generation doc is almost all single-speaker (Chatterbox, F5-TTS, Kokoro). This is the dialogue corner of that map, and it's a genuinely different thing.

Under the hood it's the nari-labs Dia-1.6B model, a sequence-to-sequence speech model that turns text into audio-codec tokens (via the Descript Audio Codec, the DAC.speech.v1.0 weights the pack asks for) and decodes them back to a 44.1 kHz waveform. The clever part is how cloning works: it's in-context. The two reference clips aren't fine-tuned into the model - they're fed in as an audio prompt alongside a text transcript, and the model imitates both voices for the new lines. That's why the wiring is what it is.

The inputs that matter

The two inputs that matter most:

  • audio_s1 / audio_s2 - the reference voices. Wire two LoadAudio nodes (or DiaSpeakersPreview if you saved a pair before). These are your cast.
  • prompt - the transcript of those reference clips, in [S1] ... [S2] ... format. Do not skip this. Community testing of the Dia model is blunt: without a transcript of the sample audio, cloning comes out as gibberish. The reference clips teach the timbre; the transcript tells the model who says what.
  • text - the new dialogue you want, same [S1] / [S2] format. For long scripts, split into blocks separated by blank lines; each block generates separately and gets concatenated, which is how arbitrary-length output works here.

The rest of the inputs are generation dials with sensible author defaults: max_new_tokens (3000), cfg_scale (3.0), temperature (1.3), top_p (0.95), cfg_filter_top_k (30). Leave them alone until you're chasing a specific artifact. One you will touch: unload_model defaults to true, which frees your VRAM after every run - but the model is ~10GB, so that means reloading it each time. For back-to-back runs set it false and let it sit in memory. The two optional inputs, save_speakers and speakers_id, persist the voice pair so DiaSpeakersPreview can reload it next session.

The single audio output is a normal ComfyUI AUDIO tensor - feed it to PreviewAudio, SaveAudio, or pass it to anything that takes audio. Since the pack generates and concatenates internally, one run out is the whole conversation.

Install

Install from the README:

cd ComfyUI/custom_nodes
git clone https://github.com/billwuhao/ComfyUI_Dia.git
cd ComfyUI_Dia
pip install -r requirements.txt   # pydantic + descript-audio-codec

Then two model downloads, both under ComfyUI/models/TTS/: the entire Dia-1.6B directory from HuggingFace (nari-labs/Dia-1.6B), and descript-audio-codec's weights.pth renamed to weights_44khz_8kbps_0.0.1.pth and placed in TTS/DAC.speech.v1.0/. ComfyUI Manager search "ComfyUI_Dia" handles the code side if you prefer.

What to expect, honestly

What to expect, honestly. This is a niche, fresh pack - there are a couple of competing Dia wrappers around, and this one's edge is speaker save/load plus a Gemini-scripted workflow. The model itself wants a decent GPU (people have run it on 6GB cards, 10GB VRAM is the comfortable zone) and a single dialogue takes on the order of 30–45 seconds. Two real limitations from the community: because both voices come from reference clips, you generally get two voices of the same gender, so don't plan a man-woman duet from two female clips; and the text has to use the dialogue format - no freeform assistant-style TTS. It also supports oral tags like (laughs), (sighs), (clears throat) in the script for a bit of life.

Where people get burned: empty text or prompt throws a hard error, a missing reference transcript makes the clone garbled, and the unload_model default makes repeat runs feel glacial. Respect the format, keep unload_model off when you're iterating, and this is one of the few local setups where you can have two cloned voices argue convincingly in a single node.

Category🎤MW/MW-Dia

Inputs (12)

NameTypeDefaultDescription
textSTRING
promptSTRING
audio_s1AUDIO
audio_s2AUDIO
max_new_tokensINT3000860–3072
cfg_scaleFLOAT3.01–5
temperatureFLOAT1.301–1.5
top_pFLOAT0.950.8–1
cfg_filter_top_kINT3015–50
unload_modelBOOLEANtrue
save_speakersoptBOOLEANtrue
speakers_idoptSTRINGA_and_B

Outputs (1)

NameTypeDescription
audioAUDIO