Owen Eldridge

Back to the index

Local audiobook pipeline

Year
2026
Built with
Python, Kokoro TTS, FFmpeg, systemd, Docker

Queue an ebook at night, wake up to an audiobook: a proper .m4b with chapters from the book's table of contents, embedded cover art, and a voice matched to the material, synthesized entirely on my own hardware. None of my reading touches a cloud service.

The problem

Most read-aloud features are a thin wrapper around a big-tech cloud voice, and the ones that aren't tend to sound like a fax machine. I wanted listenable neural narration for my own library without shipping the library to anyone.

The moment it broke

The first version of the converter didn't synthesize anything itself; it drove a free TTS website through a scripted browser session. It worked right up until it didn't: CAPTCHAs, session expiries, and layout changes kept killing overnight runs halfway through a book. The fix was to stop borrowing someone else's infrastructure. I stood up Kokoro, a neural TTS model with an OpenAI-compatible API, on my home server running entirely on CPU, and rewrote the converter's backend against it. No CAPTCHAs, no cloud, and the whole pipeline became boringly reliable.

Around the converter sits the automation that makes it a pipeline rather than a script: a queue directory watched by a systemd timer, a render worker on the server, and an import step that files finished books into Audiobookshelf, where they sync to my devices.

Proof

What it demonstrates

Practical ML serving on modest hardware, audio and metadata wrangling with FFmpeg, and unglamorous-but-honest systems glue: queues, timers, idempotent imports. Built around a conviction that convenience should not cost you your privacy.