Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

phonepod-0.1.0b2.tar.gz (7.3 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

phonepod-0.1.0b2-py3-none-any.whl (23.3 kB view details)

Uploaded Python 3

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

Hashes for phonepod-0.1.0b2.tar.gz
Algorithm Hash digest
SHA256 c41e7e2c8dece2625c4229cfe896c8a8dcb90a34c0c33e99a0913126e183ca47
MD5 acb87a339beb3072a3040dd7a744f20d
BLAKE2b-256 35c437cea89ee66deae9f1c3df0ab11717dd544abbcb2b9ad41c36f77dd0f3e7

See more details on using hashes here.

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

Hashes for phonepod-0.1.0b2-py3-none-any.whl
Algorithm Hash digest
SHA256 4b0d2a7a4527a63be3c72642fd6d0b95977704ed208d2f921f2223f93ab2011d
MD5 8577c47ea3f90dffcb1bb6a1433a1e6a
BLAKE2b-256 ad20ab4ce4beafec9a0ccab7c283661d56bf8ed79dc4b2e30968c02d69c75064

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page