SF WaveSpeed VEO 3.1 Text to Video
Pure text-to-video on VEO 3.1, 1080p, with native audio — no GPU required
- client
- video_url
This is the one the whole video-GenAI discourse is actually about: type a sentence, get a cinematic clip. VEO 3.1 text-to-video, served through WaveSpeed's API, no GPU, no checkpoints, no model downloads - just a prompt and a few settings, and a video_url comes back.
The community's honest take on this model family is that it's ahead of anything you can run locally: motion, lighting, and most distinctively, native audio. VEO is the only major video model that generates synchronized sound and dialogue as part of the output - that's a capability gap open models still haven't closed. If your project needs footage with real audio and you don't have a budget for filming it, this node is the practical route. It's the "one sentence → finished clip" workflow, which also means it's the right tool for storyboarding or pitching a scene before you spend hours on a local pipeline.
How it works
Wire the SF WaveSpeed Client node into client and describe the scene in prompt. At run time the node POSTs to /api/v3/google/veo3.1/text-to-video and polls until the render completes, then returns a single video_url string. Everything happens on WaveSpeed's servers; your machine just holds the API key and waits.
The pack's own notes say standard VEO 3.1 takes roughly two to three minutes per eight-second clip. That's the cost of the quality tier. If you want a faster, cheaper iteration loop, the pack's sibling "Fast" text-to-video node exists for exactly that - this one is for the shots you're going to keep.
The inputs that matter
- prompt - the whole ballgame. VEO rewards descriptive scene language: subject, camera move, lighting, mood.
- aspect_ratio - 16:9 for landscape, 9:16 for portrait (vertical video).
- duration - 4, 6, or 8 seconds. Longer costs more.
- resolution - 720p or 1080p. Test at 720p, ship at 1080p.
- generate_audio - flip this on for VEO's native synced audio. This is the model's signature capability and the reason to use it at all; leaving it off wastes the whole advantage.
- negative_prompt, seed, enable_sync_mode - standard; seed -1 means random, sync mode changes the API path but the node blocks until the clip is done either way.
Installing it
Through ComfyUI Manager, search comfyui-stillfront and install. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/razvanmatei-sf/comfyui-stillfront.git
cd comfyui-stillfront
pip install -r requirements.txt
You need a WaveSpeed API key from wavespeed.ai. Set it in config.ini (copy config.ini.tmp to config.ini first), as the WAVESPEED_API_KEY environment variable, or paste it into the SF WaveSpeed Client node's api_key field. The README's clone URL is outdated (stillfront/...); the repo actually lives at razvanmatei-sf/comfyui-stillfront.
Where people get burned
Pure text-to-video means pure text-to-video: if you want a specific subject to appear, a text description is a weak guarantee. That's why the pack also ships image and reference variants - reach for those when you need a face or object locked down.
Then there's the money and time reality. This is per-generation API usage, and the good tier is not cheap; an 8-second 1080p clip with audio bills real credits. A bad key fails fast with Unauthorized, but a slow render just quietly takes minutes. Don't fire it at full settings to "test" - that's how surprise bills happen. Start short and low-res, then scale up once the prompt actually works.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| client | WAVESPEED_AI_API_CLIENT | — | |
| prompt | STRING | Text description of the desired video scene | |
| aspect_ratio | COMBO | 16:9 | Video aspect ratio - 16:9 (landscape) or 9:16 (portrait) |
| duration | COMBO | 8 | Video duration in seconds |
| resolution | COMBO | 1080p | Video output resolution |
| generate_audio | BOOLEAN | false | Generate native audio synchronized with the video |
| negative_promptopt | STRING | Specify what to avoid in the generated video | |
| seedopt | INT | -1-1–2147483647 | Random seed for reproducible results. -1 for random seed |
| enable_sync_modeopt | BOOLEAN | false | Wait for generation to complete before returning |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | — |