4.2 KiB
4.2 KiB
epub-to-manga
Convert EPUB novels into manga-style EPUBs using a local LLM for scene parsing and Stable Diffusion for image generation.
Disclaimer: This is a proof of concept. Your results may be dog water. ;3
How it works
- Reads your EPUB and splits the text into scenes
- Uses an Ollama LLM to parse each scene — extracting characters, dialogue, mood, and setting
- Generates a manga-style illustration for each page via Stable Diffusion
- Adds speech bubbles with character dialogue
- Packages everything into a new EPUB
Requirements
- Python 3.10+
- Ollama running locally
- One of the following Stable Diffusion backends:
- AUTOMATIC1111 stable-diffusion-webui
- ComfyUI (recommended for Apple Silicon)
- InvokeAI
Installation
pip install -r requirements.txt
Pull an Ollama model:
ollama pull llama3
Usage
python3 main.py book.epub
python3 main.py book.epub output.epub
python3 main.py book.epub --layout tiny --model mistral
python3 main.py book.epub --sd-url http://192.168.1.10:7860 --steps 30 --size 512x768
python3 main.py book.epub --dry-run
If no Stable Diffusion backend is running, the tool will detect any local installations and offer to launch or install one for you.
Options
| Flag | Default | Description |
|---|---|---|
--layout |
normal |
normal = 3 scenes/page, tiny = 1 scene/page |
--model |
llama3 |
Ollama model for scene parsing |
--ollama-url |
http://localhost:11434 |
Ollama API URL |
--sd-url |
http://127.0.0.1:7860 |
Stable Diffusion API URL |
--sd-path |
— | Path to SD install; auto-starts if not running |
--steps |
20 |
Diffusion steps per image (higher = better quality) |
--style |
lineart |
lineart = clean outlines, manga = screentone shading |
--size |
768x1024 |
Output image dimensions |
--workers |
2 |
Parallel image generation workers |
--hint |
— | Character description, e.g. --hint "Rocky:alien who resembles a rock spider" |
--jpeg-quality |
85 |
EPUB image quality (1–95, lower = smaller file) |
--dry-run [N] |
— | Preview first N prompts without generating images |
--verbose / -v |
— | Enable debug logging |
Configuration
Default URLs and model can be changed in config.py:
OLLAMA_URL = "http://localhost:11434/api/generate"
OLLAMA_MODEL = "llama3"
SD_API_URL = "http://127.0.0.1:7860/sdapi/v1/txt2img"
The tool saves its SD backend path to ~/.epub-to-manga so you don't need --sd-path on subsequent runs.
Resuming
Scene parsing and image generation both support resuming. Parsed scenes are cached to manga-<bookname>.cache.json, and generated page images are saved to <output>_pages/. Re-running the same command will pick up where it left off.
Project structure
epub-to-manga/
├── main.py # Entry point
├── config.py # Default URLs and model
├── requirements.txt
├── core/
│ ├── epub_reader.py # EPUB text extraction
│ └── scene_splitter.py # Text → scenes
├── ai/
│ ├── llm_client.py # Ollama API client
│ ├── scene_parser.py # Scene → structured JSON
│ └── character_memory.py # Character tracking across scenes
├── manga/
│ ├── prompt_builder.py # SD prompt construction
│ ├── panel_layout.py # Scene grouping into pages
│ └── speech_bubbles.py # Dialogue overlay rendering
├── image/
│ ├── backend.py # Backend router (A1111 / ComfyUI)
│ ├── a1111_api.py # AUTOMATIC1111 API
│ ├── comfy_api.py # ComfyUI API + workflow builder
│ ├── sd_launcher.py # SD auto-start and install
│ └── device.py # Device detection
├── export/
│ └── epub_builder.py # Output EPUB assembly
└── utils/
└── naming.py # Output filename helpers
