MorphMic
Real-time voice processor for Linux. Captures audio from a physical
microphone, runs it through a DSP graph (gate, denoise, EQ, pitch / formant
shift, ring modulator, band-pass, compressor, limiter, gain) and exposes the
result as a virtual microphone MorphMic_Microphone that Discord, Zoom, OBS,
the browser, etc. pick up via PipeWire/PulseAudio.
Components
| Binary | Purpose |
|---|---|
morphmicd |
Long-running daemon: pactl module lifecycle, real-time DSP, JSON-RPC server. |
morphmic-gui |
PySide6 desktop GUI: dark theme, profile picker with editor, VU meters, ECHO test mode. |
morphmic-tui |
curses console UI: same feature surface, no X11 needed. |
morphmic |
Click-based CLI for scripts and headless setups. |
The daemon and the clients talk over a Unix socket ($XDG_RUNTIME_DIR/morphmic/control.sock, mode 0600) using JSON-RPC 2.0.
License: GPL-3.0-or-later.
Installation
System dependencies (Ubuntu 24.04)
sudo apt install -y python3.12 python3-venv python3-pip \
libportaudio2 portaudio19-dev librubberband-dev \
pulseaudio-utils pipewire pipewire-pulse ffmpeg \
autoconf automake libtool
# librnnoise is not in the Ubuntu 24.04 repos — build from source.
git clone --depth 1 https://github.com/xiph/rnnoise.git /tmp/rnnoise
(cd /tmp/rnnoise && ./autogen.sh && ./configure && make && sudo make install && sudo ldconfig)
Install MorphMic
Pick one. All three install the same morphmicd, morphmic-gui,
morphmic-tui, morphmic console scripts into the venv's bin/.
# A) Editable install from a local clone (dev workflow)
git clone https://github.com/wachawo/morphmic.git
cd morphmic
python3.12 -m venv .venv
.venv/bin/pip install -e ".[gui,dev]"
# B) Install straight from GitHub (no clone)
python3.12 -m venv .venv
.venv/bin/pip install "morphmic[gui] @ git+https://github.com/wachawo/morphmic.git"
# C) Headless / CLI-only (skip the [gui] extra to avoid PySide6)
.venv/bin/pip install "morphmic @ git+https://github.com/wachawo/morphmic.git"
Extras: gui adds PySide6, dev adds pytest/ruff/black, all is gui+dev.
Docker Compose
docker compose up -d # vc_daemon + vc_gui services
The host PipeWire socket is forwarded via /run/user/1000.
Quick start
After installing via pip (editable or from GitHub), activate the venv and
use the short commands:
# 1. Start the daemon (creates MorphMic_Microphone, runs DSP with profile "clean").
morphmicd --profile clean
# 2a. Desktop GUI
morphmic-gui
# 2b. Console TUI (curses, works over SSH)
morphmic-tui
# 2c. CLI commands
morphmic status
morphmic profiles set deep
morphmic denoise on --level 0.7
morphmic echo on --delay-ms 1500
# Self-check
morphmic doctor
Equivalent dev forms (run straight from a checkout, no install needed):
python3 daemon/main.py --profile clean
python3 gui/main.py
python3 tui/main.py
python3 -m tui.cli status
In Discord/Zoom/OBS/the browser, pick MorphMic_Microphone as the input device.
Built-in profiles
| Profile | Effect |
|---|---|
clean |
Gate + denoise + EQ + compressor + limiter (default). |
bypass |
Pass-through, no processing. |
deep |
Low, bassy (pitch -3, formant -3). |
bright |
Bright, airy (pitch +2, formant +1). |
robot |
Ring modulator at 80 Hz. |
radio |
Old-radio: 300-3000 Hz band-pass + soft clip. |
monster |
Deep monster (pitch -7, formant -5). |
anonymous |
Anonymisation (pitch -5 + 60 Hz ring-mod). |
child |
Higher pitch + formant lift. |
woman |
Pitch +3, formant +2. |
olderman |
Pitch -2, formant -1, slight roughness. |
Profiles are TOML files in ~/.config/morphmic/profiles/. Create custom
ones from the GUI (New… → editor) or from the CLI (profiles export →
edit → profiles save).
Audio engine
The daemon supports two backends:
pipe(default whenpw-catorparec+pacatare installed) — capture/playback through subprocesses. Bypasses libpulse entirely; opens in ~50 ms instead of the 30 s timeout that PortAudio's pulse host API produces on PipeWire systems where pipewire-pulse is wedged.portaudio—sd.Stream(device=("pulse","pulse")). Lower latency, the original code path, recommended on classic PulseAudio.
Select the backend:
morphmicd --audio-engine pipe # subprocess
morphmicd --audio-engine portaudio # PortAudio
morphmicd --audio-tool pw-cat # force PipeWire-native
Or in ~/.config/morphmic/config.toml:
audio_engine = "pipe" # auto | portaudio | pipe
audio_tool = "auto" # auto | pw-cat | parec
Testing
bash scripts/run_tests.sh # ruff + black + pytest
192 unit + integration tests at v1.0.0.
System requirements
- Ubuntu 24.04 LTS or any distribution with PipeWire ≥ 1.0 + WirePlumber.
- Python ≥ 3.12.
- Any PipeWire-compatible microphone.
Project files
ROADMAP.md— planned features for upcoming releases.CHANGELOG.md— release-by-release notes.LICENSE— full license text (GPL-3.0-or-later).
Metadata
Release files for morphmic 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| morphmic-1.0.0.tar.gz | 77.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| morphmic-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 173.2 kB
Release files / morphmic-1.0.0.tar.gz
| Download URL | morphmic-1.0.0.tar.gz |
|---|---|
| Size | 77.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1df958b3f9f81b8339bd528d6fbdd798d1cc7d2558943341533e18adba134fb9
|
|
BLAKE2b-256 checksum How to use checksums |
f26e57310d9d249da0bc89ddbf04302899d0ad7b2538fc7719e801544518192f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 29, 2026.
Transparency logRelease files / morphmic-1.0.0-py3-none-any.whl
| Download URL | morphmic-1.0.0-py3-none-any.whl |
|---|---|
| Size | 95.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6570268c611441364c8e0a65a7a32f80363ad26a3a0f365e0f390528b257b128
|
|
BLAKE2b-256 checksum How to use checksums |
44e0483b3d2bda293ed44e45876240357063ce152b7bf416ce9beaf0df282c42
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 29, 2026.
Transparency log