Skip to content

Releases: Saganaki22/ComfyUI-Breeze-TTS-2

v1.4.7

Choose a tag to compare

@Saganaki22 Saganaki22 released this 21 Oct 20:19

Fix Breeze TTS 2 Speaker loading when ComfyUI is served under a subpath such as /cui/.

  • Correct the frontend app import to ../../scripts/app.js, keeping it within the ComfyUI mount.
  • Preserve support for installations served at the site root.

Verified against a local ComfyUI instance: module URLs at / and /cui/, plus speaker creation with audio player and upload widgets under /cui/. URL-resolution regression checks also cover nested subpaths.

v1.4.6

Choose a tag to compare

@Saganaki22 Saganaki22 released this 15 Sep 09:56

Model path fix from issue #8: the pack now finds its models in every models tree mapped through extra_model_paths.yaml - no yaml edits required.

Fixed

  • #8 - Models only found in the running install's models folder: users who pin their models at a fixed location (portable installs, a shared drive) and map them into ComfyUI via extra_model_paths.yaml had to fix paths every time they switched installs. The loader (breezetts2) and the Whisper transcriber (audio_encoders) now search every models tree ComfyUI knows about, including yaml sections that only list standard folders like checkpoints: / loras: / vae:. Put a breezetts2/ folder (and audio_encoders/ for Whisper) inside your mapped models directory and it is picked up automatically.
    • How it works: ComfyUI already registers every yaml-mapped path at startup; the pack derives the mapped models roots from those registrations and probes each root for its model folders.
    • Guardrails: mapped locations are read-only to the pack - only folders that already exist are searched, nothing is ever created or written inside a mapped location, and new downloads always land in the running install's own models/ folder.
    • Explicit mapping still works: a breezetts2: (or audio_encoders:) key in a yaml section is honored as before.
    • Search order: running install's models/ folder first, then explicitly registered paths, then mapped trees; "model not found" errors now list every path searched.

Notes

  • Also from #8: fixed-seed voice drift between lines in pure design mode is a model limitation (each line is generated independently; a fixed seed fixes voice only for identical text + instruction). For locked timbre per speaker, wire a reference clip (clone mode).

Full changelog: v1.4.5...v1.4.6

v1.4.5 - heal poisoned CUDA RNG (ComfyUI 0.35 crash) + quiet startup

Choose a tag to compare

@Saganaki22 Saganaki22 released this 11 Sep 06:20

Two fixes: the ComfyUI 0.35.0 generation crash from issue #10, and the scary startup stack from issue #9.

Fixed

  • #10 - Offset increment outside graph capture encountered unexpectedly (ComfyUI 0.35.0+): ComfyUI 0.35's new model compiler captures CUDA graphs around model execution. A capture that fails partway (mempool conflict, graph break, invalid op) leaves the shared default CUDA generator stuck, and every later random-sampling call process-wide raises this error - surfacing in whichever node samples first, often BreezeTTS2VoiceDesign, in either decode mode. The pack now probes the RNG state before generating, heals it automatically (generator state swap, plus stream/allocator recovery for invalidated captures) and retries once. Capture failures under decode_mode=cuda_graphs also heal before falling back to eager, and the loader no longer crashes when the RNG cannot be restored. No settings change needed - update and restart ComfyUI.

  • #9 - Windows fatal exception: code 0xc0000139 stack at startup: this was the pack's torchcodec compatibility check working as intended - a torchcodec build made for a different torch minor fails its DLL load, is stubbed out, and all nodes register normally (Registered 7 node(s) right after the trace). The handled error no longer prints a faulthandler stack, so startup is quiet again. Note: the sage attention error mentioned in #9 is unrelated to this trace; a generation-time traceback (plus GPU / torch / sageattention / triton-windows versions) is needed to chase that one.

Notes

  • Updating from v1.4.3 skips no fixes: v1.4.4 contained only the #10 heal, v1.4.5 only this silencing.
  • After updating, restart ComfyUI once so the new code (and a clean RNG state) is loaded.

Full changelog: v1.4.3...v1.4.5

v1.4.3 — heal evicted bundles + flash_attn stub detection

