Nodes/ComfyUI-NovaAudioPlayer/Nova Player ▶️
ComfyUI Node

Nova Player ▶️

Stop exporting every take — Nova Player is a real audio player inside the node

By NovaFemme·Created 2 days ago·Updated about 10 hours ago· 0
Nova Player ▶️
  • audio
  • panel_info
panel_formatjson

The whole problem with audio in ComfyUI is that "the take" lives in a file you have to go find. You run a TTS or an ACE-Step pass, save the WAV, open your file manager, double-click it, and listen somewhere ComfyUI can't see. Do that fifty times while you dial in a voice and you'll happily pay for a node that closes the loop.

That node is Nova Player ▶️ from ComfyUI-NovaAudioPlayer. Drop it on the canvas, connect any AUDIO output, and you get a real player right in the graph - twelve live visualisers, a whole-file measurement bench, and a theme system - so you listen to what the generation actually produced instead of guessing from a waveform icon. It's built by NovaFemme (MIT, currently v2.2.1) and it's brand new: one commit at the time of writing, zero search impressions. For something that fresh it's unusually polished - the docs are a ten-part design series, which tells you the author cared about the hard 10% as much as the easy 90%.

How it works

Audio was never designed into ComfyUI - it's a layer bolted on after video got good enough to want a soundtrack, and most of it is packaged as bespoke node stacks with their own dependency headaches. Nova Player sidesteps that entirely. It has no dependencies beyond what ComfyUI ships, and its mechanism is deliberately boring: on run() it writes your audio tensor to a 16-bit WAV in ComfyUI's temp folder, computes peaks, loudness and the bench numbers in Python, and pushes a small payload to the front end. The waveform peaks go over their own HTTP route (/nova_player/peaks/…) rather than the websocket, so a long file can't blow the message-size limit, and they're also cached to a sidecar JSON - which is why the waveform survives a browser refresh even after a server restart killed the temp file.

The smart bit is that the measurements happen before the WAV write clamps to ±1.0. A generation that overshoots full scale reports its true peak (say +1.32 dBFS) instead of silently showing up pre-clipped, and the node even warns you in the console. The bench's four frequency bands are contiguous and always total 100% - no gaps, no arbitrary subsets - which is exactly the thing most "meter" nodes get wrong.

The two inputs and one output that matter

  • audio (AUDIO) - your generated audio. Wire up any AUDIO output: Chatterbox, Kokoro or F5-TTS for voice, ACE-Step for music, MMAudio for foley.
  • panel_format (json / text / csv_row, default json) - shapes the output string. json for a database or parser, text to read like the bench strip, csv_row to append to a log with a stable column order.

It's an output node, so it draws the player whether or not you wire panel_info anywhere. If you do wire it, panel_info is a STRING built from the same numbers the panel draws - peak, RMS, crest, LUFS, L/R correlation, DC offset, clipping, band shares, warnings - so a logged take and the screen can never disagree. That's a real feature: previously you'd re-measure with a second node using different conventions and wonder why your numbers didn't match.

Twelve views and the APG meter

Cycle the pill in the transport row: waveform, spectrum/EQ, a goniometer analyzer, spectrogram, a combined view, peak/RMS meters, L/R correlation, frequency bands, an FFT analyzer, a 1/3-octave RTA, and the APG meter. The APG meter is the one worth your attention - six artifact metrics (crest, spectral centroid, flux, flatness, clipping, flat-top saturation) shown live and integrated over the whole take. Click the panel to freeze a reference take, and every row shows a delta against it: change one generation setting, render again, and read which way the audio moved. The node labels it honestly as a hypothesis aid, not a measurement.

Install

ComfyUI Manager (search "Nova Audio Player"), or:

cd ComfyUI/custom_nodes
git clone https://github.com/NovaFemme/ComfyUI-NovaAudioPlayer.git

Then restart ComfyUI. No model downloads, no pip install. scipy is used for accurate LUFS if present and falls back to RMS otherwise; soundfile handles the lossless download paths. Both ship with a standard install.

Where people get burned

  • "Peaks not found - re-run the node." The temp WAV is gone (a server restart clears the temp folder). Just re-run.
  • LUFS looks off. No scipy in your environment, so you're getting the RMS fallback.
  • Downloading MP3 / M4A / Opus fails. Those formats transcode through ffmpeg, which has to be on the server. WAV/FLAC/OGG don't need it.
  • On a 1440p/4K display, the text is small. The defaults were tuned against 1080p; bump Text size in the settings drawer.
  • Comparing APG takes? Keep fft_size the same - the bin count shifts flatness and centroid.
  • The SAT metric reads nonsense. Point the player at FLAC output, not MP3 - lossy encoding smooths away the flat tops it detects.
Category 🎛️ Nova Audio

Inputs (2)

NameTypeDefaultDescription
audioAUDIO
panel_formatCOMBOjsonShape of the panel_info output. json: structured, for a database or a parser. text: the bench strip as it reads on screen. csv_row: one comma-separated row, fixed column order, for appending to a log.

Outputs (1)

NameTypeDescription
panel_infoSTRING