Nodes/ComfyUI-EMALightning/EMA Lightning Text to Speech
ComfyUI Node

EMA Lightning Text to Speech

EMA Lightning Text to Speech

By hiroki-abe-58·Created about 21 hours ago·Updated about 15 hours ago· 0
EMA Lightning Text to Speech
  • model
  • audio
  • words
  • report
◄textMerhaba, size nasıl yardımcı olabilirim?►
◄seed0►
◄speed1.00►
◄sample_rate48000►

Ask r/comfyui for Turkish TTS and the answers you get back are Coqui, "try Hugging Face", or ElevenLabs. That's not a coincidence - the open TTS corner is relentlessly English-first, and Turkish narration is the kind of request that sends people off to a separate Python script. This node is the shortcut: Turkish speech generated inside the graph, out as a normal AUDIO you can save or lip-sync, plus the start and end time of every spoken word.

Scope first, so you don't get attached: one model, one language. It won't replace Chatterbox for cloned English voices or Kokoro for cheap high-volume English, and it's not a hub like the TTS Audio Suite - see the audio generation landscape if that's what you need. It's for Turkish.

How the speech gets made

The node passes your text straight to the official ema-lightning package's own say() call, so all the interesting work happens there, not in the ComfyUI wrapper. That's good news for quality - the pack's whole selling point is that it's bit-identical to the documented package usage on GPU, checked across nine cases with different speeds, sample rates and seeds.

The chain is: a Turkish normalizer reads numbers, dates (15 Ekim 2026), times (14:30) and amounts (1.250.000 TL) out loud as words, long text is split into sentences, and the flow-matching model plus vocoder produce audio at the model's native 48 kHz. Word timings fall out of the same pass, in seconds.

Two things surprise people. The text is lowercased with Turkish rules, so "ComfyUI" comes back in the word list as comfyuı - that's correct Turkish casing, not a bug. And the word list reflects the normalized text, so "14:30" shows up as the words actually spoken, which is exactly what you want for subtitles and exactly what you'd have had to fix by hand otherwise.

The inputs you touch

text is the obvious one - multiline, Turkish, and the default is a polite Turkish greeting you'll overwrite immediately.

seed is real here, unlike in a lot of TTS nodes. Same text, seed, settings and device give you the same audio. But CPU and GPU give different audio for the same seed, so don't expect your laptop render to match your desktop. Fix the batch size too (that's a Loader setting) if you need cross-machine repeatability.

speed runs 0.25 to 4 in steps of 0.05, where 1 is normal. Small nudges do what you expect; 4 is a party trick.

sample_rate offers 48000, 24000, 16000 and 8000. 48000 is native and involves no resampling by the package - drop lower only if something downstream is stubborn about size, because you're throwing away detail the model actually produced.

The model input is the EMA_LIGHTNING_MODEL from the EMA Lightning Loader, and that's your only required setup.

The three outputs

audio is a plain ComfyUI AUDIO - mono, wrapped as a single-channel waveform. Wire it into Save Audio (Advanced) for FLAC, MP3 or Opus, or into Preview Audio if you just want to hear it. Both shipped example workflows take the first route; tts_basic saves FLAC, tts_announcement_mp3 does an announcement with a time and an amount.

words is a JSON string, not a widget: a list of text, start and end in seconds. Feed it to anything that accepts a string, or save it and use it for subtitle timing. For driving a talking head, the audio itself is what goes into the video node - the timings are for captioning and lip-sync reasoning, not a magic sync signal.

report is a JSON string of what just happened: seed, speed, sample rate, duration, word count, batch size, device, whether lightning was on, wall-clock seconds, and a real_time_factor. Handy the first time you want to know whether the model is actually working or the graph is just spinning.

Install, and what it costs you

cd ComfyUI/custom_nodes
git clone https://github.com/hiroki-abe-58/ComfyUI-EMALightning
python -m pip install -r ComfyUI-EMALightning/requirements.txt
python ComfyUI-EMALightning/tools/download_model.py --models-dir ../models/ema_lightning

Then restart and open workflows/gui/tts_basic.json. The only Python dependency is ema-lightning==1.1.2, which brings the Turkish normalizer; the model is about 34 MB and the script verifies its SHA-256. Given that dependency conflicts are the standard failure mode of every audio pack in this ecosystem, a one-line requirements file is the most attractive thing about this one.

On an RTX 5090 the author measured a 7.9-second announcement in 0.036 s - roughly 220x real time. CPU does a 5.7-second sentence through the whole queue in about a second, so a few minutes of narration costs you essentially nothing either way.

Where people get burned

Nothing in the node list. Older ComfyUI without the V3 node API makes the pack log [EMA Lightning] not loaded: ... and register nothing. Check the console.

Empty text raises a ValueError rather than producing silence, so a blank field in a batch workflow stops the queue. Wire your text in from something with a fallback.

Reproducibility drift from auto batch size. If the same seed gives you slightly different audio after a reinstall, that's the package re-measuring throughput, not your seed being broken.

The first lightning render sits there for minutes while CUDA graphs are recorded, and turning it on flips cuDNN benchmark mode on for the whole ComfyUI process. It's also not bit-identical to the plain path.

Licensing, if you ship it. The pack is MIT, but the model and packages are Apache-2.0 with a model card that puts the disclosure and consent obligations for synthetic speech on whoever deploys it. Fine for personal work; read it before you publish voice content.

Categoryaudio/ema_lightning

Inputs (5)

NameTypeDefaultDescription
modelEMA_LIGHTNING_MODEL—
textSTRINGMerhaba, size nasıl yardımcı olabilirim?—
seedINT00–4294967295Same text, seed, settings and device give the same audio.
speedFLOAT1.000.25–4Speaking rate (1 = normal).
sample_rateCOMBO4800048000 is the model's rate; the others are resampled by the package.

Outputs (3)

NameTypeDescription
audioAUDIO—
wordsSTRING—
reportSTRING—