NS WaveSpeed VEO 3.1 Text to Video
Google Veo 3.1, audio included, without a GPU or a Google Cloud project
- client
- video_url
Veo 3.1 is the current high-water mark for prompt-faithful AI video, and the one capability that still genuinely separates it from anything you can run locally: native synchronized audio. Sound effects, dialogue, ambient audio baked into the render rather than bolted on after. NSWaveSpeedVeo31TextToVideo from symbiotica-ai/comfyui-nodes puts that behind a ComfyUI node via WaveSpeed's hosted API - no weights, no VRAM, and no need to set up a Google Cloud billing account, which is usually the biggest barrier to touching Veo at all.
How it works
Type a scene description, pick aspect ratio, duration, resolution, and whether you want audio, and the node POSTs to WaveSpeed (/api/v3/google/veo3.1/text-to-video). The render happens on their hardware; you get back a video_url string. enable_sync_mode defaults off, so the node submits the job and polls the task endpoint every second until the clip is done - and because the polling honors ComfyUI's interrupt flag, pressing Cancel actually aborts the wait rather than watching it burn to timeout.
generate_audio is the knob to care about. Veo's native audio is the model's signature trick - the community treats it as the one thing open video still hasn't matched (closed-source-models.md). Describe the sound in your prompt - "waves crashing, distant seagulls" - and leave the toggle on if you want the full effect. Off, if you're compositing sound later and don't want to pay for audio you'll discard.
The inputs that matter
prompt- the scene, plus whatever audio you want to hear.aspect_ratio- 16:9 or 9:16. Portrait video for reels lives here.duration- 4, 6, or 8 seconds. Veo clips are short; that's the format.resolution- 720p or 1080p. No 4K through this node.generate_audio- native synchronized audio on or off.negative_prompt(optional) - "no text, no watermarks, no morphing" - genuinely useful on Veo.seed(optional) - default -1 is random; set a value to reproduce a clip.client- theWAVESPEED_AI_API_CLIENTsocket from the NS WaveSpeed Client node.
Output: video_url (STRING) - open in a browser or feed a download-from-URL node.
Install and keys
# ComfyUI Manager: search "Symbiotica", or:
cd ComfyUI/custom_nodes
git clone https://github.com/symbiotica-ai/comfyui-nodes.git symbiotica
pip install -r symbiotica/requirements.txt
Restart. Add the NS WaveSpeed Client node, put your wavespeed.ai key in its api_key field (or Settings → Symbiotica, or WAVESPEED_API_KEY), and wire client in. No model downloads.
Common issues
Expect a wait, and expect to pay. Veo renders take minutes, and per-second video pricing stacks up fast across a batch. This is the honest cost of the model the community keeps saying it wants - it's cloud-only, per-call, and your prompt leaves the machine (external-api-nodes.md).
Google's filter is baked in. Veo refuses what it refuses; there's no local patch because there are no weights to patch. If a clip comes back as a refusal, that's the model, not the node.
"API_KEY is empty." The client node isn't wired. The key never lives on this node.
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 | — |