Skip to content
Finalist

Addy

Generate podcast-style ad reads from any YouTube video; Addy ingests a transcript, clones the voice, lets claude choose natural ad breaks, writes the ad copy, and voices it with Cartesia TTS.

Core trick

Feeds a YouTube transcript to an LLM that picks ad break points, then voices each ad with a cloned voice via Cartesia TTS.

Tags

Description

Generate podcast-style ad reads from any YouTube video; Addy ingests a transcript, clones the voice, lets claude choose natural ad breaks, writes the ad copy, and voices it with Cartesia TTS.
kiankyars/addy★ 10 forksPythonCreated Feb 8, 2026 · last push Aug 5, 2026

README excerpt

# Addy

Generate podcast-style ad reads from any YouTube video; Addy ingests a transcript, clones the voice, lets claude choose natural ad breaks, writes the ad copy, and voices it with Cartesia TTS.

## Features
- Transcript to ads in one command: run `addy` and get finished MP3s in your output folder.
- Dual LLM support: Claude (agentic placement with Exa research) or Gemini for placement/copy.
- Voice cloning ready: uses a Cartesia voice ID; optional emotion + speed controls per ad.
- Multi-sponsor aware: loads sponsors from config, places each at most once, skips if no good fit.
- XML-safe prompting/parsing with fallbacks to handle messy model output.

## Requirements
- Python deps: `uv sync` installs everything.
- System: `ffmpeg` (brew install ffmpeg).
- Env: create `.env` (see `sample.env` if present) with `ANTHROPIC_API_KEY`, `CARTESIA_API_KEY`, `GOOGLE_API_KEY`, optional `EXA_API_KEY`.
- Gemini model: shell `GEMINI_MODEL`, then `GEMINI_MODEL` in `~/.env`, then the legacy `gemini-3.5-flash` default.

## Quickstart
```bash
uv sync
source .venv/bin/activate
addy
```

## Configuration (`dwarkesh.json` example)
```json
{
  "video": "https://www.youtube.com/watch?v=BYXbuik3dgA",
  "output": "output",
  "model": "gemini",        // "claude" or "gemini"
  "voice": "<cartesia-voice-id>",
  "sponsors": [
    {"id": "acme", "title": "Acme", "content": "Short ad blurb", "tags": ["tag1", "tag2"]}
  ]
}
```
- `video`: full YouTube URL or 11-char ID.
- `output`: directory for gener

Team