Choose a tag to compare

@Saganaki22 Saganaki22 released this 04 Sep 15:51

Fixes

  • #6 — Crash after ComfyUI evicts the model ('NoneType' object has no attribute 'parameters'): ComfyUI's node cache keeps the bundle object from the Load Model node alive across prompts, but an unload (the unload_all_models hook, VRAM cache buttons, or a settings change like toggling decode_mode) dropped its weights, so the next run crashed inside encode_reference_audio. Generation entry points now reload an evicted bundle in place, so cached references heal automatically — no more manual cache clearing.
  • ComfyUI registry leak: _unregister_from_comfy matched the patcher's nn.Module instead of the patcher itself, stranding dead entries in ComfyUI's model registry (the memory leak with model BreezeInferenceModel warnings during load/unload cycles).
  • flash_attn detection: availability now requires installed package metadata, not just an importable module. Stub flash_attn modules injected by other packs (e.g. SeedVR2) no longer make attention=auto pick flash_attention_2 and explode inside transformers with PackageNotFoundError; auto falls back to sdpa, and an explicit flash_attention selection raises a clear ImportError.

Thanks to @Donatello-za for the flash_attn metadata-check approach (PR #4, implemented directly on main).

Full changelog: v1.4.2...v1.4.3

v1.4.2 — transformers 5.16 config fix + CUDA graph cache reset

Choose a tag to compare

@Saganaki22 Saganaki22 released this 30 Aug 12:22

v1.4.2 — transformers 5.16 config fix + CUDA graph cache reset

Merges PR #2 by @EarsT913831CALS — thanks for the thorough report, the benchmarks, and the raw data. Also independently confirmed by @thr12345.

What''s fixed

  • P2 — AutoConfig registration (transformers >=5.16): the custom breeze / breeze_depth_decoder_model config types are now registered with AutoConfig. Without this, AutoTokenizer.from_pretrained() fell back to a generic PreTrainedConfig whose RoPE standardization crashed with AttributeError: ''PreTrainedConfig'' object has no attribute ''max_position_embeddings''.
  • P5 — CUDA graph capture (transformers >=5.4): StaticLayer.update() switched to arange + cumulative_length positioning in 5.4+, so the two graph warm-ups left the shared StaticCache dirty and capture crashed with a device-side assert. The cache is now reset before each warm-up and once before capture (resets are outside the recorded graph and are not replayed at inference).

Follow-up change

Registration moved from per-load (as submitted in the PR) to module init in native.py, matching the official Breeze implementation.

Verification

  • PR author''s benchmarks (RTX 5070 Ti, transformers 5.3.0 + 5.16.1, eager + cuda_graphs, 3 seeds + warmup): no RTF/VRAM/WER regression; cuda_graphs ~2.5x faster than eager; 0.00% WER on all runs. Raw data attached to PR #2.
  • This repo (RTX 5090, transformers 5.3.0): AutoConfig resolves breeze correctly at import; CUDA graph capture + replay generation pass.

v1.4.1 — transformers 5.4+ load fix

Choose a tag to compare

@Saganaki22 Saganaki22 released this 29 Aug 13:40

v1.4.1 — transformers 5.4+ load fix

Hotfix for issue #3: the pack failed to load entirely on transformers 4.57.0–4.57.1 and 5.4+ (including current 5.16.x).

What was wrong

check_model_inputs changed calling convention four times across supported transformers versions (factory on 4.57.2+, func=None on 5.0–5.1, absent on 5.2–5.3, direct decorator on 4.57.0–4.57.1 and 5.4+). The vendored codec's compatibility shim only activated when the import failed, so on 5.4+ the import succeeded and @check_model_inputs() crashed at import with TypeError: check_model_inputs() missing 1 required positional argument: 'func'.

Changes

  • vendor/codec_model.py: the shim is now unconditional — the upstream decorator is no longer imported at all (it is validation-only), so no future calling-convention change can break loading again
  • native.py + vendor/codec_model.py: cache_position is now only passed to create_causal_mask / create_sliding_window_causal_mask when the installed transformers accepts it (removed in transformers ≥5.9)

Verification

  • Full generation test on transformers 5.3.0 (eager + masks exercised end-to-end)
  • Version matrix source-checked against the actual wheels: 4.57.0, 4.57.2, 4.57.3, 5.0.0, 5.2.0, 5.4.0, 5.9.0, 5.16.1

v1.4.0 — Multi-Speaker Dialogue

Choose a tag to compare

@Saganaki22 Saganaki22 released this 28 Aug 03:02

v1.4.0 — Multi-Speaker Dialogue

Generate whole conversations in one node, mixing cloned and designed voices.

New nodes

  • Breeze TTS 2 Speaker — one named cast member per node. Pick a reference clip with the built-in file picker (browse, upload, or drag-drop from ComfyUI/input), or wire audio in from a Load Audio node. Leave the transcript empty and it's auto-transcribed with Whisper (shown on the node afterwards). Select none and write an instruction instead to make it a designed voice — cloned and designed speakers can be mixed freely in one cast.
  • Breeze TTS 2 Multi-Speaker — wire up to 8 Speaker nodes in, paste the script, get one dialogue audio out.

Script formats

Plain text — one Name: line per line (continuation lines, [Name]: and **Name:** also work):

Ada: (sigh) Who steered my ship into the harbor wall this time?
Bob: Technically, captain, the harbor steered into us.

JSON paste — ideal for LLM-written dialogue:

[
  {"speaker": "Ada", "text": "(sigh) Who steered my ship into the harbor wall this time?"},
  {"speaker": "Bob", "text": "Technically, captain, the harbor steered into us."}
]

Accepts single objects, {"script": [...]} wrappers, and key aliases (name/character, line/content...). Speaker names match forgivingly (Ali G = alig), unknown names fail before any GPU time is spent, and vocal events work identically in both formats.

Quality of life

  • Console prints a pre-inference summary (speakers, turns, estimated seconds) then a progress bar per turn: [3/16] Bob (~6s)
  • Reference clips are encoded once per speaker; each speaker keeps a stable seed across turns so designed voices stay consistent
  • Quieter logs: duplicate prompt line removed, codec pinned resident (no more per-turn "prepared for dynamic VRAM" spam)
  • SKILL.md included — give it to any LLM agent with your character names/bios + target duration and it writes paste-ready dialogue JSON in the right format
  • New example workflow: a 4-speaker dialogue with reference clips included (example_workflows/)

Notes

  • Reference clips: keep under ~20 s (hard max 60 s) — they spend prompt budget at 12.5 tokens/sec
  • Requires a current ComfyUI frontend for the audio upload picker (verified on 1.51.x)

v1.3.1

Choose a tag to compare

@Saganaki22 Saganaki22 released this 27 Aug 19:12

Fixes

  • A torchcodec build made for a different torch version (e.g. torchcodec 0.15 with torch 2.10) no longer pops a Windows Entry Point Not Found dialog: the pack probes it with loader dialogs suppressed and automatically falls back to a stub, so all nodes load normally. Installing the torch-matched torchcodec (or uninstalling it) is still recommended.

v1.3.0

Choose a tag to compare

@Saganaki22 Saganaki22 released this 26 Aug 17:09

What's new

  • decode_mode loader option: cuda_graphs captures the depth decode loop into CUDA graphs — the captured decode runs 7-9x faster than the eager AIMDO-paged path (~3-4x faster end-to-end). Weights stay VRAM-resident in that mode; capture is thread-local so server stats polling can't break it, and any capture failure falls back to eager decode.
  • Flash attention now runs on the text encoder with Transformers 5.3+ (custom-registered FA2 path; upstream blocks it over softcapping this checkpoint does not have).
  • Allocator uncaptured free warning spam is silenced when releasing captured graphs.
  • Example workflow updated with the new option and screenshot.

v1.2.1

Choose a tag to compare

@Saganaki22 Saganaki22 released this 26 Aug 15:12
  • Example workflow expanded: Voice Clone + Voice Design + Voice Direction branches with a workflow screenshot`n- Chinese README renamed to README_ZH.md