Auto Audio Player
ComfyUI can't hear its own audio — this tiny node fixes that
- audio
- audio
ComfyUI has quietly become a home for audio too - MMAudio, Stable Audio, TTS nodes like F5-TTS all push real AUDIO out of their samplers. And then... nothing. The graph finishes, and you're left digging for the WAV in a temp folder. Auto Audio Player is the missing playback surface: you wire an AUDIO output into it and it plays in your browser the moment it arrives, with play/pause, a scrub bar, volume, and a loop toggle.
It's a pure front-end convenience node, not a generator. Nothing to train, no model files, no API key, no heavy dependency. It's the kind of small thing you install once and forget is even a custom node.
How it works
The mechanism is worth knowing because it explains the one weird quirk you'll hit. On the Python side, process() grabs the AUDIO dict (a waveform tensor plus sample_rate), normalizes it to a numpy float array clipped to [-1, 1], and writes it out as a 16-bit PCM WAV into a temp folder. That file gets served back over a little aiohttp route (/auto_audio_player/<filename>) with Cache-Control: no-store, and the original audio passes through unchanged to whatever comes next.
Meanwhile, a front-end extension polls /auto_audio_player/latest once a second. Every new execution bumps a revision counter, the poll sees it, and every Auto Audio Player node on your canvas loads the fresh WAV into a hidden <audio> element and updates its control panel. So if you have two instances of the node, both start playing the latest audio - the state is global, not per-node. The standard autoplay / default_volume / loop widgets you see in the node's inputs get hidden and replaced by the custom in-node UI, but they're still the values that get serialized into your workflow.
The inputs that matter
audio(AUDIO) - the only required input. Feed it anyAUDIOoutput: MMAudioSampler, Stable Audio, a TTS node, whatever.autoplay(boolean, defaulttrue) - start playing the moment fresh audio arrives.default_volume(float, 0–1, default1.0) - starting volume. You'll want this lower than 1.0 for anything ambient; the author's own example workflow uses 0.15.loop(boolean, defaultfalse) - handy for background loops.
Output is a single audio (AUDIO) passthrough, so it slots mid-graph without breaking your audio chain. The node is flagged as an output node, which is why it shows up in the queue even though it's "just" a player.
Install
The real way, from the README: either search Auto-Audio-Player in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/nullara/Auto-Audio-Player
Then restart ComfyUI and find Auto Audio Player under audio/utils. No model downloads, and its only dependencies (torch, numpy, aiohttp) are already part of ComfyUI - pyproject.toml lists none beyond what ships with the base install. This is the easiest custom node install you'll do all week.
Gotchas
The big one is browser autoplay policy. Browsers won't play sound without a user gesture, so if autoplay is on and nothing sounds, click anywhere in the ComfyUI page once - the node listens for that and unlocks audio. Its status text will literally tell you "Autoplay blocked by browser until you click in the ComfyUI page once" when this happens, so it's not silent failure.
Two smaller things. It's browser-only: if you run ComfyUI headless or API-only, there's no UI to play anything, so the node is pointless there. And the temp WAVs are never cleaned up by the code - every run drops another file in your system temp dir under ComfyUI/auto_audio_player/, so on a long session it's worth clearing that folder occasionally. Minor, but nice to know it's not you doing it wrong.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| autoplay | BOOLEAN | true | — |
| default_volume | FLOAT | 1.000–1 | — |
| loop | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |