This release is a pre-release and may not be stable for production use.
phonepod
Local AI audio restoration. Phone recording → podcast quality.
Zero cloud. Zero uploads. Everything runs on your machine.
phonepod transforms noisy voice memos into broadcast-ready audio. It combines neural noise suppression (DeepFilterNet3 + MossFormer2) with a subtractive DSP mastering chain - all running locally on CPU. No cloud, no uploads, no subscription.
Status:
0.1.0-beta.1- works well, API may change. Feedback welcome.
Before / After
Audio demos coming soon — record on your phone, run
phonepod, hear the difference.
Install
pip install phonepod
Requires Python 3.11+ and ffmpeg (brew install ffmpeg on macOS).
Usage
CLI (simplest)
phonepod recording.m4a podcast.wav
Python API
import phonepod
# One-liner: file in, file out
phonepod.enhance("recording.m4a", "podcast.wav")
# Advanced: tensor-level control
engine = phonepod.Engine()
enhanced_tensor, sample_rate = engine.enhance(audio_tensor, input_sr)
Web UI
pip install phonepod[ui]
python -m phonepod.app
# Opens at http://localhost:7860
What it does
| Stage | Model / Tool | What it does |
|---|---|---|
| 1 | DeepFilterNet3 | Neural noise suppression - removes background noise |
| 2 | MossFormer2 (48kHz) | Speech enhancement - fills frequencies phones can't capture |
| 3 | Pedalboard DSP | Subtractive mastering - gate, HPF, EQ cuts (mud/box/nasal), 2x compression, de-ess |
| 4 | Pedalboard Reverb | Optional studio room ambience |
| 5 | pyloudnorm | Loudness normalization to -18 LUFS (podcast standard) |
| 6 | Limiter + ceiling | Prevents clipping at -1.5 dB ceiling |
Subtractive philosophy: all EQ moves are cuts, not boosts. Remove mud (200Hz), boxiness (500Hz), nasal honk (1500Hz), and harshness (6500Hz). The ML models already shaped the frequency balance - cuts work with them, boosts fight them.
Processing a 2-minute recording takes ~7 seconds on Apple Silicon.
How it started
phonepod began as a personal problem: voice memos recorded on a phone sound terrible in a podcast. The AI models that exist are research demos, not products. Professional mastering chains exist but don't denoise. Nothing combines both into a single, local pipeline.
So I built it. The full build story — from first prototype to production pipeline, every dead end and breakthrough — is in JOURNEY.md.
Architecture
Input (any format)
-> ffmpeg -> 48kHz mono WAV
-> Stage 1: DeepFilterNet3 (noise suppression)
-> Stage 2: MossFormer2_SE_48K (speech enhancement)
-> Stage 3: Pedalboard mastering (gate -> HPF -> mud/box/nasal cuts -> 2x compression -> de-ess)
-> Stage 4: Reverb (subtle room ambience, optional)
-> Stage 5: LUFS normalization (-18 LUFS)
-> Stage 6: Limiter + hard ceiling (-1.5 dB)
Output: podcast-quality 48kHz WAV
Hard boundaries: the engine never touches the filesystem. The processor never touches the model. The CLI never touches tensors.
Development
# Clone and setup
git clone https://github.com/vedantggwp/phonepod.git
cd phonepod
uv sync
# Run tests (fast unit tests only)
uv run pytest -m "not slow"
# Run full test suite (loads ML models, ~30s)
uv run pytest
# Run on a file
uv run phonepod recording.m4a output.wav
License
MIT
Metadata
Release files for phonepod 0.1.0b2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| phonepod-0.1.0b2.tar.gz | 7.3 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| phonepod-0.1.0b2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 7.3 MB
Release files / phonepod-0.1.0b2.tar.gz
| Download URL | phonepod-0.1.0b2.tar.gz |
|---|---|
| Size | 7.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c41e7e2c8dece2625c4229cfe896c8a8dcb90a34c0c33e99a0913126e183ca47
|
|
BLAKE2b-256 checksum How to use checksums |
35c437cea89ee66deae9f1c3df0ab11717dd544abbcb2b9ad41c36f77dd0f3e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / phonepod-0.1.0b2-py3-none-any.whl
| Download URL | phonepod-0.1.0b2-py3-none-any.whl |
|---|---|
| Size | 23.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4b0d2a7a4527a63be3c72642fd6d0b95977704ed208d2f921f2223f93ab2011d
|
|
BLAKE2b-256 checksum How to use checksums |
ad20ab4ce4beafec9a0ccab7c283661d56bf8ed79dc4b2e30968c02d69c75064
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|