Local AI audio restoration. Phone recording → podcast quality.
Project description
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file phonepod-0.1.0b2.tar.gz.
File metadata
- Download URL: phonepod-0.1.0b2.tar.gz
- Upload date:
- Size: 7.3 MB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c41e7e2c8dece2625c4229cfe896c8a8dcb90a34c0c33e99a0913126e183ca47
|
|
| MD5 |
acb87a339beb3072a3040dd7a744f20d
|
|
| BLAKE2b-256 |
35c437cea89ee66deae9f1c3df0ab11717dd544abbcb2b9ad41c36f77dd0f3e7
|
File details
Details for the file phonepod-0.1.0b2-py3-none-any.whl.
File metadata
- Download URL: phonepod-0.1.0b2-py3-none-any.whl
- Upload date:
- Size: 23.3 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4b0d2a7a4527a63be3c72642fd6d0b95977704ed208d2f921f2223f93ab2011d
|
|
| MD5 |
8577c47ea3f90dffcb1bb6a1433a1e6a
|
|
| BLAKE2b-256 |
ad20ab4ce4beafec9a0ccab7c283661d56bf8ed79dc4b2e30968c02d69c75064
|