NanoBanana - TTS Multi-Speaker Dialogue
Scripted two-voice dialogue, each speaker with their own voice
- network
- audio
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.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| model | COMBO | gemini-2.5-flash-preview-tts | 3 options: gemini-2.5-flash-preview-tts, gemini-2.5-pro-preview-tts, gemini-3.1-flash-tts-preview |
| dialogue | STRING | Alice: Hi Bob, how are you? Bob: I'm great, thanks! | Plain-text dialogue with `Speaker:` prefixes. |
| speaker_1_name | STRING | Alice | — |
| speaker_1_voice | COMBO | Kore | 30 options: Zephyr, Puck, Charon, Kore, Fenrir, Leda, +24 |
| speaker_2_name | STRING | Bob | — |
| speaker_2_voice | COMBO | Puck | 30 options: Zephyr, Puck, Charon, Kore, Fenrir, Leda, +24 |
| custom_modelopt | STRING | — | |
| networkopt | NB_NETWORK | Optional. Wire a NanoBanana - Network Route node here to route this request through that proxy (e.g. US egress). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |