Broadcast-grade microphone chains, cinematic voice changers, and a real 4-channel HRTF crossfeed for EasyEffects on PipeWire.
Noise suppression that doesn't gut your low end · a demonic voice changer that isn't just a pitch-down · a child voice that isn't a chipmunk · and JamesDSP's "Joe0Bloggs Realistic Surround" ported to EasyEffects as a true-stereo impulse response.
Requires EasyEffects 8.x (Qt). Presets use the 8.x JSON schema and will not load correctly on 7.x.
easyeffects · pipewire · linux-audio · noise-suppression · deepfilternet · voice-changer · hrtf · crossfeed · impulse-response · convolver · nixos
- Highlights
- Repository layout
- Microphone presets
- Output presets
- Impulse responses
- Dependencies
- Install — NixOS
- Install — other distros
- Installing the presets
- Usage
- Tuning
- Troubleshooting
- How it works
- Credits & licence
🎙️ A deep-voice chain that preserves vocal fry. Most Linux microphone presets high-pass at 80 Hz and run a neural denoiser at full strength. Both of those delete creak/vocal fry, which lives at 20–50 Hz — the exact band every denoiser was trained to call "rumble." These presets high-pass at 25 Hz, cap DeepFilterNet's attenuation limit, and replace the broadband noise gate with a multiband gate that protects the sub band and gates only where hiss actually lives.
👹 A demonic voice changer built on layering, not pitch-shifting. A pitch shift alone sounds like a slowed-down tape. EasyEffects' Pitch plugin exposes independent dry/wet, so each instance can emit the original and the shifted copy simultaneously. Two stacked instances = four voices at once, plus a sub-octave rumble bed, harmonic snarl, asymmetric slapback and a convolved cavern.
🧒 A child voice with a formant-corrective EQ. Pitch and formants scale by different factors between an adult and a 7-year-old (≈2.9× vs ≈1.5×), and SoundTouch physically cannot separate them. So the shift stops short of "correct," and an EQ re-carves the spectral envelope back toward where a child's formants belong. That difference is chipmunk vs. child.
🎧 joe0bloggs-realistic-surround.irs — the headline. JamesDSP's "Joe0Bloggs Realistic Surround" is not a crossfeed. It's a four-tap FIR matrix (L→L, L→R, R→L, R→R) — a 683 ms binaural room response with genuine inter-aural crosstalk. It has been extracted from JamesDSP's embedded FLAC blob and rebuilt as a 4-channel true-stereo .irs that EasyEffects loads natively. As far as we know, this is the first port of it to EasyEffects.
input_microphone/ # microphone (input) presets
output_headphones_speakers/ # playback (output) presets
irs/ # impulse responses (.irs)
| Preset | Use for | Added latency |
|---|---|---|
clear-deep-voice-rich-textured-no-gate.json |
Everyday calls, streaming, recording. The flagship. | Low (~25 ms) |
clean-less-gate-more-filter.json |
Quiet rooms. Minimal gating, leans on filtering. | Low |
deep-voice-demonic.json |
Voice changer — algorithmic reverb version. | High (~100–150 ms) |
deep-voice-demonic-ir.json |
Voice changer — convolution reverb version. | High (~100–150 ms) |
child-voice.json |
Voice changer — ~9–10 year old. | Medium (~50 ms) |
The flagship. A rich, textured, broadcast-style chain for a deep male voice that keeps the creak and rumble most presets scrub away.
Stereo Tools → Deep Noise Remover → [Gate: off] → Multiband Gate
→ EQ (cleanup) → Compressor → EQ (tone) → De-esser → Convolver → Limiter
- High-pass at 25 Hz, not 80 Hz — creak glottal pulses run 20–50 Hz.
- DeepFilterNet capped at 18 dB attenuation (default is 100) with the post-filter at 0 — the post-filter is what sandpapers creaky texture.
- The broadband gate is bypassed. A gate is a level switch: your fry is quieter than a keystroke, so no threshold separates them. The multiband gate does the job per-band instead, leaving the sub band open.
- Convolver at −12 dB wet puts the voice in a subtle room rather than a dead booth.
A leaner variant for quiet rooms. Fewer dynamics, more surgical filtering — including a −36 dB notch at 16.5 kHz to kill a specific mic whine.
Deep Noise Remover → Gate → EQ → Compressor → EQ → De-esser → Stereo Tools → Limiter
Cinematic monster voice: deep, rumbling, vast, with a pinch of echo.
Stereo Tools → Deep Noise Remover → [Gate: off] → Multiband Gate → EQ → Compressor
→ De-esser → Pitch −4 st → Pitch −1 oct → EQ → Exciter → Delay → SPACE → Limiter
- Pitch #1 drops the body −4 semitones while blending the original back in at −8 dB. The two beat against each other — that interference is what stops it sounding human.
- Pitch #2 adds a copy one octave below everything, at −9 dB: a subterranean bed, felt more than heard.
- Bass Enhancer generates harmonics of that sub layer so the rumble survives on laptop and phone speakers.
- EQ hollows out 500 Hz. Counterintuitive, but "cavernous" comes from removing midrange, not adding bass.
- Delay throws a single slap at 95 ms left / 135 ms right — the asymmetry spreads the echo while the voice stays centred and legible.
- The front end denoises harder than the clean preset (DFN at 30, sub band gated, high-pass at 70 Hz). Preserving natural fry is pointless here — the entire low end is synthesised downstream, and feeding rumble into a pitch shifter turns a desk bump into a cannon.
Which one? deep-voice-demonic.json uses the Calf reverb (adjustable decay, damping, predelay, bass-cut). deep-voice-demonic-ir.json swaps it for convolution reverb using a real impulse response — better space, but you lose the send-side bass-cut, because convolution is linear and commutes with every EQ in the chain. Pick your impulse accordingly.
Stereo Tools → Deep Noise Remover → [Gate: off] → Multiband Gate
→ EQ (band-limit) → Compressor → De-esser → Pitch +16 st → EQ (formants) → Limiter
- +16 semitones, deliberately short of a true 7-year-old's pitch. Those last few semitones would drag the formants past where any human vocal tract could put them — that overshoot is the chipmunk sound.
dryis off (−100 dB). A single dB of the original leaves an adult ghost under the child and the illusion collapses.- The second EQ is a fake vocal tract: −3.5 dB at 2.8 kHz removes the chipmunk honk, +3 dB at 1.1 kHz rebuilds an F1 so it's round rather than merely squeaky, and the high-pass sits at 170 Hz because a child has no chest resonance at all.
Perfect EQ (10-band) → Convolver: Razor Surround → Convolver: Joe0Bloggs → EQ (corrective) → Limiter
Bass-enhanced Perfect-EQ curve, then two complementary convolvers:
- Razor Surround is a 2-channel impulse → EasyEffects convolves it diagonally (L→L, R→R only). No crosstalk. It provides tonal and room colouration.
- Joe0Bloggs Realistic Surround is a 4-channel impulse → EasyEffects builds the full matrix including L→R and R→L. This is what actually moves the sound outside your head.
They do different jobs, so stacking them is intended, not redundant.
| File | Channels | Rate | Length | What it does |
|---|---|---|---|---|
joe0bloggs-realistic-surround.irs |
4 (true-stereo) | 48 kHz | 683 ms | Real HRTF binaural crosstalk. 8.2 dB direct-to-cross separation. |
Razor Surround ((48k Z-Edition)) 2.Stereo +20 bass.irs |
2 (diagonal) | 48 kHz | 186 ms | Headphone tonal/room colouration + bass. |
EasyEffects supports true-stereo (4-channel) impulse responses — a fact almost nobody uses. When a kernel has 4 channels it calls impdata_create(0,1) and impdata_create(1,0), wiring the cross-paths. The interleave order is [L→L, L→R, R→L, R→R].
ir-width must stay at 100 for the HRTF. It's not a "more surround" knob — it stretches the geometry of a virtual head.
| Component | Provides | Required by |
|---|---|---|
| EasyEffects ≥ 8.0 | the host | everything |
| PipeWire | audio server | everything |
| LSP Plugins | Gate, Multiband Gate, Compressor, Limiter, Equalizer, De-esser, Delay | all presets |
| Calf | Bass Enhancer, Exciter, Reverb, Stereo Tools | all presets |
| DeepFilterNet (LADSPA) | Deep Noise Remover | all mic presets |
| zita-convolver | Convolver | IR presets (usually bundled with EasyEffects) |
| SoundTouch | Pitch | voice changers (bundled with EasyEffects) |
{ pkgs, ... }:
{
services.pipewire = {
enable = true;
alsa.enable = true;
pulse.enable = true;
};
environment.systemPackages = with pkgs; [
easyeffects
lsp-plugins
calf
deepfilternet # Deep Noise Remover (LADSPA)
rnnoise-plugin # optional
];
}Then:
sudo nixos-rebuild switchTrack this repo as a flake input and let Home Manager place the presets and impulses for you. Nothing to copy by hand, and it survives a reinstall.
# flake.nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
home-manager.url = "github:nix-community/home-manager";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
easyeffects-presets = {
url = "github:grenudi/EasyEffectPresets";
flake = false;
};
};
outputs = { nixpkgs, home-manager, easyeffects-presets, ... }: {
homeConfigurations."you" = home-manager.lib.homeManagerConfiguration {
pkgs = nixpkgs.legacyPackages.x86_64-linux;
extraSpecialArgs = { inherit easyeffects-presets; };
modules = [ ./home.nix ];
};
};
}# home.nix
{ pkgs, easyeffects-presets, ... }:
{
home.packages = with pkgs; [
easyeffects
lsp-plugins
calf
deepfilternet
];
# recursive = true symlinks each file individually,
# so EasyEffects can still save your own presets alongside these.
home.file.".local/share/easyeffects/input" = {
source = "${easyeffects-presets}/input_microphone";
recursive = true;
};
home.file.".local/share/easyeffects/output" = {
source = "${easyeffects-presets}/output_headphones_speakers";
recursive = true;
};
home.file.".local/share/easyeffects/irs" = {
source = "${easyeffects-presets}/irs";
recursive = true;
};
services.easyeffects.enable = true; # autostart
}home-manager switchIf Deep Noise Remover doesn't appear in EasyEffects' plugin list, it's a LADSPA discovery problem, not a preset problem. Check that
LADSPA_PATHincludes/run/current-system/sw/lib/ladspa.
sudo pacman -S easyeffects lsp-plugins calf pipewire pipewire-pulse
# Deep Noise Remover (AUR):
yay -S deep-filter-ladspasudo dnf install easyeffects lsp-plugins calf pipewire pipewire-pulseaudioDeepFilterNet isn't packaged — grab the LADSPA .so from Rikorose/DeepFilterNet releases and drop it in ~/.ladspa/.
sudo zypper install easyeffects lsp-plugins calf pipewire pipewire-pulseaudioDebian and Ubuntu repositories generally still ship EasyEffects 7.x, and these presets need 8.x. Use the Flatpak.
sudo apt install flatpak
flatpak install flathub com.github.wwmm.easyeffectsflatpak install flathub com.github.wwmm.easyeffects
flatpak run com.github.wwmm.easyeffectsThe Flatpak bundles the LSP and Calf plugin sets. Confirm Deep Noise Remover appears in the plugin list; if not, add the DeepFilterNet Flatpak extension.
git clone https://github.com/grenudi/EasyEffectPresets.git
cd EasyEffectPresets
mkdir -p ~/.local/share/easyeffects/{input,output,irs}
cp input_microphone/*.json ~/.local/share/easyeffects/input/
cp output_headphones_speakers/*.json ~/.local/share/easyeffects/output/
cp irs/*.irs ~/.local/share/easyeffects/irs/Restart EasyEffects. The presets appear under Presets on the Input and Output tabs.
BASE=~/.var/app/com.github.wwmm.easyeffects/data/easyeffects
mkdir -p $BASE/{input,output,irs}
cp input_microphone/*.json $BASE/input/
cp output_headphones_speakers/*.json $BASE/output/
cp irs/*.irs $BASE/irs/Copy the
.irsfiles first. Impulses must exist before a preset that references them is loaded, or the convolver silently passes audio straight through.
See the Home Manager section above.
- Open EasyEffects → Input tab (microphone) or Output tab (playback).
- Presets → select one.
- Point your app (Discord, OBS, Zoom, browser) at the EasyEffects virtual source.
Set your sample rate to 48 kHz:
pw-metadata -n settings 0 clock.force-rate 48000Halves CPU versus 96 kHz, puts DeepFilterNet on its native rate, and avoids resampling the HRTF.
Two knobs matter more than everything else combined.
The Gate / Multiband Gate thresholds depend on your room. Sit silent, watch each band's meter, and set the threshold ~5 dB above where the noise rests. Every value shipped here is a starting point, not a law.
DeepFilterNet's attenuation limit is the noise-vs-texture dial. Higher = cleaner and flatter. Lower = noisier and more alive. There is no setting that gives you both, because a 35 Hz creak and a 35 Hz air conditioner look nearly identical to any denoiser.
| Want | Change |
|---|---|
| More noise removed | Raise Deep Noise Remover → Attenuation limit (18 → 24 → 30) |
| More vocal texture | Lower it (18 → 12) |
| More monstrous | pitch#0 semitones (−4 → −6) |
| Older child | pitch#0 semitones (+4 → +1) |
| More reverb | Convolver wet |
| Less sibilance | De-esser threshold |
The convolver does nothing / no reverb / no surround.
kernel-name in the preset must exactly match the .irs filename without its extension. If EasyEffects imported an impulse twice you'll get a name (1) suffix baked into the saved preset, and it will never resolve. A missing kernel doesn't error — it silently passes audio through.
Audio only in the left ear.
Your microphone is mono and PipeWire is presenting it as left-only. Stereo Tools must be the first effect, with the matrix set to LR > LL (Mono Left Channel). Every sidechain downstream uses "Middle" (L+R), so before this fix they all read ~6 dB quiet — recalibrate your gate thresholds afterwards.
A constant tone / whine that survives muting the mic.
Self-oscillation. Check that the routing gains inside Gate/Compressor/Limiter (input-to-sidechain, sidechain-to-input, …) are at −80.01 dB, not 0.0. In EasyEffects 8 these are dB gains, so 0.0 means unity — fully connected, which closes a feedback loop inside the plugin. Presets converted from 7.x are a common source of this.
Deep Noise Remover missing.
LADSPA discovery. Confirm the DeepFilterNet .so is on LADSPA_PATH.
Voice changers feel laggy.
They are: SoundTouch adds real latency and the demonic presets stack two instances. Do not monitor yourself live while speaking — delayed auditory feedback in the 100–200 ms window is a documented speech disruptor and will make you stumble over your own words. Bypass pitch#1 to roughly halve it.
Vocal fry / low rumble disappears. Something is eating it. In order of likelihood: Deep Noise Remover's attenuation limit is too high; the high-pass is above ~40 Hz; the gate threshold is above your creak's level.
Details worth knowing if you plan to fork these.
Convolution is linear, so it commutes with EQ. In deep-voice-demonic-ir.json no EQ can pre-filter the reverb send independently of the dry voice — the Calf reverb's bass-cut has no equivalent. Only the nonlinear plugins care where they sit relative to the convolver, which is why the Bass Enhancer moved after it: it fabricates harmonics of the octave-down layer, and convolving those with a long tail produces a sustained low-mid drone that swallows the voice.
A gate is a switch, not a filter. While it's open, everything passes — which is why noise sits inside your voice while silence stays clean. Only per-frequency processing (multiband gate, or a neural denoiser) removes noise during speech.
The HRTF port. JamesDSP stores mode 5's impulse as a FLAC blob (CCConv) in binaryBlobs.c with four hardcoded per-channel gains (0.436 / 0.076 / 0.052 / 0.455 — the large pair are the direct paths, the small pair the contralateral cross-paths). Its loader signature is (irLL, irLR, irRL, irRR) — identical to EasyEffects' 4-channel de-interleave order. Decode, apply the gains, write as a 4-channel WAV with an .irs extension, and EasyEffects reproduces it exactly. autogain is safe to leave on, incidentally: it applies a single shared scalar to all four channels, so the direct/cross ratio survives.
- EasyEffects by Wellington Wallace — GPL-3.0
- JamesDSP — GPL-3.0.
joe0bloggs-realistic-surround.irsis derived from its embedded HRTF data; the surround profile is credited to Joe0Bloggs. - LSP Plugins, Calf Studio Gear, DeepFilterNet, zita-convolver, SoundTouch — their respective licences.
- Razor Surround is a third-party impulse response included for convenience; check its own terms before redistributing.
Licensed GPL-3.0, required for compatibility with the JamesDSP-derived HRTF data.
EasyEffects presets · PipeWire · Linux microphone noise suppression · DeepFilterNet · RNNoise · noise gate · multiband gate · LSP Plugins · Calf · vocal fry · deep voice preset · broadcast voice chain · voice changer Linux · demonic voice · child voice · pitch shifter · SoundTouch · convolver · impulse response · IRS · HRTF · crossfeed · true-stereo impulse response · binaural · out-of-head · headphone surround · JamesDSP · Joe0Bloggs Realistic Surround · NixOS · Home Manager · Arch Linux · Fedora · Debian · Ubuntu · Flatpak · Discord · OBS · streaming
Suggested GitHub topics:
easyeffects pipewire linux-audio audio-presets noise-suppression deepfilternet voice-changer pitch-shift hrtf crossfeed binaural impulse-response convolution-reverb jamesdsp nixos home-manager microphone obs discord