🎧

Speak EPUB

Turn any EPUB into a high-quality audiobook using Microsoft Edge's free neural voices — no API key, no subscription, no cost.

⚡ Free & Open Source ✓ No API Key Required 🐍 Python 3.10+ 🪟 🍎 🐧 Cross-platform
View on GitHub →

Everything you need, nothing you don't

🗣️

Neural TTS Voices

Powered by the same engine behind Windows Narrator and Edge's Read Aloud — high-quality, natural-sounding speech.

📖

Chapter-Aware

Reads your EPUB's spine in the correct reading order and saves one MP3 per chapter, neatly numbered and named.

🎵

M4B / M4A Output

Optionally bundle all chapters into a single audiobook file with chapter markers — works in Overcast, Apple Books, and more.

⏭️

Resumable

Already-converted chapters are skipped on re-runs. Interrupted halfway? Just run again and pick up where you left off.

🌍

300+ Voices

British, American, Australian, and dozens of other languages and accents. Browse them with --list-voices.

💸

Completely Free

No cloud account, no API key, no usage limits. Edge TTS is called directly from the command line — same as your browser.

How it works

1

Parse the EPUB

EPUBs are ZIP files containing HTML. The script extracts each chapter from the book's spine in reading order, strips navigation and style noise, and pulls clean plain text.

2

Send to Edge TTS

Each chapter's text is sent to Microsoft Edge's neural TTS service — the same engine that powers Edge's built-in Read Aloud. Free, no key required.

3

Save as MP3

Each chapter is saved as a numbered MP3 (001_Introduction.mp3, etc.) in a folder named after your book.

4

Combine into M4B (optional)

With --m4b or --m4a, FFmpeg merges all chapters and embeds chapter markers so you can skip between them in any audiobook app.

Installation

PowerShell
# 1. Clone the repo
git clone https://github.com/michaelsanford/Speak-EPUB.git
cd speak-epub

# 2. Create a virtual environment & install deps
python -m venv venv
.\venv\Scripts\Activate.ps1
pip install -r requirements.txt

# 3. Optional: FFmpeg for M4B/M4A output
winget install ffmpeg

If you see a script execution policy error, run Set-ExecutionPolicy -Scope CurrentUser RemoteSigned first.

Terminal
# 1. Clone the repo
git clone https://github.com/michaelsanford/Speak-EPUB.git
cd speak-epub

# 2. Create a virtual environment & install deps
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# 3. Optional: FFmpeg for M4B/M4A output
brew install ffmpeg
Terminal
# 1. Clone the repo
git clone https://github.com/michaelsanford/Speak-EPUB.git
cd speak-epub

# 2. Create a virtual environment & install deps
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# 3. Optional: FFmpeg for M4B/M4A output
sudo apt install ffmpeg    # Debian/Ubuntu
sudo dnf install ffmpeg    # Fedora
sudo pacman -S ffmpeg      # Arch

Common commands

Shell
# Basic — outputs numbered MP3s into a folder
python speak.py "path/to/book.epub"

# Single M4B audiobook file with chapter markers
python speak.py "path/to/book.epub" --m4b

# M4A (better Android compatibility)
python speak.py "path/to/book.epub" --m4a

# Choose a different voice
python speak.py "path/to/book.epub" --voice en-US-AriaNeural

# Custom output folder
python speak.py "path/to/book.epub" --output my_audiobook

# Browse available English voices
python speak.py --list-voices

# Browse voices for all languages
python speak.py --list-voices --all-languages

What you end up with

Files are saved in a folder named after your book. Re-run at any time — already-converted chapters are skipped automatically.

my_book_audiobook/
├── 001_Introduction.mp3
├── 002_Chapter_One.mp3
├── 003_Chapter_Two.mp3
├── 004_Chapter_Three.mp3
├── ...
└── my_book.m4b  ← only with --m4b or --m4a

Recommended voices

The default is en-GB-RyanNeural (British male). Run --list-voices to see the full list of English voices, or add --all-languages for all 300+.

Voice Gender Accent
en-GB-RyanNeural default Male British
en-GB-SoniaNeural Female British
en-US-AriaNeural Female American
en-US-GuyNeural Male American
en-AU-WilliamMultilingualNeural Male Australian