Scenema Local API Audio Generator
Scenema's acting TTS, pulled into ComfyUI
- audio
- seed
- metadata_json
Most TTS gives you a voice. Scenema Audio gives you a performance - and this node is the least effort way to get that performance onto a ComfyUI canvas. It's a community-made client for Scenema's diffusion-based speech model, launched in May 2026 on the claim that "voice identity" and "emotional delivery" are separate dials you can turn independently. Describe rage, grief, a child's wonder in the prompt, hand over a reference clip if you want a specific "who," and out comes dialogue that sounds like it was acted rather than synthesized.
The honest caveat up front: this node is the small, boring half of the setup. It contains zero model weights and downloads nothing - all it does is POST your prompt to a local Docker container and turn the returned WAV into ComfyUI's AUDIO format. The actual model - 4.9–9.8 GB of weights plus a Gemma language model - lives in that container, so get the container running first or there's nothing to talk to.
What it actually does
Look at the source and the whole thing is about 100 lines of plumbing. The node builds a JSON payload from its inputs, POSTs it to api_url (default http://localhost:8000/generate) with a 300-second timeout, and expects a JSON reply carrying base64-encoded WAV audio plus metadata. It decodes that, reads the WAV header, converts the samples to a float32 tensor, and hands ComfyUI the standard {"waveform": ..., "sample_rate": ...} dict that every audio node speaks. On the way it also returns the seed it used and a metadata_json string, so you can reproduce a take later.
Because it's pure stdlib plus requests and torch, both already inside ComfyUI, there's no requirements.txt and no dependency hell - the rare audio pack that won't fight your transformers/torch versions.
The inputs that matter
prompt- the heart of it. Scenema uses a<speak voice="A man on the edge. Explosive rage. Italian-American inflection." gender="male" scene="A dimly lit office, late at night">block with<action>tags for stage directions. Prompting matters a lot here: a generic voice description gives generic audio, a specific theatrical one gives a performance. And there's no phoneme dictionary, so garbled proper nouns want phonetic spelling - "Tchaikovsky" becomes "Chai-koff-skee."pace- how much time the model gets per word. Default 1.5; this is the knob you'll actually tune once the words are right.mode-generateproduces the full performance;voice_designis the other branch. Start ingenerate.seed- default-1means random, and the node hands the used seed back to you via its INT output.reference_voice_url(optional) - a URL to a reference clip for zero-shot voice cloning, the "who" half. When it's set, theskip_vc,vc_steps, andvc_cfg_ratevoice-cloning controls come into play.
background_sfx adds an ambient sound layer, validate checks the prompt before sending, and min_match_ratio sets how closely a cloned voice must match - you can leave all three alone.
Wiring it up
Three outputs: audio (the AUDIO you feed a Save Audio node or play inline), seed (INT, for reproducibility), and metadata_json (STRING, the API's metadata for debugging). The interesting destination is downstream: the Scenema team demoed audio-first workflows where the generated voice drives an audio-to-video pipeline like LTX 2.3 or Wan's A2V. Generate the performance here, feed it there, get a talking head that matches the delivery instead of a monotone dub.
Installing it
Two separate installs, and both are required. The node side is trivial:
cd ComfyUI/custom_nodes
git clone https://github.com/fgheorghe/ComfyUIScenemaLocalAPIAudioGenerate
# restart ComfyUI
Or search "ComfyUIScenemaLocalAPIAudioGenerate" in ComfyUI Manager. No models, no pip installs - the node even has no requirements.txt.
The model side is the real work: follow the setup in the ScenemaAI/scenema-audio repo, which ships as a Docker container with a REST API. docker compose up, set your HuggingFace token (Gemma access), and the service auto-picks a config for your VRAM - the 16 GB tier runs the INT8 audio model with Gemma streamed on CPU (needs 32 GB system RAM), 24 GB is the default, 48 GB gets the bf16 best-quality tier.
Where people get burned
The node's own errors tell you most of what can go wrong: "Network API connection failed" means the container isn't up or the URL is wrong. The classic localhost trap: if ComfyUI itself runs in Docker, localhost:8000 inside that container is not your host - use the Scenema service's hostname or host.docker.internal instead.
Then there are the failures that aren't yours. Scenema is a diffusion model, not a classic TTS pipeline, and the devs are upfront that some seeds produce repetition or gibberish. The workflow is: generate, listen, bump the seed, pick the best take. That's not a bug in this node; it's the model's post-editing workflow, and the seed output exists so you can chase the good takes. Last thing before you ship anything commercial: the weights derive from the LTX-2 Community License (inference code is MIT), so re-read those terms first.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| api_url | STRING | http://localhost:8000/generate | — |
| prompt | STRING | <speak voice="A man on the edge. Explosive rage. Italian-American inflection." gender="male" scene="A dimly lit office, late at night"> <action>He stands up slowly, voice dangerously low</action> You come into my house, you eat my food, and then you got the nerve to tell me how to run my business. <action>Voice rising, finger pointing</action> I built this thing from nothing while you were sitting on your ass. </speak> | — |
| mode | COMBO | generate | 2 options: generate, voice_design |
| background_sfx | BOOLEAN | false | — |
| validate | BOOLEAN | true | — |
| seed | INT | -1-1–4294967295 | — |
| pace | FLOAT | 1.50.1–5 | — |
| min_match_ratio | FLOAT | 0.900–1 | — |
| skip_vc | BOOLEAN | false | — |
| vc_steps | INT | 2510–50 | — |
| vc_cfg_rate | FLOAT | 0.500–1 | — |
| reference_voice_urlopt | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| seed | INT | — |
| metadata_json | STRING | — |