Nodes/ComfyUI-NanoBanana2/NanoBanana - TTS Multi-Speaker Dialogue
ComfyUI Node

NanoBanana - TTS Multi-Speaker Dialogue

Scripted two-voice dialogue, each speaker with their own voice

By IxMxAMAR·Created 6 months ago·Updated about a month ago· 4
NanoBanana - TTS Multi-Speaker Dialogue
  • network
  • audio
api_key
modelgemini-2.5-flash-preview-tts
dialogueAlice: Hi Bob, how are you? Bob: I'm great, thanks!
speaker_1_nameAlice
speaker_1_voiceKore
speaker_2_nameBob
speaker_2_voicePuck
custom_model

The single-voice TTS node in this pack can fake a conversation with speaker tags, but it's one model voice the whole way through. TTSMultiSpeaker is the version that does it properly: you assign speaker one and speaker two their own prebuilt voices, write a script with Speaker: prefixes, and get back a real two-voice AUDIO take. If you're building a podcast-style segment, a narrated scene, or any "two people talking" audio, this is the node you want - no local models, no manual audio splicing.

It uses Gemini's MultiSpeakerVoiceConfig under the hood, which is exactly the mechanism Google built for this: explicit per-speaker voice assignment rather than hoping the model invents distinct voices from tags. That's the difference between "it kind of works" and "Alice genuinely sounds like Alice for the whole run."

How it works

You give it a dialogue block in plain text with Speaker: prefixes - the default shows the pattern:

Alice: Hi Bob, how are you?
Bob: I'm great, thanks!

Then you set speaker_1_name / speaker_1_voice and speaker_2_name / speaker_2_voice. The node matches every line whose prefix matches a speaker name, assigns the corresponding voice, and runs the whole dialogue through Gemini TTS in one call, returning ComfyUI's native AUDIO type (24 kHz waveform tensor). Like the single-speaker node, there's the same ~32k-character practical ceiling on the text.

The inputs

  • api_key, model - the same three Gemini TTS models, Flash default.
  • dialogue - multiline, Speaker: prefixes. Keep names consistent with what you assign below.
  • speaker_1_name / speaker_1_voice - default Alice / Kore.
  • speaker_2_name / speaker_2_voice - default Bob / Puck.
  • custom_model, network - overrides.

Output: one audio (AUDIO).

Installing it

Same pack, same install: ComfyUI Manager → search NanoBanana2, or

cd ComfyUI/custom_nodes
git clone https://github.com/IxMxAMAR/ComfyUI-NanoBanana2
pip install google-genai

Python 3.10+, google-genai >= 0.8.0, API key from aistudio.google.com.

Where people get burned

Two speakers only - this is a dialogue node, not a full cast; for three-plus voices you'll need multiple nodes and a mix. The most common mistake is mismatched names: if a line in dialogue uses a prefix that isn't speaker_1_name or speaker_2_name, it won't get a voice assignment and the take breaks. Keep the prefixes exactly aligned with the two names. And remember the pack's always-executes behavior: every queue hit is a billed multi-turn TTS call, so don't loop this accidentally.

CategoryNanoBanana2/Audio

Inputs (9)

NameTypeDefaultDescription
api_keySTRING
modelCOMBOgemini-2.5-flash-preview-tts3 options: gemini-2.5-flash-preview-tts, gemini-2.5-pro-preview-tts, gemini-3.1-flash-tts-preview
dialogueSTRINGAlice: Hi Bob, how are you? Bob: I'm great, thanks!Plain-text dialogue with `Speaker:` prefixes.
speaker_1_nameSTRINGAlice
speaker_1_voiceCOMBOKore30 options: Zephyr, Puck, Charon, Kore, Fenrir, Leda, +24
speaker_2_nameSTRINGBob
speaker_2_voiceCOMBOPuck30 options: Zephyr, Puck, Charon, Kore, Fenrir, Leda, +24
custom_modeloptSTRING
networkoptNB_NETWORKOptional. Wire a NanoBanana - Network Route node here to route this request through that proxy (e.g. US egress).

Outputs (1)

NameTypeDescription
audioAUDIO