Production-ready OpenClaw skill for podcast transcription and summarization using local Whisper.
- ✅ RSS Feed Parsing - Apple Podcasts, 小宇宙, generic RSS
- ✅ Local Transcription - Faster-Whisper (no API calls, no costs)
- ✅ Multiprocessing Timeout - Prevents hanging on long episodes
- ✅ Smart Caching - Avoids re-transcribing the same audio
- ✅ Batch Processing - Process multiple feeds in one run
- ✅ AI-Powered Summaries - Generate structured, insightful summaries
- ✅ Cron-Friendly - Built for automated daily runs
- ✅ JSON Output - Flexible integration with any agent or platform
# Install
cd ~/.openclaw/skills
git clone https://github.com/happynocode/openclaw-skill-podcast.git podcast-summarizer
cd podcast-summarizer
./setup.sh
# Test single episode
./podcast-summarizer --url "https://example.com/episode.mp3"
# Scan RSS feed (last 24 hours)
./podcast-summarizer --rss "https://lexfridman.com/feed/podcast/" --hours 24
# Daily batch (for cron)
./podcast-summarizer --config feeds.json --daily --output /tmp/podcast_summary.jsonSupports multiple podcast platforms:
- Apple Podcasts
- 小宇宙 (Xiaoyuzhou)
- Generic RSS feeds
- Direct audio URLs
Downloads and caches audio files:
- Cached in
~/.openclaw/cache/podcast-summarizer/audio/ - Skips re-download if already cached
- Supports multiple audio formats (MP3, M4A, etc.)
Uses Faster-Whisper for local transcription:
- Model: medium (1.5GB, accurate)
- Timeout: 30 minutes with multiprocessing control
- Caching: Transcripts cached to avoid re-processing
- Languages: Auto-detect or specify
Performance:
- 1 hour audio ≈ 15-20 minutes transcription
- First run downloads model (~1.5GB)
- Subsequent runs use cached model
Generates structured summaries using LLM API:
### 📻 核心主题
- 一句话概括这期节目的主题
### 💡 关键要点(详细展开,每点2-3句话)
1. **要点1**:详细解释,包含具体案例或数据
2. **要点2**:...
### 🎯 金句/洞察
- 值得记住的观点或表述
### 💰 实用价值
- 对谁有用
- 如何应用Create feeds.json:
{
"feeds": [
{
"name": "Lex Fridman Podcast",
"rss": "https://lexfridman.com/feed/podcast/"
},
{
"name": "硅谷早知道",
"rss": "https://feed.xyzfm.space/68fyjknth9hj"
}
],
"hours_lookback": 24,
"whisper": {
"model": "medium",
"language": "zh",
"timeout_seconds": 1800
}
}| Model | Size | Speed | Accuracy |
|---|---|---|---|
| tiny | 75MB | Fastest | Low |
| base | 142MB | Fast | Good |
| small | 466MB | Medium | Better |
| medium | 1.5GB | Slower | Best (default) |
{
"generated_at": "2026-02-14T11:17:00Z",
"items": [
{
"title": "Episode Title",
"show_name": "Podcast Name",
"url": "https://...",
"audio_url": "https://media.../episode.mp3",
"duration": "1:23:45",
"published": "2026-02-14T08:00:00Z",
"has_transcript": true,
"summary": "# Markdown summary...",
"metadata": {
"file_size_mb": 85.3
}
}
],
"stats": {
"total_episodes": 3,
"with_transcript": 2,
"without_transcript": 1
}
}schedule:
kind: cron
expr: "0 13 * * *" # 1 PM daily
payload:
kind: agentTurn
message: |
Run Podcast daily summary:
1. Execute skill:
podcast-summarizer --config feeds.json --daily --output /tmp/summary.json
2. Read output and process each episode
3. Send to Discord/Telegram
4. Sync to Notionimport json
# Read output
with open("/tmp/podcast_summary.json") as f:
data = json.load(f)
# Process each episode
for item in data["items"]:
if item["has_transcript"]:
# Send to messaging platform
send_message(item["summary"])
# Sync to Notion
sync_to_notion(item)Adjust in feeds.json:
{
"whisper": {
"model": "medium", // tiny, base, small, medium
"language": "zh", // or "en", "ja", etc.
"timeout_seconds": 1800 // 30 minutes
}
}The skill uses multiprocessing to enforce timeout limits:
- Default: 30 minutes (1800 seconds)
- If transcription exceeds timeout, process is forcefully terminated
- Prevents hanging on very long episodes
Transcripts are cached in ~/.openclaw/cache/podcast-summarizer/transcripts/:
- Filename:
{audio_url_hash}.txt - Avoids re-transcribing the same audio
- Manually clear old cache if needed
feedparser- RSS feed parsingfaster-whisper- Local transcriptionrequests- HTTP requests- Python 3.9+
All dependencies are installed automatically by setup.sh.
OPENCLAW_GATEWAY_TOKEN- OpenClaw API token for LLM callsOPENAI_API_KEY- OpenAI API key (alternative)
Configure in ~/.openclaw/openclaw.json or set as environment variables.
Edit scripts/summarize.py to use your preferred model:
"model": "gpt-4o-mini", # Change to your modelExamples:
gpt-4oclaude-3-5-sonnet-20241022gemini-2.0-flash-exp
- Default timeout: 30 minutes
- For longer episodes, increase
timeout_secondsin config - Use smaller Whisper model (
baseinstead ofmedium)
- First run downloads model (~1.5GB for medium)
- Stored in
~/.cache/huggingface/ - Requires internet connection
- Check audio URL is accessible
- Some podcasts may have geo-restrictions
- Try a different episode
- Use smaller Whisper model (
baseorsmall) - Reduce number of concurrent transcriptions
- Close other applications
- Daily Podcast Digest - Monitor your favorite shows
- Research & Learning - Extract insights from educational podcasts
- Content Curation - Build a searchable archive of episodes
- Multilingual Support - Transcribe podcasts in any language
- Use caching - Transcripts are cached automatically
- Batch processing - Process multiple episodes in one run
- Choose right model - Balance speed vs accuracy
- Monitor timeout - Adjust based on episode length
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
MIT License - see LICENSE for details.
- OpenClaw - AI agent framework
- Faster-Whisper - Fast Whisper transcription
- feedparser - RSS feed parsing
Built with ❤️ for the OpenClaw community