home-lab/modules/sound/pipewire.nix
Geir Okkenhaug Jerstad 406acb3daf fix: improve voice quality and add distortion troubleshooting
- Fix RNNoise configuration: use mono instead of stereo, increase VAD threshold to 95%
- Adjust quantum settings: increase min-quantum to 64 for stability
- Add comprehensive voice distortion troubleshoot script
- Create optional disable-auto-rnnoise.nix for problematic setups
- The automatic RNNoise filter can cause artifacts, script helps diagnose and fix
2025-06-18 21:46:31 +02:00

112 lines
3.3 KiB
Nix

{
config,
lib,
pkgs,
...
}: {
imports = [
./easyeffects-presets.nix
./audio-desktop-integration.nix
];
# Enable PipeWire with full audio stack
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
jack.enable = true;
# Enable WirePlumber session manager
wireplumber.enable = true;
# Extra configuration for noise suppression
extraConfig.pipewire."10-noise-suppression" = {
"context.properties" = {
"default.clock.rate" = 48000;
"default.clock.quantum" = 1024;
"default.clock.min-quantum" = 64;
"default.clock.max-quantum" = 8192;
};
"context.modules" = [
{
name = "libpipewire-module-filter-chain";
args = {
"node.description" = "Noise Canceling Source";
"media.name" = "Noise Canceling Source";
"filter.graph" = {
nodes = [
{
type = "ladspa";
name = "rnnoise";
plugin = "${pkgs.rnnoise-plugin}/lib/ladspa/librnnoise_ladspa.so";
label = "noise_suppressor_mono";
control = {
"VAD Threshold (%)" = 95.0;
"VAD Grace Period (ms)" = 100;
"Retroactive VAD Grace (ms)" = 0;
};
}
];
};
"capture.props" = {
"node.name" = "capture.rnnoise_source";
"node.passive" = true;
"audio.rate" = 48000;
};
"playback.props" = {
"node.name" = "rnnoise_source";
"media.class" = "Audio/Source";
"audio.rate" = 48000;
};
};
}
];
};
};
# Install audio management and GUI applications
environment.systemPackages = with pkgs; [
# Noise suppression plugin
rnnoise-plugin # RNNoise LADSPA plugin
# Audio control and monitoring
pavucontrol # PulseAudio volume control (works with PipeWire)
helvum # Graphical patchbay for PipeWire
qpwgraph # Qt-based PipeWire graph manager
easyeffects # Audio effects and noise suppression GUI
pwvucontrol # Native PipeWire volume control
# Audio utilities
wireplumber # WirePlumber session manager
pipecontrol # PipeWire control utility
alsa-utils # ALSA utilities for testing
# Validation script
(writeShellScriptBin "validate-audio" (builtins.readFile ./validate-audio.sh))
# Troubleshoot script for voice distortion
(writeShellScriptBin "troubleshoot-voice-distortion" (builtins.readFile ./troubleshoot-voice-distortion.sh))
# Optional: Professional audio tools
# qjackctl # JACK control GUI (for JACK applications)
# carla # Audio plugin host
];
# Enable real-time audio processing
security.rtkit.enable = true;
# Audio group for users
users.groups.audio = {};
# Set environment variables for better audio performance
environment.variables = {
# PipeWire environment variables
PIPEWIRE_LATENCY = "1024/48000";
# Ensure applications use PipeWire
PULSE_RUNTIME_PATH = "/run/user/$UID/pulse";
};
# User session configuration for audio
systemd.user.services.pipewire-pulse.wantedBy = ["default.target"];
}