Nodes/Qwen3-TTS - Voice Synthesis & Cloning/πŸ“‡ Qwen3-TTS RoleBank
ComfyUI Node

πŸ“‡ Qwen3-TTS RoleBank

The index card file for your dialogue cast

By flybirdxxΒ·Created 7 months agoΒ·Updated 3 months agoΒ· 1,874
πŸ“‡ Qwen3-TTS RoleBank
  • prompt_1
  • prompt_2
  • prompt_3
  • prompt_4
  • prompt_5
  • prompt_6
  • prompt_7
  • prompt_8
  • role_bank
β—„role_name_1Role1β–Ί
β—„role_name_2Role2β–Ί
β—„role_name_3Role3β–Ί
β—„role_name_4Role4β–Ί
β—„role_name_5Role5β–Ί
β—„role_name_6Role6β–Ί
β—„role_name_7Role7β–Ί
β—„role_name_8Role8β–Ί

DialogueInference is the flashy node in the Qwen3-TTS pack, but it can't do anything until it has a cast. RoleBank is the cast list. It collects up to eight voice clone prompts, gives each a name, and packages them into a QWEN3_ROLE_BANK that DialogueInference matches against when it reads your script. Think of it as an index card file: each card is a role name pinned to a voice, and the whole file gets handed to the dialogue engine in one object.

How it works

The node's inputs are eight pairs of role_name_N and prompt_N (1 through 8). Each prompt_N is a VOICE_CLONE_PROMPT - the reusable voice-features object that comes out of VoiceClonePrompt or LoadSpeaker. That's the only kind of input it takes; you don't type a description of a voice here, you wire in an actual extracted voice. It also has a role_name_N string next to each, defaulting to "Role1" through "Role8".

The mechanism is embarrassingly simple, which is why it works: it builds a Python dict of {role_name: voice_clone_prompt} and passes it out as the single role_bank output. Pairs where you've left the name blank or haven't connected a prompt are simply dropped - so you can fill in two roles and leave six empty without breaking anything.

What you actually set

Only two things per role, and only as many roles as your scene needs:

  • role_name_N - the exact string your script will use. This matters more than it looks: DialogueInference matches role names character-for-character, so "Alice" in the bank and "alice:" in the script don't line up.
  • prompt_N - the voice clone prompt for that character.

A typical build: one VoiceClonePrompt per character (or one LoadSpeaker per saved voice), all feeding into RoleBank, with the bank feeding into DialogueInference. Reuse the same bank across scripts and you get a consistent recurring cast - same voices every time, no re-extraction.

Install

RoleBank ships in flybirdxx/ComfyUI-Qwen-TTS ("Qwen3-TTS - Voice Synthesis & Cloning"). Install via ComfyUI Manager (search "Qwen3-TTS") or:

cd ComfyUI/custom_nodes
git clone https://github.com/flybirdxx/ComfyUI-Qwen-TTS
cd ComfyUI-Qwen-TTS
pip install -r requirements.txt

Restart ComfyUI. Remember the pack-wide rule: transformers 5.0+ breaks it, so pin pip install "transformers>=4.57.0,<5.0.0" if you haven't.

Common issues

The two classic problems are both name mismatches: a role in the script that isn't in the bank (DialogueInference silently skips it - your line just never gets spoken), and a bank where the name you typed has a stray space or different casing. Also note RoleBank is dumb on purpose: it won't warn you if the same prompt is wired into two roles, so two characters can end up sounding identical and you'll only hear it in the output. There's no model loading here at all - this node is pure data packaging, so if it fails, it fails fast and the error message tells you exactly which input is missing.

CategoryQwen3-TTS

Inputs (16)

NameTypeDefaultDescription
role_name_1optSTRINGRole1β€”
prompt_1optVOICE_CLONE_PROMPTβ€”
role_name_2optSTRINGRole2β€”
prompt_2optVOICE_CLONE_PROMPTβ€”
role_name_3optSTRINGRole3β€”
prompt_3optVOICE_CLONE_PROMPTβ€”
role_name_4optSTRINGRole4β€”
prompt_4optVOICE_CLONE_PROMPTβ€”
role_name_5optSTRINGRole5β€”
prompt_5optVOICE_CLONE_PROMPTβ€”
role_name_6optSTRINGRole6β€”
prompt_6optVOICE_CLONE_PROMPTβ€”
role_name_7optSTRINGRole7β€”
prompt_7optVOICE_CLONE_PROMPTβ€”
role_name_8optSTRINGRole8β€”
prompt_8optVOICE_CLONE_PROMPTβ€”

Outputs (1)

NameTypeDescription
role_bankQWEN3_ROLE_BANKβ€”