ferraus denoise

Remove steady background noise (hiss, hum, fan, room tone) or run a speech denoiser

Synopsis

ferraus denoise <input> [options] [-o <output>]

What it does

Learns what the noise sounds like from a noise-only region (a saved profile, --noise-range, or an automatically found quiet second) and subtracts that fingerprint from the whole file with a soft spectral gate that avoids the chirping 'musical noise' of simple gates. --mode adaptive tracks a changing noise floor with no profile; --mode ml runs a speech model (RNNoise built in, DeepFilterNet 3 through its model slot); --mode hybrid runs the profile pass and then the model on what remains. With no options it finds the quietest second and learns the noise from it. --reduction 0dB returns the input exactly.

This command is also an fx stage and a pipeline op: ferraus fx in.wav -o out.wav --fx "denoise:key=value".

Examples

Find the quietest second, learn the noise from it, and remove it

ferraus denoise take.wav --auto -o clean.wav

Apply a saved room profile with stronger reduction

ferraus denoise take.wav --profile room.noiseprof --reduction 18dB -o clean.wav

One shot from a noise-only lead-in, and keep what was removed for listening

ferraus denoise interview.wav --noise-range 0s..1.5s --residual removed.wav -o clean.wav

Follow a changing background (traffic, wind) with no profile

ferraus denoise street.wav --adaptive --reduction 10dB -o clean.wav

Speech denoising with DeepFilterNet 3 (downloads the 8 MB model once with -y)

ferraus denoise call.wav --mode ml -y -o clean.wav

Speech denoising with the built-in RNNoise model (no download)

ferraus denoise call.wav --mode ml --model rnnoise -o clean.wav

Options

FlagTypeDefaultMeaning
--profilepath—Noise profile (.noiseprof JSON) learned with 'ferraus denoise profile'
--noise-rangerange—One shot: learn the noise from this noise-only region of the input, e.g. 0s..2s
--autoflag—One shot: find the quietest spectrally stable 1 s region and learn the noise from it (reported as noise_region in --json)
--modeprofile | adaptive | ml | hybridprofileprofile: spectral gate from a noise profile; adaptive: minimum-statistics tracking with no profile; ml: speech model; hybrid: profile pass, then the model
--adaptiveflag—Same as --mode adaptive
--reductiongain12dBHow far noise is pushed down, in dB (0dB leaves the input unchanged) Range: 0..60.
--sensitivitynumber6Gate threshold above the noise profile: threshold = mean + sensitivity × std, scaled so 6 means 6 dB above steady hiss; higher removes more Range: 0..48.
--smoothinginteger3Smooth the gain mask across ± this many frequency bins (fewer chirps, slightly softer edges) Range: 0..32.
--attacktime20msHow fast the gate opens (a matching lookahead keeps onsets intact), e.g. 20ms
--releasetime120msHow fast the gate closes after a sound ends, e.g. 120ms
--artifact-controlpercent50%Blend in a median-filtered mask and a steady noise floor: higher removes more chirping at the cost of a little more residual noise
--linkon|offonon: one gain mask for all channels so the stereo image stays put; off: per-channel masks
--preserve-transientson|offonDetect onsets and hold the gate open through them so attacks stay crisp
--noisinesspercent30%Adaptive mode: how much of the audio is noise; higher sets the threshold further above the tracked floor (20 dB × noisiness)
--decaypercent65%Adaptive mode: how slowly reduction relaxes after a sound (release = 200 ms × decay unless --release is given)
--floorgain0dBAdaptive mode: shift the tracked noise floor in dB (positive removes more)
--modeldfn3 | rnnoise | musicdfn3ml/hybrid modes: dfn3 = DeepFilterNet 3 (48 kHz, speech, best quality; model denoise/dfn3, 8 MB download), rnnoise = RNNoise (fast, light, built in, no download, speech), music = music-aware slot denoise/music-*
--strengthpercent100%ml/hybrid modes: how much of the model's change to apply
--residualpath—Also write the removed component (input minus the fully processed output, before --mix) to this audio file
--dereverbflag—Add the best-effort de-reverb stage (model slot denoise/dereverb-*)
--mixpercent100%Dry/wet balance: 0% returns the input unchanged, 100% is fully processed

Global options

Every command also accepts the global options (-o, --json, --dry-run, --overwrite, --progress, ...). See Global options.

Exit codes

CodeMeaning
0Success
1Processing failed
2Usage or parameter error
3Input missing or unreadable
4Unsupported format or codec
5Model not cached and downloads disabled
6Model download or verification failed
8Cancelled
10Network error
70Internal error (bug)

Common mistakes

  • Forgetting that outputs are never overwritten: pass --overwrite or a new -o path when re-running.
  • Beat-based times (4b, 1/4) need a tempo: pass --bpm or write 4b@120.
  • Percentages accept 80% or the fraction 0.8; a bare 80 means 80x, not 80%.
  • Gains need a unit when not in dB: 0.5x is a factor, -6 and -6dB are decibels.

For models

  • MCP tool: ferraus_denoise
  • Schema: ferraus schema denoise
  • Pipeline: { op: denoise, args: { ... } } (flag names with _ instead of -)
  • fx stage: yes
{"command": "denoise", "defaults": {"mode": "profile", "reduction": "12dB", "sensitivity": "6", "smoothing": "3", "attack": "20ms", "release": "120ms", "artifact_control": "50%", "link": "on", "preserve_transients": "on", "noisiness": "30%", "decay": "65%", "floor": "0dB", "model": "dfn3", "strength": "100%", "mix": "100%"}}