MinusPod 开源自托管播客去广告服务器
ttlequals0/MinusPod
MinusPod 是一个自托管服务器,在播放前用 faster-whisper 或 Parakeet 本地转录播客,再由 LLM 识别并切掉广告片段。它支持 Claude、Ollama、OpenRouter 等 OpenAI 兼容接口,并把用户对切点的修正沉淀为跨集广告模式,重复赞助商无需再次调用 LLM。
MinusPod is a self-hosted server that removes ads from podcasts before you ever hit play. It transcribes episodes locally with faster-whisper or Parakeet (or through a remote API), uses an LLM to detect and cut ad segments, and builds cross-episode ad patterns from your corrections so repeat sponsors get caught without re-asking the LLM. Bring your own LLM: Claude, Ollama, OpenRouter, OpenAI-compatible providers, or System One.
A tour of the web UI. More videos, portrait cuts and the files themselves in docs/videos.
minuspod-demo-landscape.mp4
Features
Ad detection
- An LLM finds ads in the transcript, a second pass verifies the cut, and an optional reviewer confirms or adjusts each boundary. How it works
- Audio evidence backs the transcript: loudness and DAI transitions, a cross-fetch diff against a second download, per-feed jingle cues, and the publisher's own transcript. Audio cues, Transcript differential
- Each detection gets a category (sponsor, cross-promo, self-promo, intro/outro) and a per-feed action: remove, beep, keep, or mark as a skippable chapter
- Low-confidence cuts wait in a review queue with a waveform editor; your corrections become cross-episode patterns so repeat sponsors are caught without another LLM call
- Five per-feed processing modes, from full detection to pass-through
Transcription and LLMs
- Transcribe locally with faster-whisper or NVIDIA Parakeet on GPU or CPU, or remotely through whisper.cpp, Groq, OpenAI, or OpenVINO. Transcription
- Anthropic, OpenRouter, Ollama, System One, or any OpenAI-compatible endpoint, switchable at runtime with per-stage models and editable prompts. LLM providers
- A/B routing between two providers, failover to a standby, rate-limit holds, and an offline queue for self-hosted endpoints
Patterns and sponsors
- Learned patterns scoped per podcast, network, or globally, with a sponsor list and aliases
- Opt-in community pattern sync with one-PR contribution back
- Scheduled Pattern Cleanup suggests trims, splits, and retirements, with approval and undo
Publishing
- Re-cut RSS feeds per podcast with versioned audio, a replacement sound at each cut, loudness leveling, and lossless MP3 stream copy where the cut allows
- Podcasting 2.0 tags regenerated: transcripts, chapters, AI-content disclosure, value-for-value passed through
- Podping listener refreshes a feed seconds after the host announces an episode
- OPML import and export, podcast search from Add feed, an optional cover-art badge, a combined Recents feed, and local feeds built from your own audio files
Web UI and administration
- Feed, episode, queue, search, pattern, sponsor, history, stats, and settings views. Installs as an app on iOS, Android, macOS, and Windows. Web interface
- Stats and an LLM cost ledger down to the individual call
- Retention per feed, scheduled encrypted backups, email and webhook notifications, and a REST API with OpenAPI. API and webhooks
- Password auth for the UI and API, feed keys or per-feed subscriber keys for RSS, provider keys encrypted at rest. Security
How it works
The transcriber turns the episode into text, an LLM marks the ad segments, FFmpeg cuts them, and Flask serves the modified feed and audio. One episode, end to end:
minuspod-how-it-works-landscape.mp4
The full pipeline, including the verification pass, sliding windows, pattern learning, and audio analysis, is in docs/how-it-works.md.
Requirements
- Docker on an amd64 or arm64 host. An NVIDIA GPU speeds up local transcription but is not required.
- An LLM: an Anthropic or OpenRouter API key, Ollama for local inference, a System One credential, or any OpenAI-compatible endpoint.
Whisper and Parakeet sizing and RAM/VRAM figures are in Installation.
Quick start
# 1. Create environment file cat > .env << EOF ANTHROPIC_API_KEY=your-key-here BASE_URL=http://localhost:8000 MINUSPOD_MASTER_PASSPHRASE=long-random-string-you-will-not-lose OPENAI_MODEL=claude-haiku-4-5 EOF # 2. Create data directory mkdir -p data # 3. Run (pick one) docker compose up -d # NVIDIA GPU image docker compose -f docker-compose.cpu.yml up -d # CPU image, no GPU needed
Open http://localhost:8000/ui/, set an application password, and add a feed. The GPU image is amd64 with the NVIDIA container runtime; the CPU image runs natively on amd64 and arm64. Both read the same .env and data/ directory.
MINUSPOD_MASTER_PASSPHRASE encrypts provider keys at rest, so set it before you store any. Remote first-time setup, public processing, and the slower stable release channel are covered in Installation.
Documentation
| Topic | |
|---|---|
| Installation | Requirements, sizing, quick start, CPU image |
| Environment variables | Every env var |
| LLM providers | Providers, recommended models, pricing |
| Transcription | faster-whisper, Parakeet, remote APIs, OpenVINO |
| Web interface | Management UI and the ad editor |
| How it works | The detection pipeline in depth |
| Workflows | Processing modes, re-runs, failure paths |
| Configuration | Every setting and experiment |
| Security and storage | Remote access, authenticated feeds, backups |
| API and webhooks | REST endpoints, webhook events, notifications |
| Podcasting 2.0 | What is emitted, regenerated, and stripped |
| Glossary | Every term the app uses |
The full docs index covers the rest: audio cues, community patterns, Pattern Cleanup, System One, failover, local feeds, download history, configuration import and export, deployment, releasing, and the LLM benchmark report.
Contributing
Bug reports, feature requests, and pull requests are welcome. Open an issue first for larger changes so we can agree on the approach. Ad patterns go through Community Patterns and benchmark results through Benchmark Contributing. Fork-derived features and community bug reports are credited in the CHANGELOG entry that ships them.
Disclaimer
This tool is for personal use only. Only use it with podcasts you have permission to modify or where such modification is permitted under applicable laws. Respect content creators and their terms of service.
License
MIT
LLM disclosure
This project was developed using AI agents as a pair programmer. It was NOT vibe coded. For context, I'm a systems engineer who also writes code professionally with 15+ years of experience. The codebase follows engineering best practices, and all architecture and design decisions were made by me, not by AI. All code generated by LLMs was reviewed and tested by me, a human.
来源:GitHub · github.com


