Generate a daily two-voice podcast in EN and FR based on the day's press review.
Daily Podcast Recipe
Overview
Generate a daily two-voice podcast in EN and FR based on the day's press review.
Voices
English
- Xavier (host 1):
29416c86-7536-4e5e-b5e7-4196654b2dfc - Leen (host 2):
9c053607-1c72-4e27-8605-6cb59d4bff0b - Hosts introduce themselves: "I'm Xavier" / "I'm Leen"
French
- Raymond Devos (host 1):
bcf5b640-95ef-4756-8e95-3ef1411767b1 - Annie Cordy (host 2):
b6100480-a429-44dd-9062-6888c14c8c20 - Hosts introduce themselves: "Ici Raymond Devos" / "Annie Cordy"
Unused (no Dutch TTS support)
- Arno (Flemish):
634cf08a-f580-4b60-bcab-2c42b98e130c - Leen Flemish:
9ff3caaa-a069-4b75-8ed7-c27c765003f1
Voicebox API (localhost:8100)
Key endpoints
POST /generate— generate one voice segment (profile_id, text, language, model_size)POST /stories— create a story (container for multiple segments)POST /stories/{id}/items— add a generation to a storyGET /stories/{id}/export-audio— export assembled story as MP3
Text limit: 5000 chars per generation
Model: use 0.6B (the 1.7B is better but may need re-downloading after restarts)
Script Structure
- Source text: Based on that day's press review at
docs/press-reviews/YYYY-MM-DD-press-review.md - Format: 8-12 alternating segments between the two hosts, conversational tone
- Content flow:
- Intro: both hosts introduce themselves by name ONCE, mention it's the Manneken Podcast
- Weather + urgent alerts (air quality, strikes, etc.)
- Top stories (2-3 headlines)
- Categories: Politics, Transport, Sport, Culture, Safety
- Outro: both hosts sign off
- IMPORTANT — No name prefixes in speech: Do NOT include "Xavier:", "Leen:", "Raymond:", "Annie:" labels in the generated text. Hosts introduce themselves ONCE at the start, then just alternate naturally. The listener hears different voices — they don't need name tags every turn.
- Generation: Each segment → Voicebox
/generate→ collect generation IDs - Assembly: Create story → add all generation IDs as items → export as MP3
- Output: Save to
/opt/voicebox/podcasts/podcast-YYYY-MM-DD-{en,fr}.mp3
Script
scripts/generate-podcast.sh [YYYY-MM-DD] — generates both EN and FR podcasts.
Deployment
After generating, run bash scripts/deploy-site.sh to rebuild the website (podcast page scans /opt/voicebox/podcasts/).
Discord posting
Post the podcast to Discord by embedding the audio file directly as an attachment (not just a link). Use the message tool with filePath pointing to the MP3.
Daily cron
- Cron ID:
b736464c-ffd4-40b8-9251-af529ed6d0f7 - Schedule: 07:05 CET daily
- Task: The cron should:
- Read today's press cache (
docs/cache/press.md) - Write the podcast script (alternating segments)
- Call Voicebox API to generate each segment
- Assemble into stories and export MP3s to
/opt/voicebox/podcasts/ - Run
bash scripts/deploy-site.sh - Post to Discord
- Read today's press cache (
Important notes
- File naming MUST be
podcast-YYYY-MM-DD-en.mp3/podcast-YYYY-MM-DD-fr.mp3 - The Astro podcast page scans
/opt/voicebox/podcasts/(NOT/var/www/manneken/podcast/episodes/) - Deploy script copies episodes from voicebox to the web dir
- Dutch is NOT supported by Qwen3-TTS (only zh/en/ja/ko/de/fr/ru/pt/es/it)
- ElevenLabs API key in
docs/private/api-keys.json— only for Leen clone + Dutch if ever needed