Nodes/Breeze TTS 2 · T8star-Aix/Breeze TTS 2 · T8 逐句情感
ComfyUI Node

Breeze TTS 2 · T8 逐句情感

Per-Line Emotion Control for Breeze TTS 2

By T8mars·Created 14 days ago·Updated 2 days ago· 14
Breeze TTS 2 · T8 逐句情感
  • request
  • request
direction_modeinherit
direction语气温和而坚定,停顿自然。
cfg_scale0.0

The annoying part of voicing a script isn't finding the voice. It's the one line that needs to sound quiet and hesitant while everything around it is warm and confident. In Breeze TTS 2 you don't get that for free - every request you build carries a single delivery instruction, and the default flow asks you to rebuild the whole request to change the mood. This node (displayed as "T8 逐句情感", per-line emotion) is the fix: it takes an already-built request and rewrites just the emotion for this one line, right before generation.

What it actually does

Breeze TTS 2 is BreezeBlue's bilingual TTS model, and this whole pack is T8star-Aix's unofficial ComfyUI bridge for it. Requests travel through the graph as small packets of {mode, text, instruction, cfg_scale}. The LineDirection node sits between whichever request node you used (Design, Clone, Direction, or the desktop Voice Bundle node) and the generator.

The mechanism is simple and deliberate: it copies the request (dict(request) in the source), never mutates the upstream object, and returns a fresh one. That means you can fan one request out into several LineDirection nodes and A/B three moods without re-running anything upstream - and no branch poisons another, because nothing is shared.

Where the model actually listens is the natural-language instruction. Breeze steers delivery with plain sentences like "slow down, restrained and serious" - the README is explicit that this pack uses Breeze's native direction language rather than faking the 8-dimensional emotion vectors some other TTS models use. That's the thing you're rewriting here.

The three modes, and the inputs that matter

Everything hinges on one enum plus two fields:

  • request - a BREEZE_T8_REQUEST from any of the pack's four request nodes. The only required input, and the source of everything inherit keeps.
  • direction_mode - inherit, override, or neutral. Default inherit, which is a polite no-op: the request passes through untouched.
  • direction - the per-line natural-language instruction. Only used in override mode, but required there - set override and leave it blank and the node throws a field-level error instead of silently synthesizing.
  • cfg_scale - 0 means "keep whatever CFG the upstream request already set." Any other value (0.1–10) overrides CFG for this line only.

The semantics under the hood are worth knowing. override swaps in your direction and flips the request's mode: if it carries a reference voice it becomes a "direction" request (same speaker, new delivery), and if it was pure text-to-voice it stays a "design" request. neutral swaps in the pack's built-in clean default - "Speak clearly and naturally." - for an emotion-flattened take that still keeps whoever the voice is. This is the mode to reach for when Breeze is overacting.

Wiring it in

The pack's use order is: Model Loader → request node → Generation Settings → Generate. LineDirection slots between the request and Generate, and its single output is another request - so you can chain it with T8_BreezeTTS_Generate directly. Write directions in the same language as your line; Breeze is bilingual and its direction text is just language.

One taste: the inline vocal events ([笑] [咳嗽] (laugh) (sigh), etc.) live in the line text, not the direction. So [叹气] 我们还是分开吧。 plus an override like "语气克制而悲伤,停顿自然。" is the whole recipe for a line that lands.

Installing it

Search "Breeze TTS 2 · T8star-Aix" in ComfyUI Manager and install, then restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/Comfyui-breeze-tts.git comfyui-breeze-tts-T8
python -m pip install -r comfyui-breeze-tts-T8/requirements.txt

The requirements file is deliberately tiny - accelerate, huggingface_hub, soundfile, safetensors and friends - and it never installs torch/transformers/numpy. The host owns those; the pack only checks versions and refuses to register if your transformers isn't >=4.57,<6 (Python 3.10–3.12 required). The actual model downloads on your first Model Loader run from BreezeBlue/Breeze-TTS-2 (a pinned revision) into ComfyUI/models/breeze_tts/ - after you tick accept_model_license. Don't skip that checkbox: Breeze TTS 2 is research-and-non-commercial only, not open source.

Troubleshooting

The error messages are unusually honest, which helps. "request must come from a T8 Breeze request node" means you fed it something else's output. "override requires a direction" means exactly that - fill the field or pick neutral. And if generation itself errors on empty text, remember this node only changes emotion; it doesn't carry the line. Everything else that can bite you (model OOM on load, interrupted downloads) lives upstream in the Model Loader, not here. This is the rare node whose whole job is not making things worse.

CategoryT8star-Aix/Audio/Breeze TTS

Inputs (4)

NameTypeDefaultDescription
requestBREEZE_T8_REQUEST
direction_modeCOMBOinherit3 options: inherit, override, neutral
directionSTRING语气温和而坚定,停顿自然。override 模式使用的本句指令。
cfg_scaleFLOAT0.00–100 保留上游设置;其他值仅覆盖本句 CFG。

Outputs (1)

NameTypeDescription
requestBREEZE_T8_REQUEST