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
| Flag | Type | Default | Meaning |
|---|---|---|---|
--profile | path | — | Noise profile (.noiseprof JSON) learned with 'ferraus denoise profile' |
--noise-range | range | — | One shot: learn the noise from this noise-only region of the input, e.g. 0s..2s |
--auto | flag | — | One shot: find the quietest spectrally stable 1 s region and learn the noise from it (reported as noise_region in --json) |
--mode | profile | adaptive | ml | hybrid | profile | profile: spectral gate from a noise profile; adaptive: minimum-statistics tracking with no profile; ml: speech model; hybrid: profile pass, then the model |
--adaptive | flag | — | Same as --mode adaptive |
--reduction | gain | 12dB | How far noise is pushed down, in dB (0dB leaves the input unchanged) Range: 0..60. |
--sensitivity | number | 6 | Gate threshold above the noise profile: threshold = mean + sensitivity × std, scaled so 6 means 6 dB above steady hiss; higher removes more Range: 0..48. |
--smoothing | integer | 3 | Smooth the gain mask across ± this many frequency bins (fewer chirps, slightly softer edges) Range: 0..32. |
--attack | time | 20ms | How fast the gate opens (a matching lookahead keeps onsets intact), e.g. 20ms |
--release | time | 120ms | How fast the gate closes after a sound ends, e.g. 120ms |
--artifact-control | percent | 50% | Blend in a median-filtered mask and a steady noise floor: higher removes more chirping at the cost of a little more residual noise |
--link | on|off | on | on: one gain mask for all channels so the stereo image stays put; off: per-channel masks |
--preserve-transients | on|off | on | Detect onsets and hold the gate open through them so attacks stay crisp |
--noisiness | percent | 30% | Adaptive mode: how much of the audio is noise; higher sets the threshold further above the tracked floor (20 dB × noisiness) |
--decay | percent | 65% | Adaptive mode: how slowly reduction relaxes after a sound (release = 200 ms × decay unless --release is given) |
--floor | gain | 0dB | Adaptive mode: shift the tracked noise floor in dB (positive removes more) |
--model | dfn3 | rnnoise | music | dfn3 | ml/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-* |
--strength | percent | 100% | ml/hybrid modes: how much of the model's change to apply |
--residual | path | — | Also write the removed component (input minus the fully processed output, before --mix) to this audio file |
--dereverb | flag | — | Add the best-effort de-reverb stage (model slot denoise/dereverb-*) |
--mix | percent | 100% | 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
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Processing failed |
| 2 | Usage or parameter error |
| 3 | Input missing or unreadable |
| 4 | Unsupported format or codec |
| 5 | Model not cached and downloads disabled |
| 6 | Model download or verification failed |
| 8 | Cancelled |
| 10 | Network error |
| 70 | Internal error (bug) |
Common mistakes
- Forgetting that outputs are never overwritten: pass
--overwriteor a new-opath when re-running. - Beat-based times (
4b,1/4) need a tempo: pass--bpmor write4b@120. - Percentages accept
80%or the fraction0.8; a bare80means 80x, not 80%. - Gains need a unit when not in dB:
0.5xis a factor,-6and-6dBare 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%"}}