Nodes/Kinburg-Nodes/Audio SR (48 kHz Upscale) πŸ”Š
ComfyUI Node

Audio SR (48 kHz Upscale) πŸ”Š

Wring real top end out of a dead-sounding mix

By KinburgΒ·Created 3 months agoΒ·Updated 6 days agoΒ· 1
Audio SR (48 kHz Upscale) πŸ”Š
  • audio
  • audio
  • report
β—„checkpointβ–Ύβ–Ί
β—„steps50β–Ί
β—„guidance_scale3.5β–Ί
β—„seed0β–Ί
β—„chunk_seconds15.36β–Ί
β—„overlap_seconds1.0β–Ί
β—„stereoβ–Ύβ–Ί
β—„match_leveltrueβ–Ί
β—„dtypeβ–Ύβ–Ί
β—„keep_loadedtrueβ–Ί
β—„verbosetrueβ–Ί

If you've generated audio - LTX-2 dialogue, AceStep music, anything coming out of a video model - you know the sound: it dies around 11–12 kHz. Not "quiet up top," gone. Audio SR is bandwidth extension, and this node wraps the real AudioSR latent-diffusion model to fix exactly that. It doesn't filter or fake the high end; it invents plausible 11–24 kHz content from the structure it can hear. The measured result on a real take is wild: transparent below about 12 kHz, then +30 dB at 16–20 kHz and +56 dB at 20–24 kHz. The octave above the roll-off is written from nothing, which is precisely the job.

This is genuinely a thing people do, not a toy. A widely-shared r/StableDiffusion post pushed AudioSR as a post-processing step for LTX-2's audio - "upscales" the audio "sort of like how SeedVR2 does for images," in the commenter's words - and the same model backs this node. Community consensus there was that the audiosr_basic checkpoint beat the speech one even for voice, but the node's own docs say the variant is read from the filename, so keep the shipped names and A/B if you care.

The model is vendored inside the pack (audio_sr/vendor/audiosr, MIT), so you don't need a second pack installed - but you do need a checkpoint, dropped into ComfyUI/models/AudioSR. The fp32 files run about 6 GB each; dtype gives you fp16/bf16 if VRAM says otherwise. That 6 GB is also what keep_loaded (on by default) holds in VRAM between runs - flip it off to free the card after each run and pay the load time again.

Inputs worth your attention:

  • steps - DDIM steps per chunk, and the whole cost: total work is chunks Γ— steps. 50 is the sane default here; upstream's own default is 200, four times the wait for a difference you'll struggle to hear on a mix.
  • stereo - AudioSR is a mono model. mid/side (keep the image) is the recommended mode: only the mid channel goes through the model, side is carried through untouched, so a stereo image survives. sum to mono is what the old wrapper did, and it was measured to flatten an L/R correlation of +0.45 and a side/mid RMS of 0.61 to 1.00 and 0.00 - the whole image, gone.
  • chunk_seconds / overlap_seconds - chunking with a Hann crossfade (which sums to 1, so joins neither dip nor double). 1 s of overlap is cheap insurance; the default 15.36 s is 3 Γ— 5.12 s because the batch builder pads every chunk up to a multiple of 5.12 s - pay for silence otherwise.
  • seed - worth holding fixed while you compare steps or chunk lengths, or you're comparing two different inventions of the high end. Capped at 2Β³Β²βˆ’1 because AudioSR's seed_everything() calls numpy, which refuses anything bigger.

Outputs are audio (48 kHz mono, or mid/side-recombined stereo) and report - a text summary of what was actually done, always available on the output even if you turn verbose off.

Installing

Part of Kinburg-Nodes: ComfyUI Manager β†’ search "Kinburg-Nodes", or git clone https://github.com/Kinburg/Kinburg-Nodes into custom_nodes, then restart. On top of the pack, download an AudioSR checkpoint into ComfyUI/models/AudioSR. The vendored model code ships with the pack, so no pip install beyond what Manager already runs.

Gotchas

