My audiobook setup
I built Epub Listener, Hark and Kestrel to turn books into audio and listen on my device.
Kestrel's measurements, and the mlx-audio fix I found while building it, are in ML & Research.
I read web novels and light novels. Many run to hundreds of chapters, and I often wait for translations. I wanted to listen while walking.
I wrote a CLI that turns an EPUB into a narrated MP3 with chapter markers. That became Epub Listener. The audio files were large and difficult to move between devices, so I built Hark to hold them, which parses the MP3 in the browser and keeps the audio on the device. The server receives only titles, chapters, my position and my playback history.
Generating audio for a 600-chapter book still took hours. I distilled the vocoder to speed it up. That became Kestrel, with measurements in the table on its project page. Generation is faster now, though the audio still sounds slightly worse than the original model.
I used the word timings from Epub Listener to add read-along in Hark. The player highlights the narrated sentence and marks words when the transcript includes word cues. Tapping a sentence jumps to its start. Saved playback and read-along work in airplane mode after the app shell is cached.
In August, I integrated the generation step into Hark. Kestrel now runs inside Hark, so the browser takes a PDF or an EPUB and narrates it on the device. This path no longer needs the CLI or my laptop. Keep Hark open until narration finishes. Later narration can work offline while the model and runtime assets remain cached.
-
Epub Listener
Python CLI. EPUB in, chaptered MP3 out, via Edge-TTS, local Kokoro, Kestrel on Apple Silicon with a separate engine install, compatible Hugging Face text-to-speech pipeline models, or a local command that writes audio. Resume checks chapter text and narration settings before reusing audio. Embeds a timestamped read-along transcript. A historical Kokoro/Edge-TTS check reports median word-onset error below 30ms on isolated calibration words. Other backends can provide estimated sentence cues. -
Kestrel
My speech-generation engine. Its speed measurements, quality limits and independent audit are on the Kestrel project page. -
Hark (sign-in)
Installable audiobook PWA. Import a chaptered MP3, or narrate a PDF, EPUB, DOCX, text, Markdown or HTML file on-device with Kestrel through WebGPU or WASM. Audio, source files, covers and transcripts stay on-device. Metadata and progress sync between devices. Read-along highlights sentences and marks words when the transcript includes word cues. Saved playback and read-along work offline after the app shell is cached. Narration downloads about 41MB of weights and a 24MB runtime, then can work offline while those assets remain cached. Keep Hark open until narration finishes.