Automated daily podcast with two AI hosts. Generates text brief + dual-voice audio, publishes to RSS, delivers via messaging.
Concept
- Format: Two hosts — one explains/analyzes, the other asks and transitions
- Duration: Configurable, default ~7 minutes
- Style: Casual, opinionated, conversational — like two friends chatting about the news
- Topics: Customizable (default: AI/Tech, Stocks, Macro, Crypto)
Architecture
Fetch News → Text Brief → Dual-Voice Script → TTS Audio → S3 Upload → RSS Update → Deliver
Configuration
Set these in your environment:
| Variable | Description |
|----------|-------------|
|
S3_BUCKET | S3 bucket name |
|
PODCAST_DOMAIN | Custom domain or S3 URL |
|
FISH_API_KEY | Fish Audio API key (https://fish.audio) |
|
FISH_VOICE_A | Fish Audio voice ID for Host A |
|
FISH_VOICE_B | Fish Audio voice ID for Host B |
Step 1: Fetch News
Use
web_fetch to scrape sources in parallel. Default sources:
https://news.ycombinator.com/ — Tech
https://www.coindesk.com/ — Crypto
https://techcrunch.com/category/artificial-intelligence/ — AI
https://finance.yahoo.com/ — Markets
Customize sources to match your podcast topic.
Step 2: Generate Text Brief
Organize news into sections with emoji headers:
☀️ Daily Brief | Mar 3, 2026
━━━━━━━━━━━━━━━━━━
🤖 Tech / AI
① Headline
→ One-line take
━━━━━━━━━━━━━━━━━━
📈 Markets
① Headline
→ One-line take
━━━━━━━━━━━━━━━━━━
🎯 Key Takeaway
Summary paragraph
Step 3: Generate Dual-Voice Script
Rewrite the brief as a dialogue. Prefix each line with speaker tag:
HostA: Welcome to today's episode...
HostB: Some big stories today...
HostA: Right, let's start with...
Guidelines:
- Host A: Explains and analyzes, knowledgeable but casual
- Host B: Asks, transitions, reacts
- Substantial turns, not one-liners
- Include analysis and discussion, not just headlines
- End with a lighter topic + sign-off
Step 4: Generate Audio
Fish Audio (recommended — natural, multi-voice):
python3 scripts/fish_dual_tts.py <script.txt> <output.mp3>
Parses speaker tags, sends each segment to Fish Audio, concatenates into final MP3.
Edge TTS (free fallback, single voice):
edge-tts --voice en-US-GuyNeural --rate "+5%" --file script.txt --write-media output.mp3
Step 5: Publish
bash scripts/generate_episode.sh <date> <EP-number> <title> <description> <mp3-file>
What it does:
- Upload MP3 to S3
- Get actual duration via ffprobe
- Insert
<item> into RSS feed (newest first)
- Update
<lastBuildDate>
Step 6: Deliver
Send text brief + audio via your preferred channel (Telegram, Discord, Slack, etc.)
RSS Feed
See
references/rss-format.md for XML template.
Key rules:
<itunes:duration> = actual duration from ffprobe (never hardcode)
<enclosure length> = actual file size in bytes
<itunes:owner> with email for Apple/Spotify verification
- Cover: 3000x3000 JPEG minimum
Hosting Options
| Option | Notes |
|--------|-------|
| S3 + Cloudflare Worker | Free HTTPS, recommended |
| S3 + CloudFront | Native AWS |
| Any static host | Just serve MP3 + feed.xml |
Cron (OpenClaw)
openclaw cron add --task "Generate daily podcast" --cron "0 8 * * *" --tz "Your/Timezone"
Dependencies
python3 + requests — Fish Audio TTS
ffmpeg / ffprobe — Audio processing
aws CLI — S3 upload
edge-tts (optional) — Free fallback TTS