Read the full writeup →

A free, open-source Python tool

Podcastify

Turns an e-book or article into a two-host podcast. In LLM mode it reads the whole source, writes a conversation in which every factual line cites the sentences it rests on, checks each line against them, and renders an MP3 with chapters.

The opening of a sample episode, with its citations

  1. AlexWelcome. Today we're talking about Alice's Adventures in Wonderland, by Lewis Carroll, the whole book.
  2. SamLet's start at the very beginning. How does Alice end up in Wonderland?
  3. AlexA Rabbit takes a watch out of its waistcoat-pocket and looks at it. Alice has never seen a rabbit with a waistcoat-pocket or a watch... S7
  4. SamAnd then she just jumps in the hole? S8
  5. AlexRight away. Down she goes, never once considering how in the world she was to get out again... S8 S9
  6. SamWhat does she find at the bottom?
  7. AlexA hall of locked doors. Then a little glass table with a tiny golden key... S46-S49

alice.episode.mp3, 4 chapters5:55

From the eval run (eval/run_eval.py, the same pipeline as --mode llm --minutes 6) on the whole of Alice's Adventures in Wonderland (Project Gutenberg, public domain), 2026-10-29. S7 is the seventh sentence of the source; every claim line was checked against the sentences it cites. The write-up has the full episode, a transcript that opens each line onto its source, and the eval.

Two modes

rule
The default, with no model. The narrator reads the source in three-sentence segments and the co-host interjects from a fixed pool. Faithful to the text, and a reading rather than a conversation.
llm
Maps the whole source to cited key points, picks an outline for the target length, writes the host and co-host script with citations, and checks every line; lines that fail are rewritten once or dropped. Runs through the local claude -p CLI on a Claude subscription, or the Anthropic API when ANTHROPIC_API_KEY is set.

What the eval found

On four sources (a novel, an essay, a nonfiction chapter and a Wikipedia article), six-minute LLM episodes covered 7.4 of 12 frozen key points on average, against 4.4 for rule mode reading the same number of words. A blind judge preferred the LLM script on all four. The grounding check failed 9 of 151 claim lines, but a second checker found as many unsupported lines after the repair as before it, so what the check mainly adds is a record a reader can verify line by line.

Run it

pip install -r requirements.txt
python podcastify.py book.epub                  # rule mode, no LLM
python podcastify.py book.epub --mode llm       # grounded conversation
python podcastify.py book.epub --mode llm --minutes 12 -o book.m4b

ffmpeg and ffprobe are required. Voices default to en-US-AndrewNeural and en-US-AvaNeural; --voice-a and --voice-b take any edge-tts voice.

Bring your own text. Podcastify ships no books, and its only audio is the sample episode. Use files you own or public-domain titles, for personal listening. Each line is sent to Microsoft's edge-tts service to be voiced, and in llm mode the source goes to Anthropic, through the Claude CLI or the API.
Get it on GitHub