SPECTRAL(1)

πŸ“¦ version 0.10.0, in nixpkgs unstable

πŸ’… SPECTRAL(1) πŸ’…

okay so this is the general commands manual page for spectral, bestie β€” pull up a chair and let me tell you everything πŸŽ€


✨ NAME ✨

spectral β€” real-time noise suppression for PipeWire πŸ”₯ (yes, the good stuff)

✨ SYNOPSIS ✨

spectral [COMMAND]
spectral enable [--device ID] [--threshold 0-100] [--mic-name NAME]
[--rumble-filter on|off] [--auto-level on|off]
spectral {-h|--help}
spectral {-V|--version}

✨ DESCRIPTION ✨

So here's the vibe: spectral creates a virtual microphone that runs a chosen input device through RNNoise denoising and voice-activity gating, so literally any application can just select the cleaned microphone. It's giving glow-up for your mic πŸ’–

Run it with no command and it opens the graphical control panel. Run it with a command and it talks to the background daemon and exits β€” everything but the voice test works this way, no GUI needed, iykyk.

enable starts the daemon if none is running, exactly like the GUI does. But disable, shutdown and status will just report that none is running instead. And devices? That one reads the PipeWire registry directly and needs no daemon at all. Main character energy fr fr πŸ‘‘

✨ COMMANDS ✨

  • enable β€” Create the virtual microphone and start denoising. slay ✨
  • disable β€” Tear down the virtual microphone.
  • status β€” Show the daemon's state: device, mic name, threshold and toggles.
  • devices β€” List input devices with their current PipeWire ids. no daemon required πŸ’…
  • shutdown β€” Stop the daemon.

✨ OPTIONS ✨

🌸 Flags for enable

Every flag is optional except --device on a first run, and an omitted flag keeps whatever the daemon already has: the prior setting, or the default on a first run. That is literally what makes a bare spectral enable a "restore what I had" command 🫢

  • --device ID β€” Input device to capture, as listed by spectral devices. Required the first time; afterwards it defaults to the remembered device.
  • --threshold 0-100 β€” Voice gate threshold. 0 means denoise only, with the gate off. Higher values gate more strictly on voice activity. tune it, bestie 🎚️
  • --mic-name NAME β€” Virtual microphone name. Only [A-Za-z0-9_-] is allowed, 1-20 characters. no spaces, no drama πŸ™ˆ
  • --rumble-filter on|off β€” Cut low-frequency rumble below roughly 90 Hz before denoising.
  • --auto-level on|off β€” Even out voice volume automatically, with a peak limiter as the safety ceiling. very set-and-forget of it πŸ’œ

πŸ¦‹ First-position options

Both are read in place of a command, not alongside one: spectral --help prints the help text, while spectral enable --help is a usage error. read that again bestie 😭
  • -h, --help β€” Show the help text and exit.
  • -V, --version β€” Show the version and exit.

✨ EXIT STATUS ✨

  • 0 β€” Success, including a disable or shutdown that had nothing to do. we love a chill exit πŸ’–
  • 1 β€” Runtime failure, including status when no daemon is running.
  • 2 β€” Usage error; argument parsing failed before any command ran. you fumbled the flags 😬

✨ FILES ✨

  • $XDG_CONFIG_HOME/spectral/state.toml β€” Persisted settings. Falls back to ~/.config/spectral/state.toml when XDG_CONFIG_HOME is unset, empty, or not an absolute path.
  • $XDG_RUNTIME_DIR/spectral-daemon.sock β€” Control socket the GUI and the CLI use to reach the daemon. Spectral requires XDG_RUNTIME_DIR to be set to an absolute path. non-negotiable, periodt πŸ’…
  • $XDG_RUNTIME_DIR/spectral-daemon.log β€” The daemon's log. Attach it to a bug report. yes this is your receipts 🧾
  • $XDG_STATE_HOME/spectral/recordings/ β€” Voice-test recordings, readable by their owner only. Falls back to ~/.local/state/spectral/recordings/ in the same cases as the settings file. private recordings stay private πŸ”’

✨ EXAMPLES ✨

Find an input device id:

spectral devices

Create the virtual mic on a specific device:

spectral enable --device 62

Denoise only, with the voice gate off:

spectral enable --threshold 0

Re-enable with everything remembered from last time:

spectral enable

✨ NOTES ✨

Device ids come from PipeWire and are scoped to the running PipeWire instance: they change when PipeWire restarts, and a stale id will not resolve. The daemon sidesteps this by also remembering the selected device by its node name and re-resolving from that, so a flagless spectral enable keeps working across reboots and PipeWire restarts. Re-run spectral devices before passing an explicit --device. don't skip this step bestie, I'm begging 😭

A Flatpak install exports the CLI as page.codeberg.mmc.Spectral rather than spectral. plot twist 🌈

✨ SEE ALSO ✨

pipewire(1), wireplumber(1)

Full documentation: <https://codeberg.org/mmc/spectral>

✨ BUGS ✨

Report bugs at <https://codeberg.org/mmc/spectral/issues>. go off, tell them everything πŸ’€πŸ«Ά


and that's the whole page, bestie β€” this is spectral 0.10.0, dated 2026-10-22, and it ate, no crumbs πŸ‘‘βœ¨πŸŽ€

πŸ“¦ where this page comes from