Repository navigation
Releases: Saganaki22/ComfyUI-Breeze-TTS-2
Release list
v1.4.7
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
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.yamlhad 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 likecheckpoints:/loras:/vae:. Put abreezetts2/folder (andaudio_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:(oraudio_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
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 underdecode_mode=cuda_graphsalso 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 0xc0000139stack 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
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 (theunload_all_modelshook, VRAM cache buttons, or a settings change like togglingdecode_mode) dropped its weights, so the next run crashed insideencode_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_comfymatched the patcher'snn.Moduleinstead of the patcher itself, stranding dead entries in ComfyUI's model registry (thememory leak with model BreezeInferenceModelwarnings during load/unload cycles). - flash_attn detection: availability now requires installed package metadata, not just an importable module. Stub
flash_attnmodules injected by other packs (e.g. SeedVR2) no longer makeattention=autopickflash_attention_2and explode inside transformers withPackageNotFoundError;autofalls back tosdpa, and an explicitflash_attentionselection raises a clearImportError.
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
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_modelconfig types are now registered withAutoConfig. Without this,AutoTokenizer.from_pretrained()fell back to a genericPreTrainedConfigwhose RoPE standardization crashed withAttributeError: ''PreTrainedConfig'' object has no attribute ''max_position_embeddings''. - P5 — CUDA graph capture (transformers >=5.4):
StaticLayer.update()switched toarange + cumulative_lengthpositioning in 5.4+, so the two graph warm-ups left the sharedStaticCachedirty 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
breezecorrectly at import; CUDA graph capture + replay generation pass.
v1.4.1 — transformers 5.4+ load fix
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 againnative.py+vendor/codec_model.py:cache_positionis now only passed tocreate_causal_mask/create_sliding_window_causal_maskwhen 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
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). Selectnoneand 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
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 Founddialog: 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
What's new
decode_modeloader option:cuda_graphscaptures 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 freewarning spam is silenced when releasing captured graphs. - Example workflow updated with the new option and screenshot.
v1.2.1
- Example workflow expanded: Voice Clone + Voice Design + Voice Direction branches with a workflow screenshot`n- Chinese README renamed to README_ZH.md