SemBridge Text to Speech
44.1 kHz speech where every seed is a different stranger
- model
- prompt_audio
- audio
- report
There's a crowded field of local TTS and most of it optimises for the same thing: say this sentence fast, in a voice I've cloned, well enough for a video voiceover. Kokoro runs on CPU, Chatterbox clones from five seconds of reference and beats ElevenLabs in blind tests often enough to argue about. Against that, SemBridge Text to Speech is a strange, slightly overbuilt option - and it's the one to reach for when you care about the sample rate, or when you want the same voice to sing.
This is the plain speech path of the SemBridge model: type text, pick a seed, get audio. Mono, 44.1 kHz, a AUDIO wire that plugs into anything downstream. No key, no API, no network call at run time, weights on your disk.
What you get without a reference
The default voice is the seed. One voice per seed, effectively - set seed to 42 and you get a particular speaker, change it and you get someone else. That's a genuinely different ergonomic from the rest of the field, where you either pick from a fixed voice list (Kokoro, Piper) or clone from a sample (Chatterbox, F5). Here the voices aren't curated and they aren't stable across torch versions, so treat a good seed as something to write down rather than something to rely on forever.
The seed also fixes the sampling. Reproducibility holds for the same model, request, seed, settings and environment - across torch versions or GPUs the numbers shift and the stop point can move by a few patches. Same machine, same audio; someone else's machine, roughly the same performance.
Cloning a voice, properly
To speak in a specific voice, wire a recording into prompt_audio and type its exact transcript into prompt_text. Both, or it errors - the model conditions on the pair, and the node refuses to run with one half missing rather than silently ignoring your clip.
That exactness is the whole difficulty. Whisper-transcribe the clip and paste the result; a paraphrase degrades the conditioning. And prompt_task exists because a reference isn't always spoken - set it to speech here (or leave it on auto, which resolves to speech on this node) and use singing only if you're coaxing a sung reference through, which needs the score token string from Score Preview as its text rather than the lyrics. Only the first item of a batch is used, so don't try to feed a folder of samples.
The model card asks for permission on reference recordings and disclosure of synthetic audio. Both are cheap to honour.
The settings that matter
text is the whole job - Chinese or English only, those are the only two languages the model card claims. Leading whitespace gets stripped, which is a deliberate hack: transformers 4.x and 5.x tokenise a leading space differently, and stripping it gives identical token IDs on both.
flow_steps defaults to 10 for speech, which is the model's own default; the 20 you see in examples is the singing setting. cfg_value 2.0 and temperature 1.0 are also the model defaults and I'd leave them all alone until something sounds wrong.
max_new_patches is a ceiling, not a target: one patch is 80 ms, so 500 is a 40-second upper bound. Generation usually stops earlier on its own. min_new_patches stops it from bailing out before it's said anything. decoder on auto gives you the native causal decoder for speech, which is the setting you want unless you're deliberately A/B-ing vocoders.
Outputs are audio and report. The report is a JSON string with the decoder, patches_generated, stopped_early, audio_seconds, generation_seconds, realtime_factor, peak VRAM and the model folder - genuinely the fastest way to answer "did it stop early because of my text or because of my cap?"
Install
cd ComfyUI/custom_nodes
git clone https://github.com/hiroki-abe-58/ComfyUI-SemBridge
python -m pip install -r ComfyUI-SemBridge/requirements.txt
python ComfyUI-SemBridge/tools/download_model.py --models-dir ComfyUI/models/sembridge
That's soundfile, and nothing else beyond what ComfyUI already has. Do not pip install sembridge - it pins torch below 2.9 and the model code is vendored inside the pack. You need a ComfyUI new enough for the V3 node API (v0.38.0 was used), Python 3.10+, and an NVIDIA card for reasonable speed; the weights are ~4.3 GB. Restart, then load workflows/gui/tts_basic.json.
Where it actually disappoints
It isn't fast. Generation runs at about 1.2 to 1.6 seconds of compute per second of audio on an RTX 5090, with roughly 2.9 GiB resident. Chatterbox and F5-TTS both beat that comfortably. If you're batching an audiobook, SemBridge is the wrong tool and Kokoro is right there.
Long text degrades before it truncates. On a 29-second test utterance of three long sentences, the model stopped by itself at 368 patches - under the cap - and Whisper's transcript was missing the final six words. It didn't fail loudly; it just quietly dropped the end. Split long scripts into sentence-sized chunks and stitch them. That's also how you get past the 40-second ceiling.
Loudness swings wildly. The author's official-example set ranges from -12 to -31 dBFS RMS. Normalise downstream or you'll be riding a fader for every clip.
Chinese and English only. No multilingual claim, no code-switching, nothing else tested.
If you need cloned speech in ten languages with reliable levels, this isn't it. If you want a clean 44.1 kHz voice and especially if that voice also has to sing in the next node over, this is the pack - and that's the real reason it exists.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| model | SEMBRIDGE_MODEL | — | |
| text | STRING | Reading between the lines requires understanding. | — |
| seed | INT | 420–18446744073709550000 | Fixes the reference-audio sampling and the generation. Same model, request, seed, settings and environment give the same audio. |
| decoder | COMBO | auto | auto = the official default (native causal decoder for speech, BigVGAN-Large for singing and mixed). native / bigvgan force one decoder for any task. |
| max_new_patches | INT | 5001–8000 | One patch is 80 ms of audio. max_new_patches=500 is a 40 s upper bound, not a target length: generation stops earlier when the model decides the text is finished. |
| min_new_patches | INT | 20–8000 | Generation cannot stop before this many patches (80 ms each). |
| flow_steps | INT | 102–100 | Flow-matching steps per patch (model default 10; the official singing examples use 20). |
| cfg_value | FLOAT | 2.00–10 | Classifier-free guidance (model default 2.0). |
| temperature | FLOAT | 1.000–2 | Sampling temperature of the flow noise (model default 1.0). |
| prompt_audioopt | AUDIO | Optional reference recording of a voice you have the right to use. Only the first item of a batch is used. | |
| prompt_textopt | STRING | The exact transcript of prompt_audio. For a sung reference use the score token string (see SemBridge Score Preview). | |
| prompt_taskopt | COMBO | auto | What the reference is: spoken or sung. auto = singing for the Singing node, speech otherwise. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| report | STRING | — |