A2SB Bandwidth Extension
Rebuilding the High End with A2SB
- a2sb_model
- audio
- audio
If your recording sounds like it's been playing under a pillow - an old tape transfer, a voice memo from a phone that lived in a pocket, a 64kbps rip from 2003 - this is the node that rebuilds the missing highs with an actual diffusion model instead of a treble shelf. A2SB Bandwidth Extension is the flagship of the comfyui-nvidia-audio-diffusion pack, and it wraps NVIDIA's Audio-to-Audio Schrödinger Bridges research model (arXiv 2403.07634). A normal EQ can only boost what's still there. This one generates the frequencies above your cutoff from what the model thinks the recording should have sounded like. Different class of tool.
Why you'd reach for it
Audio restoration in ComfyUI is a thin, weird layer - most audio nodes are bespoke packs bolted onto an image-first ecosystem, and this is a good example of both the upside and the jank. The upside: it's genuinely state-of-the-art, and the whole pipeline (load model → restore → save) lives in one graph. The jank: first use downloads ~6.8GB of NVIDIA checkpoints, and the underlying model carries a non-commercial research license, so it's a "fix my archive" tool, not a "ship a product" tool.
Set your expectations from the author's own field notes: this is for audio where the highs were erased - muffled mics, tape, low-bitrate encodes. It is not a general "make it sound better" button, and despite an optimistic README line about fixing "metallic" ACE-Step output, the author later admitted the model isn't really built for that. Muffled and band-limited? Perfect. ACE-Step artifacts? Look elsewhere.
How it works
The node does its work in the spectrogram domain. It converts the waveform to an STFT magnitude/phase representation, then builds an "upsample mask" that wipes everything above your cutoff_freq, adds noise to the wiped region, and runs the bridge sampler backward from the corrupted state toward the clean one. The clever part is data consistency: at every step, the frequency content below the cutoff stays pinned to your original, so the model only invents the part that's actually missing. Long audio is handled with multidiffusion windowing - overlapping 256-sample windows, Hann-blended and stitched - which is also what keeps VRAM reasonable. Everything gets resampled to 44.1kHz internally, and you get 44.1kHz out no matter what you put in.
The inputs that matter
You really only touch three of these on a first run:
- cutoff_freq (default
0) - the only knob that changes the result much.0means auto-detect, which measures the 99% spectral rolloff of your file and regenerates everything above it. That's the right default. Set a manual value like8000when you want to force regeneration above 8kHz. - steps (default
50) - diffusion sampling steps. More is smoother and slower; 50 is a fine starting point. - refiner_strength (default
1) - how much of the bridge you actually run. Lower it toward0.1–0.5and the node barely polishes the top end instead of regenerating it. Useful when the source isn't that muffled.
Also in the schema: audio (the AUDIO you feed in, at any sample rate - it resamples), batch_size (how many windowed samples go through the U-Net per pass), and unload_model (default on - frees VRAM when the run finishes).
The single output is audio (AUDIO), which wires straight into a save node or a preview. It pairs with Load A2SB Audio Model, whose a2sb_model output feeds this node's a2sb_model input.
Installing it
ComfyUI Manager can grab it (search "comfyui-nvidia-audio-diffusion"), or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/mmoalem/comfyui-nvidia-audio-diffusion
cd comfyui-nvidia-audio-diffusion
pip install -r requirements.txt # or run install.py
Dependencies are einops, rotary-embedding-torch, librosa, soundfile, and torchao. SageAttention is optional but recommended on RTX 40/50 cards; it's not in requirements.txt, so you install it by hand - and if you don't, keep the loader's attention on sdpa (picking sage without it just falls back with a warning, not a crash). The checkpoints download automatically into ComfyUI/models/A2SB on first use, so budget a few minutes and a big pipe.
Common issues
- First run looks stuck. It's downloading gigabytes, not hung. Watch the console for the
[A2SB] Downloading ... (~3.4GB)lines. - Output is always 44.1kHz. Stereo works (channels are processed as a batch), but you don't get to pick the rate.
- Too much invented high end. If the result sounds like a Tinnitus Simulator, you forced a cutoff way above what the source actually contained - drop back to
0auto-detect. - Heavy VRAM. The default two-split model loads two U-Nets. If you're tight on memory, use the one-split option in the loader.
It's a specialized tool, but for genuinely band-limited audio there's nothing else in the ecosystem that does what this does. Reach for it when the source is honestly muffled - that's its whole job.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| a2sb_model | A2SB_MODEL | — | |
| audio | AUDIO | — | |
| steps | INT | 5010–200 | — |
| cutoff_freq | INT | 00–22050 | — |
| refiner_strength | FLOAT | 1.000–1 | — |
| batch_size | INT | 161–64 | — |
| unload_model | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |