Metadata-Version: 2.4
Name: eidos-podcast
Version: 0.3.0
Summary: NotebookLM-style two-host podcasts — free, no API key (claude -p + edge/kokoro/dia)
Author: Daniel Shanklin
License-Expression: MIT
Project-URL: Homepage, https://github.com/eidos-agi/eidos-podcast
Project-URL: Repository, https://github.com/eidos-agi/eidos-podcast
Keywords: podcast,tts,text-to-speech,notebooklm,edge-tts,kokoro,dia,mcp
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
Requires-Python: >=3.11
Description-Content-Type: text/markdown
Requires-Dist: edge-tts>=7.2.8
Requires-Dist: fastmcp>=3.4.2
Requires-Dist: kokoro-onnx>=0.5.0

# eidos-podcast

NotebookLM-style two-host podcasts from any text — **free** and **fixed-cost**.

```
content ──► claude -p ──► 2-host dialogue ──► TTS engine ──► audio
           (subscription,    (ALEX + JORDAN)   edge → .mp3
            no API key)                         kokoro → .wav
```

No paid APIs anywhere. The script is written by `claude -p` (your Claude
subscription — fixed cost, no token bill, no key). The voices are Microsoft
Edge neural TTS via `edge-tts` (free, no key). That's the whole pitch vs.
Podcastfy and the other podcast MCPs, which route the script and/or the audio
through paid APIs.

## Install

```sh
uv tool install .          # gives `eidos-podcast` + `eidos-podcast-mcp`
```

Requires `claude` CLI on PATH (Claude Code).

## CLI

```sh
eidos-podcast "any text you want explained"      # text as arg
eidos-podcast --file notes.md -o show.mp3        # from a file
pbpaste | eidos-podcast                           # from stdin
eidos-podcast --file paper.md --turns 20          # longer show
eidos-podcast --file notes.md --engine kokoro    # more expressive, local
```

## Engines

| `--engine` | Voices | Output | Speed | When |
|---|---|---|---|---|
| `edge` (default) | MS Edge neural | `.mp3` | instant | quick, networked, good enough |
| `kokoro` | Kokoro-82M local | `.wav` | fast | offline, more natural prosody |
| `dia` | Dia 1.6B local (MLX) | `.wav` | ~2× real-time | the keeper: two speakers + real laughs/overlap in one pass |

All three are free, no API key. `edge` networks to Microsoft; `kokoro` and `dia`
run fully local.

**kokoro** needs two model files in `~/.cache/eidos-podcast/`
(`kokoro-v1.0.onnx`, `voices-v1.0.bin`) from the
[kokoro-onnx releases](https://github.com/thewh1teagle/kokoro-onnx/releases).

**dia** needs mlx-audio (Apple Silicon only):
`uv tool install mlx-audio --with misaki --prerelease=allow`. It generates both
speakers together — real nonverbals and overlap that edge/kokoro can't do —
auto-chunking long scripts. Voices can drift slightly at chunk seams (upgrade
path: a fixed audio-prompt seed to pin S1/S2).

## MCP

Register the server with Claude Code:

```sh
claude mcp add eidos-podcast eidos-podcast-mcp
```

Then ask Claude to "make a podcast from this." Exposes one tool:
`create_podcast(content, out_path?, turns?) -> mp3 path`.

## Tuning

- **Voices:** edit `HOSTS` in `eidos_podcast.py` (`edge-tts --list-voices` for options).
- **"Compelling":** the entire quality lever is `SCRIPT_PROMPT` in `eidos_podcast.py`
  — cold opens, host disagreement, concrete examples, callbacks.

## Files

| File | What |
|------|------|
| `eidos_podcast.py` | Core: script generation + TTS render |
| `cli.py` | `eidos-podcast` CLI |
| `server.py` | `eidos-podcast-mcp` FastMCP server |
