This commit is contained in:
Deniz Şafak
2026-02-06 23:54:22 +03:00
parent 7b1f4f54ee
commit de4c418dff
2 changed files with 62 additions and 53 deletions
+1 -2
View File
@@ -1,6 +1,5 @@
# Unreleased
# 1.3.0 # 1.3.0
- Special thanks to [@jeremiahsb](https://github.com/jeremiahsb) for his [massive contribution](https://github.com/denizsafak/abogen/pull/120) (>55k lines!) that brought the Web UI, EPUB 3 pipeline, and core architectural improvements to life.
- Added an EPUB 3 packaging pipeline that builds media-overlay EPUBs from generated audio and chunk metadata. - Added an EPUB 3 packaging pipeline that builds media-overlay EPUBs from generated audio and chunk metadata.
- Persisted chunk timing metadata in job artifacts and exercised the exporter with automated tests. - Persisted chunk timing metadata in job artifacts and exercised the exporter with automated tests.
- Added Flask-based Web UI (`abogen-web`) for Docker and headless server deployments. - Added Flask-based Web UI (`abogen-web`) for Docker and headless server deployments.
+61 -51
View File
@@ -5,50 +5,63 @@ build-backend = "hatchling.build"
[project] [project]
name = "abogen" name = "abogen"
description = "Generate audiobooks from EPUBs, PDFs and text with synchronized captions." description = "Generate audiobooks from EPUBs, PDFs and text with synchronized captions."
authors = [ authors = [{ name = "Deniz Şafak", email = "denizsafak98@gmail.com" }]
{ name="Deniz Şafak", email="denizsafak98@gmail.com" }
]
readme = "README.md" readme = "README.md"
license = "MIT" license = "MIT"
requires-python = ">=3.10, <3.13" requires-python = ">=3.10, <3.13"
keywords = ["audiobook", "epub", "pdf", "text-to-speech", "subtitle", "tts", "kokoro", "accessibility", "book-converter", "voice-synthesis", "multilingual", "chapter-management", "subtitles", "content-creation", "media-generation"] keywords = [
"audiobook",
"epub",
"pdf",
"text-to-speech",
"subtitle",
"tts",
"kokoro",
"accessibility",
"book-converter",
"voice-synthesis",
"multilingual",
"chapter-management",
"subtitles",
"content-creation",
"media-generation",
]
dependencies = [ dependencies = [
"pip", "pip",
"kokoro>=0.9.4", "kokoro>=0.9.4",
"misaki[zh]>=0.9.4", "misaki[zh]>=0.9.4",
"supertonic>=0.1.0", "supertonic>=0.1.0",
"ebooklib>=0.19", "ebooklib>=0.19",
"beautifulsoup4>=4.13.4", "beautifulsoup4>=4.13.4",
"spacy>=3.8.7,<4.0", "spacy>=3.8.7,<4.0",
"en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl", "PyMuPDF>=1.25.5",
"PyMuPDF>=1.25.5", "platformdirs>=4.3.7",
"platformdirs>=4.3.7", "soundfile>=0.13.1",
"soundfile>=0.13.1", "mutagen>=1.47.0",
"mutagen>=1.47.0", "pygame>=2.6.1",
"pygame>=2.6.1", "charset_normalizer>=3.4.1",
"charset_normalizer>=3.4.1", "chardet>=5.2.0",
"chardet>=5.2.0", "python-dotenv>=1.0.1",
"python-dotenv>=1.0.1", "static_ffmpeg>=2.13",
"static_ffmpeg>=2.13", "Markdown>=3.9",
"Markdown>=3.9", "Flask>=3.0.3",
"Flask>=3.0.3", "numpy>=1.24.0",
"numpy>=1.24.0", "gpustat>=1.1.1",
"gpustat>=1.1.1", "num2words>=0.5.13",
"num2words>=0.5.13", "httpx>=0.27.0",
"httpx>=0.27.0", "PyQt6>=6.5.0",
"PyQt6>=6.5.0"
] ]
classifiers = [ classifiers = [
"Intended Audience :: End Users/Desktop", "Intended Audience :: End Users/Desktop",
"Topic :: Multimedia :: Sound/Audio :: Conversion", "Topic :: Multimedia :: Sound/Audio :: Conversion",
"Topic :: Multimedia :: Sound/Audio :: Sound Synthesis", "Topic :: Multimedia :: Sound/Audio :: Sound Synthesis",
"Topic :: Multimedia :: Sound/Audio :: Speech", "Topic :: Multimedia :: Sound/Audio :: Speech",
"Topic :: Text Processing", "Topic :: Text Processing",
"Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.12",
"Operating System :: OS Independent" "Operating System :: OS Independent",
] ]
dynamic = ["version"] dynamic = ["version"]
@@ -73,21 +86,18 @@ abogen-pyqt = "abogen.pyqt.main:main"
[tool.hatch.build.targets.sdist] [tool.hatch.build.targets.sdist]
exclude = [ exclude = [
"/.github", "/.github",
"/demo", "/demo",
"/abogen/resources", "/abogen/resources",
"/abogen/assets/create_shortcuts.bat", "/abogen/assets/create_shortcuts.bat",
"WINDOWS_INSTALL.bat", "WINDOWS_INSTALL.bat",
] ]
[tool.hatch.build.targets.wheel] [tool.hatch.build.targets.wheel]
packages = ["abogen"] packages = ["abogen"]
[tool.hatch.build] [tool.hatch.build]
include = [ include = ["abogen/webui/templates/**", "abogen/webui/static/**"]
"abogen/webui/templates/**",
"abogen/webui/static/**",
]
[tool.hatch.version] [tool.hatch.version]
path = "abogen/VERSION" path = "abogen/VERSION"
@@ -95,8 +105,8 @@ pattern = "^(?P<version>.+)$"
[tool.pytest.ini_options] [tool.pytest.ini_options]
filterwarnings = [ filterwarnings = [
"ignore:builtin type .* has no __module__ attribute:DeprecationWarning", "ignore:builtin type .* has no __module__ attribute:DeprecationWarning",
"ignore:Importing 'parser.split_arg_string' is deprecated:DeprecationWarning" "ignore:Importing 'parser.split_arg_string' is deprecated:DeprecationWarning",
] ]
# --- OPTIONAL DEPENDENCIES --- # --- OPTIONAL DEPENDENCIES ---
@@ -118,7 +128,7 @@ dev = ["build", "pytest"]
[tool.uv.sources] [tool.uv.sources]
kokoro = [ kokoro = [
{ git = "https://github.com/hexgrad/kokoro.git", marker = "sys_platform == 'darwin'" }, { git = "https://github.com/hexgrad/kokoro.git", marker = "sys_platform == 'darwin'" },
{ index = "pypi", marker = "sys_platform != 'darwin'" } { index = "pypi", marker = "sys_platform != 'darwin'" },
] ]
# --- TORCH CONFIGURATION --- # --- TORCH CONFIGURATION ---
@@ -134,13 +144,13 @@ torch = [
{ index = "pytorch-cuda-126", marker = "extra == 'cuda126' and extra != 'rocm' and extra != 'cuda130'" }, { index = "pytorch-cuda-126", marker = "extra == 'cuda126' and extra != 'rocm' and extra != 'cuda130'" },
# CUDA 12.8 (NVIDIA) # CUDA 12.8 (NVIDIA)
{ index = "pytorch-cuda-128", marker = "extra == 'cuda' and extra != 'rocm' and extra != 'cuda130' and extra != 'cuda126'" } { index = "pytorch-cuda-128", marker = "extra == 'cuda' and extra != 'rocm' and extra != 'cuda130' and extra != 'cuda126'" },
] ]
# --- TRITON CONFIGURATION --- # --- TRITON CONFIGURATION ---
pytorch-triton-rocm = [ pytorch-triton-rocm = [
{ index = "pytorch-rocm-64-nightly", marker = "extra == 'rocm'" } { index = "pytorch-rocm-64-nightly", marker = "extra == 'rocm'" },
] ]
# --- INDEX DEFINITIONS --- # --- INDEX DEFINITIONS ---