How to compress podcast dynamic range in the browser
- Step 1Open the Speech Leveler — Go to the Speech Leveler tool. It is the in-browser front end to FFmpeg's compand filter. Drop the voice track whose dynamic range you want to reduce (MP3, WAV, FLAC, M4A, OGG, or Opus).
- Step 2Choose the curve that matches your source's range — The single control is a Preset dropdown. For a typical one-voice podcast use Podcast (~3:1 over -25 dB). For a very wide-range read use Voiceover (engages near -30 dB with extra make-up). For two voices at different mic distances use Interview (gentler ~2:1, slower release).
- Step 3Match the knee and release to your material mentally — Podcast and Voiceover use a 6 dB soft knee and 0.4-0.5 s release; Interview uses an 8 dB knee and a 0.6 s release. Wider material with sudden transients benefits from the slower, softer Interview curve; tight solo speech suits Podcast.
- Step 4Run the compand pass — Process. The tool emits a single
-af compand=...command and re-encodes to your input's codec. Because there is no second analysis pass, it is fast — far quicker than a 2-pass loudness measurement. - Step 5Measure the result — If you want to verify the new range, the loudness-normalizer's report surfaces integrated loudness and loudness range (LRA). A lower LRA confirms the compression narrowed the dynamics.
- Step 6Normalise last — Compression set the shape; normalisation sets the level. Send the compressed file to the loudness normaliser for the final -16 LUFS (podcast) or -14 LUFS (Spotify/YouTube) target.
Exact compand curve per preset
The full FFmpeg compand argument each preset builds. Format is attack,decay : attack,decay : input/output point pairs (dB) : soft-knee : gain : initial-volume : delay.
| Preset | Attack / decay | Transfer points (in/out dB) | Knee · gain · init · delay |
|---|---|---|---|
| Podcast | 0.05 / 0.4 s | -90/-90 | -70/-70 | -25/-15 | 0/-15 | 6 dB · 0 · -90 · 0.1 s |
| Voiceover | 0.05 / 0.5 s | -90/-90 | -70/-65 | -30/-20 | 0/-12 | 6 dB · 0 · -90 · 0.1 s |
| Interview | 0.1 / 0.6 s | -90/-90 | -60/-58 | -25/-18 | 0/-15 | 8 dB · 0 · -90 · 0.1 s |
Reading the transfer curve
How the input/output point pairs translate to compression behaviour. The slope between two points is the effective ratio in that region.
| Region | Podcast behaviour | What it means for your DR |
|---|---|---|
| Below ~-70 dB | 1:1 (-90/-90 to -70/-70) | Noise floor untouched — does not expand or gate the very quiet tail |
| -70 to -25 dB | Upward range (-70/-70 to -25/-15) | Quiet speech lifted toward the loud band — the 'leveling' effect |
| -25 to 0 dB | ~3:1 (-25/-15 to 0/-15) | Loud peaks held nearly flat at -15 dB out — the strongest compression region |
| Make-up gain | 0 dB explicit gain; output ceiling set by the curve (-15 dB) | No extra blanket boost; level comes from the curve, so follow with a limiter if hot |
Cookbook
Producer-grade examples. Each shows the literal compand argument and how it reshapes the dynamic range — useful if you also script FFmpeg directly and want this tool's exact curves.
Narrow a wide solo read with the Podcast curve
A 20 dB source range is too wide for mobile playback. The Podcast curve's ~3:1 region above -25 dB does the heavy lifting.
Preset: Podcast -af compand=0.05,0.4:0.05,0.4:-90/-90|-70/-70|-25/-15|0/-15:6:0:-90:0.1 Input LRA ~ 20 dB -> output LRA ~ 7-8 dB (measure in normalizer) Loud peaks pinned near -15 dB out; quiet speech lifted
Voiceover curve for an audiobook-style read
Long-form narration with whispered build and projected delivery. Voiceover engages lower (-30 dB) and adds more make-up via the 0/-12 endpoint.
Preset: Voiceover -af compand=0.05,0.5:0.05,0.5:-90/-90|-70/-65|-30/-20|0/-12:6:0:-90:0.1 Engages 5 dB lower than Podcast -> denser, more consistent narration Output ceiling -12 dB (3 dB hotter than Podcast's -15 dB)
Interview curve for a two-mic recording
Host close, guest at arm's length. The 8 dB knee and slow 0.6 s release pull both into range without obvious pumping on turn-taking.
Preset: Interview -af compand=0.1,0.6:0.1,0.6:-90/-90|-60/-58|-25/-18|0/-15:8:0:-90:0.1 Gentler ~2:1 region, wider knee -> smoother on alternating voices Slow release rides over the gaps between speakers
Verify the new loudness range
Confirm the compression worked by measuring LRA before/after in the loudness normaliser's report.
1. Speech Leveler (Podcast) -> compressed.wav 2. loudness-normalizer report shows: Integrated, LRA, True-peak LRA dropping from ~20 to ~7 confirms DR was narrowed 3. Apply the normaliser's Apple preset for the -16 LUFS target
Don't gate the noise floor with compand
compand is not a gate. The -90/-90 to -70/-70 segment is flat (1:1), so the noise tail is left alone, not removed.
Misconception: 'compand will clean the quiet tail' Reality: the lowest segment is 1:1 -> noise is preserved, even lifted Fix: denoise with ai-noise-reducer, or remove gaps with silence-stripper
Edge cases and what actually happens
Treating compand output as final loudness
By designcompand reshapes dynamic range; it has no integrated-loudness target. The output is not guaranteed to be at any LUFS value. To set the publish level, follow with the loudness-normalizer (2-pass EBU R128). DR control and loudness targeting are intentionally two tools.
Over-compressing destroys the read's life
CautionStacking the Voiceover curve on already-dynamic-controlled audio collapses the range to a flat, fatiguing wall of sound. Compand once, on the rawest take. If the result is too dense, drop back from Voiceover to Podcast or to Interview's gentler ~2:1.
Noise floor lifted because the low segment is 1:1
ExpectedThe lowest transfer segment (-90/-90 to -70/-70) is unity gain, and the next segment lifts quiet content. Room hiss in that band rises with the speech. This is correct companding, not a fault — denoise with ai-noise-reducer before compressing.
Output peaks hot after the curve's make-up
Use a limiterThe Voiceover curve's -12 dB endpoint is hotter than Podcast's -15 dB; on an already-hot source, peaks can approach 0 dBFS. compand is not a true-peak limiter. Cap with the true-peak-limiter at -1 dBTP afterward.
No custom transfer curve available
By designYou cannot type your own compand points or knee here — only the three presets are exposed. If you need a fully custom curve, run FFmpeg's compand directly in a terminal; the preset arguments in the curve table above are a ready starting point.
Free tier blocked
Pro requiredThis is a Pro-gated tool; the Free tier throws 'Speech Leveler requires a Pro subscription.' Processing is still in-browser with no upload — the gate is on the plan. Pro audio limits are 200 MB / 120 minutes / 10 files per the audio family.
Multi-element mix instead of a voice stem
Voice-only toolThe curves are tuned for spoken voice. On a full mix with music, the compressor reacts to whatever element is loudest and can pump the bed. Compress the voice stem alone, then add music.
Source longer than 120 minutes on Pro
RejectedPro caps per-file duration at 120 minutes (and 200 MB). A marathon recording over that is rejected until you split it (try audio-splitter) or move to Pro + Media (unlimited duration, 100 GB).
Frequently asked questions
What exactly is FFmpeg compand?
compand is FFmpeg's companding (compress/expand) filter. It is defined by an attack/decay envelope, a piecewise transfer curve mapping input dB to output dB, a soft-knee width, make-up gain, an initial volume, and a delay. Each Speech Leveler preset is one complete compand configuration — see the curve table above for the literal arguments.
Does this set a LUFS target?
No. compand controls dynamic range, not integrated loudness. After compressing, run the loudness-normalizer and pick -16 LUFS (Apple Podcasts) or -14 LUFS (Spotify/YouTube) for the level target.
How do I know the effective ratio of each preset?
Read the slope between the upper transfer points. Podcast goes -25/-15 to 0/-15: 25 dB in maps to 0 dB out above -25 dB, an effectively very high ratio holding the ceiling at -15 dB. Interview's -25/-18 to 0/-15 is gentler (closer to ~2:1). The flat lower segments are 1:1.
Can I enter my own threshold/ratio/knee?
Not in this tool — only the three presets are exposed. Each maps to a fixed curve. For a custom compand curve, run FFmpeg directly; the arguments in the curve table are the exact strings these presets build.
Which preset narrows the range most?
Voiceover engages lowest (around -30 dB) and pushes a hotter -12 dB endpoint, so it compresses the most overall. Podcast is the balanced default. Interview is the gentlest (~2:1, wider knee) and is meant for multiple voices.
Will compand clean up my noise floor?
No — its lowest segment is unity gain, so the noise tail is preserved and the next segment can even lift it. For noise removal use the ai-noise-reducer (RNNoise) before compressing.
Is the audio uploaded?
No. FFmpeg 8.1 runs as WebAssembly in your browser tab; the compand pass happens locally and the file never reaches a server.
What format does the output use?
It matches your input extension — there is no format dropdown. WAV stays WAV, FLAC stays FLAC, MP3 stays MP3 (re-encoded with the matching codec). Convert later with a sibling like wav-to-mp3 if needed.
How fast is one pass?
Fast — compand is a single-pass filter with no measurement stage, unlike the 2-pass loudness normaliser. A typical episode processes in well under a minute on a modern CPU.
Should I compress or normalise first?
Compress (this tool) first to shape dynamics, then normalise to set the level. Doing it the other way wastes the normaliser's true-peak protection because the later compression re-inflates the peaks.
Why does Voiceover sound louder than Podcast on the same file?
Its transfer curve ends at 0/-12 versus Podcast's 0/-15 — a 3 dB hotter output ceiling — and it engages 5 dB lower. That is built into the curve, not a separate gain control.
Can it expand quiet audio instead of compressing?
compand can technically expand, but these presets are configured to compress (level) the speech band. There is no expander preset here. To simply make a quiet file louder overall, use volume-normalizer instead.
Privacy first
Every JAD Audio tool runs entirely in your browser via FFmpeg (WebAssembly) and RNNoise. Your audio files never leave your device — verified by zero outbound network requests during processing.