Nodes/ComfyTV/Audio EQ
ComfyUI Node

Audio EQ

The parametric EQ with a graph inside the node — drag bands, hear the change

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
Audio EQ
  • audio
  • video
  • audio
  • fx_spec
force_run_token0
project_id
parent_output_id0
bands

EQ is where mixes either come alive or turn into mud, and it's also the stage where ComfyTV stops feeling like a node pack and starts feeling like a real editor. Audio EQ embeds an actual parametric EQ graph in the node body - you drag bands on a curve, and the JSON behind them drives FFmpeg filters. No number-crunching in your head, no "is 800Hz the mud frequency" guesswork; you see the curve you're building.

You'll use it for the standard jobs: cutting the low-mid mud out of a voiceover, adding presence around 3–5kHz, high-passing a rumble that a highpass filter at 60–100Hz fixes instantly, or gently scooping the 200–400Hz boxiness out of a room recording. Because the whole pack runs inside ComfyUI, the flow is: Trim → Denoise → EQ → Dynamics → Loudness, all in one graph, and this is the stage that makes the voice actually sound good rather than just clean.

How it works

The bands input is the whole node: a JSON string, per the author's tooltip, shaped like [{"type":"peak|highpass|lowpass|lowshelf|highshelf","f":1000,"g":0,"q":1}] - but you don't type that. The node's graph UI writes it for you as you drag bands. The source maps each band type to an FFmpeg filter:

  • peak - equalizer with frequency, Q, and gain. The surgical band.
  • highpass / lowpass - highpass / lowpass, 2-pole, for rolling off rumble or hiss.
  • lowshelf / highshelf - bass / treble, tilting the low or high end without a resonant peak.

Gain ranges ±24dB, frequency 20Hz–20kHz, Q 0.1–20. The audio or video input feeds the source (video uses its soundtrack), and outputs are audio plus an fx_spec (COMFYTV_FXSPEC) recording the applied filter chain for the FX Chain machinery. Internal inputs (force_run_token, project_id, parent_output_id) are frontend plumbing - ignore them.

One quirk worth knowing: the stage errors with "no active bands" if the bands JSON is empty or every band has 0dB gain. A flat EQ is a no-op, and it says so instead of silently doing nothing.

Installing ComfyTV

cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV

Full backend restart, then ComfyTV → AudioFX; ComfyUI Manager finds "ComfyTV". Zero extra Python deps - the filters run through FFmpeg via PyAV, bundled with ComfyUI. No models.

The pack-wide install trap: on macOS / ComfyUI Desktop / multi-install machines, cd ComfyUI/custom_nodes can clone into the wrong instance - clone succeeds, stages never appear. Read the running instance's path from the startup log, clone into that instance's custom_nodes by absolute path (quote paths with spaces/parentheses), confirm ComfyTV/__init__.py is top-level, restart the backend fully.

Common issues

  • "no active bands" error. You have bands but all at 0dB, or the graph UI hasn't committed a band yet. Move a band's gain off zero.
  • The lowshelf/highshelf does nothing. The source only emits bass/treble filters when the band's gain is non-zero, and relies on FFmpeg having those filters. A 0dB shelf is silently skipped - give it actual gain.
  • EQ sounds phasey or harsh. Q is too high. For broad corrective moves keep Q around 0.7–1; narrow Q is for surgical notching.
  • The graph UI and the audio disagree. The bands JSON is what actually runs; if the UI feels out of sync, re-run the stage to re-commit the graph.

EQ is the difference between "recorded" and "produced," and having it as a visual curve in the node is the least intimidating way to learn it.

CategoryComfyTV/AudioFX

Inputs (6)

NameTypeDefaultDescription
force_run_tokenINT00–2147483647Internal — bumped on Run to invalidate ComfyUI's input cache.
project_idSTRINGInternal — populated by the projectStore on the frontend.
parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
bandsSTRINGJSON [{"type":"peak|highpass|lowpass|lowshelf|highshelf","f":1000,"g":0,"q":1}] — driven by the EQ graph UI
audiooptCOMFYTV_AUDIO
videooptCOMFYTV_VIDEO

Outputs (2)

NameTypeDescription
audioCOMFYTV_AUDIO
fx_specCOMFYTV_FXSPEC