๐ ebook2audiobook (E2A)
CPU/GPU Converter from E-Book to audiobook with chapters and metadata
using advanced TTS engines and much more.
Supports voice cloning and 1158 languages!
[!IMPORTANT]
This tool is intended for use with non-DRM, legally acquired eBooks only.
The authors are not responsible for any misuse of this software or any resulting legal consequences.
Use this tool responsibly and in accordance with all applicable laws.
Thanks to support ebook2audiobook developers!
Run locally
Run Remotely
GUI Interface
Click to see images of Web GUI
Demos
New Default Voice Demo
https://github.com/user-attachments/assets/750035dc-e355-46f1-9286-05c1d9e88cea
More Demos
ASMR Voice
https://github.com/user-attachments/assets/68eee9a1-6f71-4903-aacd-47397e47e422
Rainy Day Voice
https://github.com/user-attachments/assets/d25034d9-c77f-43a9-8f14-0d167172b080
Scarlett Voice
https://github.com/user-attachments/assets/b12009ee-ec0d-45ce-a1ef-b3a52b9f8693
David Attenborough Voice
https://github.com/user-attachments/assets/81c4baad-117e-4db5-ac86-efc2b7fea921
Example
Table of Contents
Features
- ๐ง TTS Engines supported:
XTTSv2,Bark,Fairseq,VITS,Tacotron2,Tortoise,GlowTTS,YourTTS - ๐ Convert multiple file formats:
.epub,.mobi,.azw3,.fb2,.lrf,.rb,.snb,.tcr,.pdf,.txt,.rtf,.doc,.docx,.html,.odt,.azw,.tiff,.tif,.png,.jpg,.jpeg,.bmp,.zip - ๐ป TextArea to convert directly a short text in audio
- ๐ OCR scanning for files with text pages as images
- ๐ High-quality text-to-speech from near realtime to near real voice
- ๐ฃ๏ธ Optional voice cloning using your own voice file
- ๐ Supports 1158 languages (supported languages list)
- ๐ป Low-resource friendly โ runs on 2 GB RAM / 1 GB VRAM (minimum)
- ๐ต Audiobook output formats: mono or stereo
aac,flac,mp3,m4b,m4a,mp4,mov,ogg,wav,webm - ๐ง SML tags supported โ fine-grained control of breaks, pauses, voice switching and more (see below)
- ๐งฉ Optional custom model using your own trained model (XTTSv2, VITS, FAIRSEQ, PIPER, others on request)
- ๐๏ธ Fine-tuned preset models trained by the E2A Team
(Contact us if you need additional fine-tuned models, or if youโd like to share yours to the official preset list)
Hardware Requirements
- 2GB RAM min, 8GB recommended.
- 1GB VRAM min, 4GB recommended.
- Virtualization enabled if running on windows (Docker only).
- CPU, XPU (intel, AMD, ARM)*.
- CUDA, ROCm, JETSON
- MPS (Apple Silicon CPU)
** Modern TTS engines are very slow on CPU, so use lower quality TTS like YourTTS, Tacotron2 etc..*
Supported Languages
| Arabic (ar) | Chinese (zh) | English (en) | Spanish (es) |
|---|---|---|---|
| French (fr) | German (de) | Italian (it) | Portuguese (pt) |
| Polish (pl) | Turkish (tr) | Russian (ru) | Dutch (nl) |
| Czech (cs) | Japanese (ja) | Hindi (hi) | Bengali (bn) |
| Hungarian (hu) | Korean (ko) | Vietnamese (vi) | Swedish (sv) |
| Persian (fa) | Yoruba (yo) | Swahili (sw) | Indonesian (id) |
| Slovak (sk) | Croatian (hr) | Tamil (ta) | Danish (da) |
Supported eBook Formats
.epub,.pdf,.mobi,.txt,.html,.rtf,.chm,.lit,.pdb,.fb2,.odt,.cbr,.cbz,.prc,.lrf,.pml,.snb,.cbc,.rb,.tcr- Best results:
.epubor.mobifor automatic chapter detection
Output and process Formats
.m4b,.m4a,.mp4,.webm,.mov,.mp3,.flac,.wav,.ogg,.aac- Process format can be changed in lib/conf.py
SML tags available
[break]โ silence (random range 0.3โ0.6 sec.)[pause]โ silence (random range 1.0โ1.6 sec.)[pause:N]โ fixed pause (N sec.)[voice:/path/to/voice/file]...[/voice]โ switch voice from default or selected voice from GUI/CLI
Check our other repo dedicated to add SML automatically in your ebook -> E2A-SML
[!IMPORTANT]
Before to post an install or bug issue search carefully to the opened and closed issues TAB
to be sure your issue does not exist already.
[!NOTE]
EPUB format lacks any standard structure like what is a chapter, paragraph, preface etc.
So you should first remove manually any text you don't want to be converted in audio.
Instructions
Clone repo
bashgit clone https://github.com/DrewThomasson/ebook2audiobook.git cd ebook2audiobookInstall / Run ebook2audiobook:
Linux/MacOS
bash./ebook2audiobook.commandNote for MacOS users: homebrew is installed to install missing programs.
Mac Launcher
Double clickMac Ebook2Audiobook Launcher.commandWindows
bashebook2audiobook.cmdor
Double clickebook2audiobook.cmdNote for Windows users: scoop is installed to install missing programs without administrator privileges.
Open the Web App: Click the URL provided in the terminal to access the web app and convert eBooks.
http://localhost:7860/For Public Link:
./ebook2audiobook.command --share(Linux/MacOS)ebook2audiobook.cmd --share(Windows)python app.py --share(all OS)
[!IMPORTANT]
If the script is stopped and run again, you need to refresh your gradio GUI interface
to let the web page reconnect to the new connection socket.
Basic Usage
Linux/MacOS:
bash./ebook2audiobook.command --headless --ebook --voice --language <language_code>Windows
bashebook2audiobook.cmd --headless --ebook --voice --language <language_code>[--ebook]: Path to your eBook file
[--voice]: Voice cloning file path (optional)
[--language]: Language code in ISO-639-3 (i.e.: ita for italian, eng for english, deu for german...).
Default language is eng and --language is optional for default language set in ./lib/lang.py.
The ISO-639-1 2 letters codes are also supported.
Example of Custom Model Zip Upload
(must be a .zip file containing the mandatory model files. Example for XTTSv2: config.json, model.pth, vocab.json and ref.wav)
Linux/MacOS
bash./ebook2audiobook.command --headless --ebook <ebook_file_path> --language <language> --custom_model <custom_model_path>Windows
bashebook2audiobook.cmd --headless --ebook <ebook_file_path> --language <language> --custom_model <custom_model_path>Note: the ref.wav of your custom model is always the voice selected for the conversion
: Path to model_name.zipfile,
which must contain (according to the tts engine) all the mandatory files
(see ./lib/models.py).
For Detailed Guide with list of all Parameters to use
- Linux/MacOSbash
./ebook2audiobook.command --help - Windowsbash
ebook2audiobook.cmd --help - Or for all OS
python app.py --help
/* Detailed source-code truncated for AI context efficiency. */NOTE: in gradio/gui mode, to cancel a running conversion, just click on the [X] from the ebook upload component.
TIP: if it needs some more pause, add '[pause:3]' for 3 sec. etc.
Docker
- Clone the Repository:
git clone https://github.com/DrewThomasson/ebook2audiobook.git
cd ebook2audiobook- Build the container
Windows:
Docker:
ebook2audiobook.cmd --script_mode build_docker
Docker Compose:
ebook2audiobook.cmd --script_mode build_docker --docker_mode compose
Podman Compose:
ebook2audiobook.cmd --script_mode build_docker --docker_mode podman
Linux/Mac
Docker:
./ebook2audiobook.command --script_mode build_docker
Docker Compose
./ebook2audiobook.command --script_mode build_docker --docker_mode compose
Podman Compose:
./ebook2audiobook.command --script_mode build_docker --docker_mode podman- Run the Container:
/* Detailed source-code truncated for AI context efficiency. */- NOTE: MPS is not exposed in docker so CPU must be used
Cloned Voices
You can upload any voice audio in any of the supported audio formats, the ideal duration is around 1 to 5 mn.
It doesn't matter if the recording has a noisy background or music playing over it โ E2A will clean up the voice for you.
The built-in cloned voices list is mainly in English. If you need voices in other languages to be officially
added to the list, please contact us and we'll add them after review.
Fine Tuned TTS models
Fine Tune your own XTTSv2 model
De-noise training data
Fine Tuned TTS Collection
For an XTTSv2 custom model a ref audio clip of the voice reference is mandatory:
Your own Ebook2Audiobook customization
You are free to modify libs/conf.py to add or remove the settings you wish. If you plan to do it just make
a copy of the original conf.py so on each ebook2audiobook update you will backup your modified conf.py and put
back the original one. You must plan the same process for models.py. If you wish to make your own custom model
as an official ebook2audiobook fine tuned model so please contact us and we'll add it to the presets list.
Reverting to older Versions
Releases can be found -> here
git checkout tags/VERSION_NUM # Locally/Compose -> Example: git checkout tags/v25.7.7Common Issues:
- My NVIDIA/ROCm/XPU/MPS GPU isn't being detected?? -> GPU ISSUES Wiki Page
- CPU is slow (better on server smp CPU) while GPU can have almost real time conversion.
Discussion about this
(It doesn't have zero-shot voice cloning though, and is Siri quality voices, but it is much faster on cpu). - "I'm having dependency issues" - Just use the docker, its fully self contained and has a headless mode,
add--helpparameter at the end of the docker run command for more information. - "I'm getting a truncated audio issue!" - PLEASE MAKE AN ISSUE OF THIS,
we don't speak every language and need advise from users to fine tune the sentence splitting logic.๐
***** ROADMAP *****
- All Features open to public Contributions โญ
- Any help from people speaking any of the supported languages to help us improve the models โญ
- Preview Blocks/Chapters before to start the conversion
- Edit by sentence converted for surgical text change
- SML tags integration for voice, pause, break, and more changes
- -h -help parameter info in different languages
- OCR scanning for PDF / JPG / BMP / PNG / TIFF
- Notebooks Folder Talked about here
- Make Chinese text splitting not split words and improve pause timing Talked about here
- Dockerfile
- Docker compose
- Podman compose
- Kaggle Notebook
- Google Colab Notebook
- Audiobookshelf integration
- Ebook Translation option
- Output format choices
- Multiprocessing conversion
- Batch ebook folder conversion
- GPU Device detection
- Denoise any background reference audio for upload voice cloning,
- Custom fine tuned model upload
- Make a IOS app
- Make an android app
User Requests
- Add European Portuguese language model for xttsv2, fairseq, vits, piper at least (help welcome)
- Add Sindhi language model for xttsv2, fairseq, vits, piper at least (help welcome)
TTS engines
- XTTSv2
- Bark
- Fairseq
- VITS
- Tacotron2
- YourTTS
- Tortoise
- GlowTTS
- Piper
- GPT-SoVITS (https://github.com/RVC-Boss/GPT-SoVITS)
- OpenVoice (https://github.com/myshell-ai/OpenVoice)
- fish-speech (https://github.com/fishaudio/fish-speech)
- ChatTTS (https://github.com/2noise/ChatTTS)
- CosyVoice (https://github.com/FunAudioLLM/CosyVoice)
- F5-TTS (https://github.com/swivid/f5-tts)
- chatterbox (https://github.com/resemble-ai/chatterbox)
- Supertonic (https://github.com/supertone-inc/supertonic)
- Spark-TTS (https://github.com/sparkaudio/spark-tts)
- index-tts (https://github.com/index-tts/index-tts)
- MeloTTS (https://github.com/myshell-ai/MeloTTS)
- Kokoro-TTS (https://github.com/hexgrad/kokoro)
- OmniVoice (https://github.com/k2-fsa/OmniVoice)
- Zonos (https://github.com/Zyphra/Zonos)
- Style-TTS2 (https://github.com/yl4579/StyleTTS2)
- Orpheus-TTS (https://github.com/canopyai/Orpheus-TTS)
- NewTTS (https://github.com/neuphonic/neutts?tab=readme-ov-file)
- VIbeVoice (https://github.com/vibevoice-community/VibeVoice)
- Qwen3-TTS (https://huggingface.co/spaces/Qwen/Qwen3-TTS)
Readme Translation
- Arabic (ara)
- Chinese (zho)
- English (eng)
- Spanish (spa)
- French (fra)
- German (deu)
- Italian (ita)
- Portuguese (por)
- Polish (pol)
- Turkish (tur)
- Russian (rus)
- Dutch (nld)
- Czech (ces)
- Japanese (jpn)
- Hindi (hin)
- Bengali (ben)
- Hungarian (hun)
- Korean (kor)
- Vietnamese (vie)
- Swedish (swe)
- Persian (fas)
- Yoruba (yor)
- Swahili (swa)
- Indonesian (ind)
- Slovak (slk)
- Croatian (hrv)
๐ OS Compatibility
- ๐ Mac Intel x86
- ๐ช Windows x86
- ๐ง Linux x86
- ๐ฅ๏ธ๐ Apple Silicon Mac
- ๐ช๐ช ARM Windows
- ๐ง๐ช ARM Linux
Extra Overkill for training models and such (All supported Coqui-tts models and piper-tts in one easy command)
- For info about this @DrewThomasson, he is currently working on the development of this, work-in-progress-repo here
- Make a easy to use training gui for all coqui-tts models in the ljspeech format training recipes here from coqui tts
Python Code normalization information for contributors
- no blank line between code, unless between functions and classes.
- single quote used for all key unless for dict() and json. dict['key'] always called with single quote
- 4 spaces indentation, not tab at all
- strict typing for all functions and its arguments declaration and return values
- no space between the argument and its typing, no space between the function, the "->" and the return value
Example:
import json
from typing import Optional
def get_user(user_id:int, users:list[dict])->Optional[dict]:
for user in users:
if user['id'] == user_id:
return user
return None
def summarize(user:dict)->str:
return f"User {user['name']} is {'active' if user['is_active'] else 'inactive'}."
def to_json(user:dict)->str:
return json.dumps({"id": user['id'], "name": user['name'], "email": user['email']})
users:list = [
dict(id=1, name="alice", email="[email protected]", role="admin", is_active=True),
dict(id=2, name="bob", email="[email protected]", role="editor", is_active=False),
dict(id=3, name="carol", email="[email protected]", role="viewer", is_active=True),
]
config = {
"max_users": 100,
"default_role": "viewer",
"allow_signup": True,
}
roles = ['admin', 'editor', 'viewer']
found = get_user(1, users)
if found:
print(summarize(found))
print(found['email'])
print(to_json(found))
if config['default_role'] in roles:
print(config['default_role'])Hardware donation for beta tests wanted
We accept any kind of hardware to test our development like:
- Nvidia supporting cuda >= 11.8
- XPU intel cards
- ROCm AMD cards supporting ROCm >=5.7
@DrewThomasson if you want to help out at all! ๐
Special Thanks
To all financial and code contributors, each contribution and suggestion helps to improve the quality of E2A.