# 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 story
- `GET /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

1. **Source text**: Based on that day's press review at `docs/press-reviews/YYYY-MM-DD-press-review.md`
2. **Format**: 8-12 alternating segments between the two hosts, conversational tone
3. **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
4. **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.
4. **Generation**: Each segment → Voicebox `/generate` → collect generation IDs
5. **Assembly**: Create story → add all generation IDs as items → export as MP3
6. **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:
  1. Read today's press cache (`docs/cache/press.md`)
  2. Write the podcast script (alternating segments)
  3. Call Voicebox API to generate each segment
  4. Assemble into stories and export MP3s to `/opt/voicebox/podcasts/`
  5. Run `bash scripts/deploy-site.sh`
  6. Post to Discord

## 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
