Nodes/ComfyUI-IntoTheLatent-Utils/ITL Breeze TTS Loader
ComfyUI Node

ITL Breeze TTS Loader

The Node That Decides Whether Breeze TTS Fits on Your Card

By Into-The-Latent·Created about a month ago·Updated about 19 hours ago· 2
ITL Breeze TTS Loader
    • model
    attentionsdpa
    fast_pathfalse

    Breeze TTS 2 is a local, 3B text-to-speech model (BreezeBlue, English + Chinese) with three modes: clone a voice from a few seconds of audio, describe a voice in words, or keep a reference voice and direct the performance. No API, no key, no per-character billing. This loader is the only door into it - every generate node in the pack takes a model link from here and refuses to run without one.

    It is also the node that decides whether the whole thing is viable for you, and the answer is stricter than most ComfyUI audio tools. There is no CPU path. No NVIDIA GPU, no Breeze. Once loaded it sits on roughly 7.7 GiB of VRAM, or about 14.4 GiB with fast_path on.

    What it actually does

    Two jobs, both in one execute() call. First, weights: the first run pulls the ~7.2 GB snapshot from Hugging Face into models/breeze_tts/Breeze-TTS-2/. Downloads resume, and the loader verifies its list of required files before loading - including file size, so a killed download that left 0-byte stubs gets re-fetched instead of producing a cryptic load error later. Second, it loads the tokenizer, the model and the audio tokenizer, and hands the graph a small immutable key rather than the tensors themselves.

    That key detail matters more than it sounds. Because the graph carries a key, ComfyUI's output cache never holds a second reference to the model, and the pack's own internal cache is what keeps it resident. The flip side: ComfyUI's model manager cannot see that cache and can never evict it. That's why the pack has an Unload node and an unload_after toggle on every generate node. Run Breeze and then an image or video model in the same workflow without one of them, and you'll OOM on the second model.

    The two inputs that matter

    attention is the attention kernel. sdpa is the default and the fast one; eager is upstream's reference path. Reach for eager only if sdpa is producing something that sounds broken - otherwise leave it.

    fast_path captures CUDA graphs for every stage (upstream calls it --fast-all). Faster generation, roughly double the VRAM, and a noticeably slower first run while graphs are captured. One real trap here: changing the Advanced nodes' sampling settings forces a re-capture, so your first generation after a tweak takes a few seconds longer. The loader also refuses fast_path outright on transformers 5.x, and that's deliberate - Breeze's CUDA graphs replay against transformers' StaticCache, which on 5.x advances from a Python integer a replayed graph never re-executes. Capturing anyway would write every step into the same cache slot: silently wrong audio. So it refuses. On transformers 5, turn fast_path off and everything else works.

    Output is a single model socket of type BREEZE_TTS. Wire it into any of the six generate nodes.

    Install

    ComfyUI Manager is the easy path: search ComfyUI-IntoTheLatent-Utils and install, then restart. Manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/Into-The-Latent/ComfyUI-IntoTheLatent-Utils
    pip install -r ComfyUI-IntoTheLatent-Utils/requirements.txt
    

    The model code is vendored in the repo (a fork of breezeblue-ai/breeze-tts), so nothing is fetched from GitHub at runtime. One install detail worth knowing before you blame the pack: it declares no torch dependency at all, on purpose, so the install will never replace your CUDA torch build with a CPU-only wheel - the loader just checks for torch >= 2.7 and tells you if yours is too old. If the nodes report missing dependencies, Manager's Try fix on this pack is the intended repair.

    Common issues

    "Breeze TTS needs an NVIDIA GPU (CUDA)" - that's the honest upstream limit, not a config mistake. There's no fallback.

    OOM after the voice, not during it. The classic: Breeze worked, then your checkpoint or Wan render died. Roughly 7.7 GiB is still resident because nothing evicted it. Turn on unload_after on the generate node, or wire the audio through the Unload node. The next Breeze node reloads (~20 s).

    Everything sounds fine but the pack looks unmaintained. It is: the repo is published for reference, issues are disabled and pull requests are closed automatically. You fork it, you own it. Related: this pack replaces ComfyUI-AI2Go-Utils, and the node IDs changed from AI2Go* to ITL*, so old workflows won't auto-pick these up. Keep the old pack installed if you need those; they coexist.

    One caveat that isn't technical

    The weights are research and non-commercial (BreezeBlue Research and Non-Commercial License), which is increasingly normal for open TTS - F5-TTS is CC-BY-NC, and Higgs Audio went non-commercial at v3. And unlike Chatterbox, Breeze has essentially no community track record yet: it's a new name in a field whose default local answer is still Chatterbox. That's not a reason to skip it. It's a reason to test it on your own material before building a pipeline on it.

    CategoryInto The Latent/audio

    Inputs (2)

    NameTypeDefaultDescription
    attentionCOMBOsdpaAttention kernel. 'sdpa' is faster; 'eager' is upstream's reference path.
    fast_pathBOOLEANfalseCapture CUDA graphs for every stage (upstream --fast-all). Faster generation, ~2x VRAM, longer first run. Changing sampling settings re-captures.

    Outputs (1)

    NameTypeDescription
    modelBREEZE_TTS