Grok TTS · Text to Speech
71 voices, one line of text, and a `[laugh]` where you want it
- audio
- task id
Local TTS in ComfyUI is in an odd place: the models are genuinely good - Chatterbox is close enough to the paid services that people stopped treating an API as mandatory - but the integration is a maintained workaround. The suite everyone uses has said out loud that adding one engine can break three others through transformer, torch and tokenizer conflicts. If you want a voice without maintaining that, calling one is legitimate, and this is the cheapest version of that I've seen in a node.
What you get
AUDIO, out of a text box. Billed at 2.7 credits per 1,000 characters, which for scale is roughly a minute of speech per thousand characters - a few tenths of a cent per sentence. The node returns audio plus task id. If the service returns several results they come back as a batch and Save Audio writes a file each, so a multi-take run doesn't silently overwrite itself.
Worth knowing in the context of this pack: it's the natural upstream of the video nodes that speak. Vidu Q4's reference-to-video takes up to three reference_audio_urls, and the Q4 image-to-video generates its own dialogue. A voice made here is either the thing you drive a reference with, or the bed you cut against. Same credit wallet for both, which is the actual argument for keeping them in one graph rather than two tabs.
The fields that change the result
text - what gets spoken, and it takes speech tags: [laugh], <whisper>…</whisper>. Tags are billed like any other character, so they're not free punctuation, but they're the difference between a flat read and a performance. One per paragraph is plenty; a [laugh] every sentence sounds like a laugh track.
voice_id - 71 entries in the dropdown, defaulting to Eve. The tooltip is the useful part: Eve, Ara, Leo, Rex and Sal speak every supported language; the rest are tuned for one. If your script is multilingual, or you don't know yet, stay in that five. The other names are hashes, not friendly labels, so pick by listening rather than by name.
language - defaults to Auto-detect. Auto is fine on clean input and occasionally wrong on short strings, single words or mixed-language text. Set it when it matters.
speed - 0.7 to 1.5, default 1, in 0.05 steps. Small moves: 1.05 to breathe life into a flat read, 0.9 for a documentary narrator. Past about 1.25 you're making a chipmunk.
output_format - mp3 by default. The tooltip flags that pcm, mulaw and alaw are raw streams with no file header, for phone systems. That distinction matters inside ComfyUI: the pack decodes returned audio with PyAV, and a headerless stream isn't something it can open as a file. Use mp3 or wav for anything that goes back into a graph.
sample_rate - 24 kHz default, 8000 for phone lines, 44100/48000 for studio work. You're choosing a delivery format, not improving the model.
text_normalization - rewrites numbers, abbreviations and symbols as spoken words. On for anything with figures, dates or units in it; off when your text is already written to be read aloud.
optimize_streaming_latency - 0/1/2, default 0 = best quality. This exists for streaming APIs that need a first chunk fast. In a batch workflow you're waiting for the whole file anyway, so leave it at 0 and take the quality.
Outputs are audio and task id.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/popnow-ai/popnow-comfyui
or install PopNow from ComfyUI Manager, or comfy node install popnow-comfyui. No models, no pip - the voice runs on PopNow's servers. Add a key from popnow.ai/api/console/keys via Settings > PopNow or POPNOW_API_KEY and restart once more so the catalog rebuilds the node list. Delete any old custom_nodes/popnow_api.py single-file node.
Where it goes wrong
Raw formats that won't decode. pcm, mulaw, alaw are for telephony integrations, not for a Save Audio node. If the node errors on the result, this is the first thing to check.
A voice that doesn't match the language. Non-multilingual voices on a language they weren't tuned for produce something accented in a way you didn't ask for.
Long text hitting limits, not quality. Split a five-minute narration into paragraphs and generate each - it gives you editable segments and better prosody than one enormous string.
Sign-up credit errors. PopNow 40310 is "verify your email" and it's common on a fresh account. 401 is a bad key, 40201 an empty wallet - at this price that means an empty wallet, not an overspend.
No forum threads to fall back on. This pack has essentially no community footprint yet - it's a vendor's own wrapper - so the node's status line and the API console are your diagnostics.
Cancelling stops the wait, not the job. Interrupting means the file lands in the API console instead of your graph, and successful runs are still charged.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | The words to be spoken, with optional speech tags such as [laugh] or <whisper>…</whisper>. Billed per 1,000 characters, tags included. | |
| voice_id | COMBO | Eve · female · multilingual (default) | Preset voice. Eve, Ara, Leo, Rex and Sal speak every supported language; the others are tuned for one language. |
| language | COMBO | Auto-detect | Reading language, or auto to detect it from the text. |
| speed | FLOAT | 1.000.7–1.5 | Speaking speed from 0.7 (slower) to 1.5 (faster). |
| output_format | COMBO | MP3 | Audio encoding. pcm, mulaw and alaw are raw streams without a file header, for phone systems. |
| sample_rate | COMBO | 24 kHz | Sample rate in Hz. 8000 for phone lines, 44100 or 48000 for studio work. |
| bitrate | COMBO | 128 kbps | MP3 bit rate in bits per second. Only applies to mp3. |
| text_normalization | BOOLEAN | false | Rewrite numbers, abbreviations and symbols as spoken words before reading. |
| optimize_streaming_latency | COMBO | 0 — best quality | Streaming latency level: 0 best quality, 1 smaller first chunk, 2 smallest first chunk with more quality trade-off at chunk boundaries. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | Several results come back as a batch; Save Audio writes one file each. |
| task id | STRING | The PopNow task id, for the API console logs or support. |