Never run L and R separately: two independent diffusion passes decorrelate and the invented top comes out phasey instead of wide. Upscale before you widen, not after. And don't mistake match_level for a loudness match - it puts the energy below 10 kHz back where the input's was, because the model genuinely adds energy up top and matching totals would turn the whole track down to pay for it. It fixes dead top end; it won't fix aliasing artifacts baked into the source. Nothing will.

CategoryKinburg-Nodes/audio

Inputs (12)

NameTypeDefaultDescription
audioAUDIOThe mix to extend. Resampled to 48 kHz and summed to mono first β€” AudioSR is a mono model, so a stereo image does not survive this. Upscale before you widen, not after.
checkpointCOMBOA checkpoint from ComfyUI/models/AudioSR. 'basic' is for music, 'speech' for voice β€” the variant is read from the file name, so keep the shipped names. The fp32 files are about 6 GB each; see 'dtype' if that is tight.
stepsINT5010–500DDIM steps per chunk. This is the whole cost: total work is chunks x steps, and the progress bar counts exactly that. 50 is a sane working value; upstream's own default is 200, which is four times the wait for a difference you will struggle to hear on a mix.
guidance_scaleFLOAT3.51–20How hard the model is held to the input. Higher stays closer to what you fed it; lower invents more top end. 3.5 is upstream's default.
seedINT00–4294967295Noise seed. Worth holding fixed while you compare steps or chunk lengths, or you are comparing two different inventions of the high end. Capped at 2^32-1, not the usual 2^64-1: AudioSR's seed_everything() calls numpy, which refuses anything larger. A bigger value arriving on the wire β€” a song seed from Siren Cast, say, which really is 64-bit β€” is folded into range rather than raising, and the report says what was actually used.
chunk_secondsFLOAT15.365.12–30.72How much audio goes through the model at once. The default is 3 x 5.12 s because the batch builder pads every chunk up to a multiple of 5.12 s β€” a length that is not a multiple of it pays for denoising silence. Longer chunks mean fewer joins and more VRAM.
overlap_secondsFLOAT1.00–5How much neighbouring chunks share, crossfaded with a Hann pair (which sums to 1, so the join neither dips nor doubles). 0 is a hard butt-join, which is upstream's default and is audible on sustained material. 1 s is cheap insurance; more only costs compute, since overlapped audio is processed twice.
stereoCOMBOWhat to do with a stereo mix, since AudioSR is a mono model. β€’ mid/side (recommended) β€” only the mid channel goes through the model; side is carried through untouched and the two are recombined. The image survives. Everything invented above the source's roll-off lands in the centre, because side has no content up there β€” highs come out centred, which is how plenty of records sit. β€’ sum to mono β€” what the model wants, and what the wrapper this replaces did. Measured on a real take: an L/R correlation of +0.45 and a side/mid RMS of 0.61 became 1.00 and 0.00. The whole image, gone. Here to A/B against. Mono in is untouched either way. Never run L and R separately: two independent diffusion passes decorrelate, and the invented top comes out phasey instead of wide.
match_levelBOOLEANtruePut the output's energy BELOW 10 kHz back where the input's was. Not an overall level match β€” the model genuinely adds energy up top, and matching totals would turn the whole track down to pay for it. Below the roll-off it measured transparent (-0.4 dB at 8-12 kHz), so drift down there is drift: on the take we measured it was -1.2 dB at 0-4 kHz and -1.7 dB at 4-8 kHz, which reads as the mix losing body. The gain applied is printed.
dtypeCOMBOCompute precision. fp32 is what the checkpoints ship as and what to keep unless VRAM says otherwise; fp16 roughly halves the model's footprint, bf16 is the safer half-precision on RTX 30-series and up.
keep_loadedBOOLEANtrueHold the model in VRAM between runs. On is right while you iterate; off frees about 6 GB after every run and pays the load time again next time.
verboseBOOLEANtruePrint the report to the console. The same text is always on the 'report' output.

Outputs (2)

NameTypeDescription
audioAUDIOβ€”
reportSTRINGβ€”