- AI 应用
- 语音
- 音频
- 本地部署
【免费下载链接】ebook2audiobook
Generate audiobooks from e-books, voice cloning & 1158+ languages!
本文以匈牙利语版官方文档(readme/README_hun.md)为骨架,结合当前仓库源码(app.py、lib/conf.py、lib/conf_models.py、lib/conf_lang.py 等)逐项印证,系统讲解 ebook2audiobook(E2A)的功能全貌、硬件要求、Gradio GUI 与 headless 命令行两种使用方式、Docker/Compose 部署、SML 标签、语音克隆与自定义模型等核心技术细节。读完本文,你将能独立完成电子书到有声书的本地转换、批量转换、语音克隆与自定义模型接入、远程 Docker 部署及常见问题排障。
项目定位与核心特性
ebook2audiobook(简称 E2A)是一个运行在本机的 CPU/GPU 电子书转有声书工具,输出成品自带章节切分与元数据,底层驱动为多种先进的 TTS(文本转语音)引擎,并支持语音克隆与1158 种语言。它同时提供本地安装(Linux/macOS/Windows)、Docker 容器、Docker Compose 与 Podman Compose 部署,以及远程运行(Hugging Face Spaces、Google Colab、Kaggle 笔记本)。
官方文档明确给出核心功能清单:
- 8 种 TTS 引擎:
XTTSv2、Bark、Fairseq、VITS、Tacotron2、Tortoise、GlowTTS、YourTTS;源码 lib/conf_models.py 中的TTS_ENGINES字典还登记了PIPER,即引擎总数为 9 种。 - 多格式电子书输入:
.epub、.mobi、.azw3、.fb2、.lrf、.rb、.snb、.tcr、.pdf、.txt、.rtf、.doc、.docx、.html、.odt、.azw、.tiff、.tif、.png、.jpg、.jpeg、.bmp、.zip;源码 lib/conf.py 的ebook_formats还额外支持.pptx。 - 文本输入框:无需电子书文件,直接把短文本粘贴为音频。
- OCR 识别:针对以图片形式呈现文字页面的文件(如扫描版 PDF、JPG、BMP、PNG、TIFF)。
- 可选语音克隆:上传自己的音频文件进行克隆配音。
- 资源友好:最低 2 GB RAM / 1 GB VRAM 即可运行。
- 输出格式:单声道或立体声的
aac、flac、mp3、m4b、m4a、mp4、mov、ogg、wav、webm。 - SML 标签:通过
[break]、[pause]、[pause:N]、[voice:...]精细控制停顿与换声。 - 自定义模型:可接入自训练的 XTTSv2、VITS、FAIRSEQ、PIPER 模型。
- 内置微调预置模型:由 E2A 团队训练并随项目分发。
使用前提(官方文档强调):本工具仅限用于无 DRM、合法获取的电子书。作者不对任何滥用行为及其法律后果负责,请遵守所在地区的相关法律。
硬件要求与加速后端
官方文档列出的最低配置为2 GB RAM(推荐 8 GB)、1 GB VRAM(推荐 4 GB),并明确说明:
- 支持CPU、XPU(Intel/AMD/ARM);
- 支持CUDA、ROCm、JETSON;
- 支持MPS(Apple Silicon);
- 若使用 Docker 方式在 Windows 运行,需启用虚拟化。
注意:现代 TTS 引擎在 CPU 上非常慢,官方建议 CPU 用户改用 YourTTS、Tacotron2 等低质量但更快的引擎。
源码 lib/conf.py 的devices字典定义了六种设备后端:CPU、CUDA、MPS、ROCM、XPU、JETSON,默认设备为 CPU;而torch_matrix(lib/conf.py)则映射了从cpu、cu118/cu121/cu124/cu126/cu128/cu129/cu130/cu132、rocm5.7~rocm7.2、mps、xpu到jetson51/jetson60/jetson61的完整 PyTorch 版本矩阵——这意味着 E2A 在安装阶段会按检测到的 GPU 自动选择对应 wheel。
支持的电子书格式与输出格式
官方文档列出的电子书格式包括.epub、.pdf、.mobi、.txt、.html、.rtf、.chm、.lit、.pdb、.fb2、.odt、.cbr、.cbz、.prc、.lrf、.pml、.snb、.cbc、.rb、.tcr,并建议:若希望自动章节识别,优先使用.epub或.mobi。
输出格式支持.m4b、.m4a、.mp4、.webm、.mov、.mp3、.flac、.wav、.ogg、.aac。文档特别提示:处理格式可在 lib/conf.py 中修改。源码中 lib/conf.py 定义了output_formats列表、default_output_format = 'm4b'(默认输出 m4b,便于携带章节元数据)、default_output_channel = 'mono'(默认单声道)以及中间处理格式default_audio_proc_format = 'flac'、采样率default_audio_proc_samplerate = 24000。另有两个实用开关:default_output_split(默认关闭)与default_output_split_hours = '6'——当最终输出超过 6 小时的 2 倍时,成品会自动按 6 小时切分并保留余量。
[!NOTE] EPUB 没有统一的“章节、段落、前言”标准结构,官方建议在转换前手动移除不希望在音频中出现的文本。
支持的语言
官方文档列出了与预置模型直接对应的 28 种语言(含匈牙利语 hu、中文 zh、英语 en、西班牙语 es、法语 fr、德语 de、意大利语 it、葡萄牙语 pt、波兰语 pl、土耳其语 tr、俄语 ru、荷兰语 nl、捷克语 cs、日语 ja、印地语 hi、孟加拉语 bn、韩语 ko、越南语 vi、瑞典语 sv、波斯语 fa、约鲁巴语 yo、斯瓦希里语 sw、印尼语 id、斯洛伐克语 sk、克罗地亚语 hr、泰米尔语 ta、丹麦语 da 等),并链接到+1130 种语言与方言的完整列表,合计宣称1158 种语言。
在源码层面,语言支持是分层的:每种 TTS 引擎在 lib/conf_models.py 中各自维护一份languages映射(例如 XTTSv2 支持 ara/ces/deu/eng/fra/hin/hun/ita/jpn/kor/nld/pol/por/rus/spa/tur/zho,Bark 支持 13 种),而全局语言映射与默认语言则在 lib/conf_lang.py 中定义,默认语言代码为eng(ISO-639-3)。因此“1158 种语言”对应的是 MMS 系列模型的全量能力,实际可用的语言范围取决于所选 TTS 引擎——文档与--help输出均提示“所选 TTS 引擎应与目标语言兼容”。
SML 标签:精细控制停顿与换声
SML(Speech Markup Language)是 E2A 在文本中内嵌的配音控制标记,官方文档给出四类标签:
| 标签 | 含义 |
|---|---|
[break] | 停顿(随机 0.3–0.6 秒) |
[pause] | 停顿(随机 1.0–1.6 秒) |
[pause:N] | 固定停顿(N 秒),如[pause:3]表示 3 秒 |
[voice:/path/to/voice/file]...[/voice] | 从默认/选定声音切换到指定声音文件 |
实战提示(文档原文):需要稍长停顿时可使用[pause:3]。在 GUI 模式中,可通过上传组件的[X]按钮随时中断进行中的转换。
源码佐证:lib/conf_models.py 定义了TTS_SML结构与SML_TAG_PATTERN正则(支持成对标签与tag:value语法),并在 lib/core.py 的转换管线中按该正则解析与剥离标签,从而实现文档描述的停顿与换声行为。
安装与启动(本地运行)
第一步:克隆仓库并安装
git clone https://github.com/DrewThomasson/ebook2audiobook.git cd ebook2audiobook注意:仅在需要说明 git clone 时使用上述仓库地址;安装完成后日常使用请直接运行启动脚本。
第二步:安装 / 运行
- Linux / macOS:
./ebook2audiobook.command(macOS 用户会通过 homebrew 自动补装缺失程序;也可直接双击Mac Ebook2Audiobook Launcher.command) - Windows:
ebook2audiobook.cmd,或直接双击ebook2audiobook.cmd(Windows 用户通过 scoop 在无需管理员权限的情况下安装缺失程序)
首次运行会创建独立 Python 虚拟环境(app.py 会校验虚拟环境是否为uv创建,且 Python 版本须在 3.10–3.12 之间),自动按检测到的 GPU 安装对应 PyTorch 与依赖,并下载预置语音包(app.py 中调用check_voices())。
第三步:打开 Web 应用
启动后终端会输出访问地址,浏览器打开http://localhost:7860/即可看到 Gradio 界面并开始转换。源码 lib/conf.py 中interface_host = '0.0.0.0'、interface_port = 7860、interface_concurrency_limit = 1。
生成公网分享链接
- Linux/macOS:
./ebook2audiobook.command --share - Windows:
ebook2audiobook.cmd --share - 全平台(需在项目目录下):
python app.py --share
[!IMPORTANT] 若脚本被停止后再次运行,必须刷新 Gradio GUI 页面,让网页重新连接到新的 socket,否则界面会显示失联。
GUI 模式补充说明
- 在 GUI 模式下仅允许
--share与--script_mode两个参数(app.py),其余参数会直接报错。 --share与--headless互斥(app.py)。- 端口 7860 被占用时会拒绝二次启动,防止重复实例(app.py)。
Headless 命令行用法(核心参数详解)
无界面模式适合服务器、脚本化与批量转换。基本用法:
# Linux/macOS ./ebook2audiobook.command --headless --ebook <path_to_ebook_file> --voice <path_to_voice_file> --language <language_code> # Windows ebook2audiobook.cmd --headless --ebook <path_to_ebook_file> --voice <path_to_voice_file> --language <language_code>三个基础参数:
--ebook:电子书文件路径。--voice:语音克隆文件路径(可选,缺省使用默认音色)。--language:ISO-639-3 语言码(如ita意大利语、eng英语、deu德语…),默认eng,可通过 lib/conf_lang.py 修改默认值;ISO-639-1 两位码同样支持(源码 lib/core.py 中会经Lang()自动归一化为 ISO-639-3)。
完整参数清单(--help输出)
可通过以下任一命令查看全量参数说明:
# Linux/macOS ./ebook2audiobook.command --help # Windows ebook2audiobook.cmd --help # 全平台 python app.py --help官方文档给出的完整帮助输出(即当前版本的真实 CLI 表面)如下:
usage: app.py [-h] [--session SESSION] [--share] [--headless] [--ebook EBOOK] [--ebooks_dir EBOOKS_DIR] [--language LANGUAGE] [--voice VOICE] [--voice_map VOICE_MAP] [--device {CPU,CUDA,MPS,ROCM,XPU,JETSON}] [--tts_engine {XTTS,BARK,VITS,FAIRSEQ,TACOTRON,YOURTTS,xtts,bark,vits,fairseq,tacotron,yourtts}] [--custom_model CUSTOM_MODEL] [--fine_tuned FINE_TUNED] [--output_format OUTPUT_FORMAT] [--output_channel OUTPUT_CHANNEL] [--temperature TEMPERATURE] [--length_penalty LENGTH_PENALTY] [--num_beams NUM_BEAMS] [--repetition_penalty REPETITION_PENALTY] [--top_k TOP_K] [--top_p TOP_P] [--speed SPEED] [--enable_text_splitting] [--text_temp TEXT_TEMP] [--waveform_temp WAVEFORM_TEMP] [--output_dir OUTPUT_DIR] [--version]各参数含义(依据--help输出与 app.py 的解析实现):
| 参数 | 说明 |
|---|---|
--session SESSION | 恢复被中断/崩溃的转换会话,或复用已加载的自定义模型与克隆音色 |
--share | (仅 GUI 模式)生成可分享的 Gradio 公网链接 |
--headless | 无界面模式 |
--ebook EBOOK | 待转换电子书路径(与--ebooks_dir、--text互斥) |
--ebooks_dir EBOOKS_DIR | 含待转换文件的目录路径(与--ebook、--text互斥),自动过滤不支持的格式 |
--text TEXT | 直接转换的原始文本(与--ebook、--ebooks_dir互斥),上限 1024 字符 |
--language LANGUAGE | 电子书语言,默认取 lib/conf_lang.py 中的设置 |
--translate ISO3 | 先用 argostranslate 将电子书翻译为目标语言(ISO-639-3)再合成;目标语言成为本次实际 TTS 语言;翻译副本带_<iso3>后缀,与未翻译输出隔离 |
--voice VOICE | 语音克隆文件路径,缺省用默认音色 |
--voice_map VOICE_MAP | (仅--ebooks_dir)JSON 文件:ebook 路径 → voice 路径的映射,可覆盖--voice;键支持绝对路径或文件名 |
--device {CPU,CUDA,MPS,ROCM,XPU,JETSON} | 计算设备类型,默认在 lib/conf.py 中设置,不可用时回退 CPU |
--tts_engine {...} | 首选 TTS 引擎,默认随语言决定,需与语言兼容 |
--custom_model CUSTOM_MODEL | 自定义模型 zip 路径(内含必选模型文件,见 lib/conf_models.py) |
--fine_tuned FINE_TUNED | 微调模型路径,默认内置模型 |
--output_format OUTPUT_FORMAT | 输出音频格式,默认m4b(lib/conf.py) |
--output_channel OUTPUT_CHANNEL | 输出声道,默认mono(lib/conf.py) |
--temperature/--length_penalty/--num_beams/--repetition_penalty/--top_k/--top_p/--speed/--enable_text_splitting | 仅 XTTS 引擎生效,默认取模型config.json |
--text_temp/--waveform_temp | 仅 Bark 引擎生效,默认取模型config.json |
--output_dir OUTPUT_DIR | 输出目录,默认在 lib/conf.py 中设置 |
--abs_url/--abs_api_token/--abs_library | Audiobookshelf 服务器 URL、API token 与 library ID,用于成品自动入库 |
--version | 显示版本号并退出 |
XTTS 采样参数的默认值可直接从 lib/conf_models.py 的default_engine_settings中读到:temperature=0.75、length_penalty=1.0、num_beams=1、repetition_penalty=2.0、top_k=40、top_p=0.95、speed=1.0、enable_text_splitting=False(该选项被文档标注为“效率不高”)。Bark 引擎对应text_temp与waveform_temp两个采样参数。这些默认值就是“取模型 config.json”之外的兜底值。
输入方式的三选一约束与校验
headless 模式下--ebook、--ebooks_dir、--text三选一(app.py):
- 单文件:
--ebook路径须存在(app.py); - 批量目录:
--ebooks_dir下所有受支持格式文件按自然排序依次转换,不支持的格式被打印跳过(app.py); - 原始文本:
--text内容非空且不超过max_ebook_textarea_length = 1024字符(app.py)。
若三个参数一个都不给,会明确报错要求三者必选其一。
批量转换 + 每书音色映射(voice_map)
--voice_map是面向目录批量转换的进阶用法。官方帮助给出示例 JSON:
{"book1.epub": "/voices/eng/adult/female/alice.wav", "/abs/path/book2.epub": null}规则(app.py):键可为绝对路径或文件名(basename);每个条目覆盖该书的--voice;值为null或缺失时回退到--voice;如果映射的音色文件不存在,也会回退。排序在转换前统一执行,保证跨平台可复现的顺序。
翻译功能(--translate)
--translate eng这类用法会在 TTS 合成前先把全书翻译为目标语言:目标语言成为本次运行的实际 TTS 语言;源书会生成一份带_<iso3>后缀的副本,使“翻译输出”与“未翻译输出”各自拥有独立的处理目录、音频分块与最终文件(app.py)。目标语言必须在语言映射表中,且需具备 ISO-639-1 映射,否则报错退出。
官方示例命令
# Windows,Gradio 模式 ebook2audiobook.cmd # Windows,headless 模式 ebook2audiobook.cmd --headless --ebook '/path/to/file' --language eng # Linux/macOS,Gradio 模式 ./ebook2audiobook.command # Linux/macOS,headless 模式 ./ebook2audiobook.command --headless --ebook '/path/to/file' --language eng自定义模型上传(Custom Model Zip)
自定义模型必须以.zip压缩包形式提供,内含该 TTS 引擎的全部必选模型文件。以 XTTSv2 为例,zip 内需要:
config.jsonmodel.pthvocab.jsonref.wav(参考音频,用于克隆音色)
用法:
# Linux/macOS ./ebook2audiobook.command --headless --ebook <ebook_file_path> --language <language> --custom_model <custom_model_path> # Windows ebook2audiobook.cmd --headless --ebook <ebook_file_path> --language <language> --custom_model <custom_model_path>要点:
<custom_model_path>是model_name.zip的路径,不同 TTS 引擎的必选文件清单不同,参见 lib/conf_models.py(如 XTTSv2 的files字段即上述四个文件)。- 自定义模型中的
ref.wav永远是本次转换使用的音色(官方文档明确)。 - 源码层面 lib/conf_models.py 定义了支持自定义模型的引擎为
PIPER、XTTS、VITS、FAIRSEQ;路径经存在性校验后转为绝对路径(app.py)。
Docker / Compose / Podman 部署
构建镜像
# Windows:Docker ebook2audiobook.cmd --script_mode build_docker # Windows:Docker Compose ebook2audiobook.cmd --script_mode build_docker --docker_mode compose # Windows:Podman Compose ebook2audiobook.cmd --script_mode build_docker --docker_mode podman # Linux/macOS:Docker ./ebook2audiobook.command --script_mode build_docker # Linux/macOS:Docker Compose ./ebook2audiobook.command --script_mode build_docker --docker_mode compose # Linux/macOS:Podman Compose ./ebook2audiobook.command --script_mode build_docker --docker_mode podman
--script_mode唯一合法值是build_docker;--docker_mode可选podman与compose,不填则使用标准 docker buildx(app.py)。注意 Docker 镜像必须在仓库根目录完整检出后本地构建,docker-compose.yml 的pull_policy: never保证绝不从远端拉取应用镜像,只拉取基础 Python 镜像。
运行容器(Gradio GUI 模式)
# CPU docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" --rm -it -p 7860:7860 athomasson2/ebook2audiobook:cpu # CUDA(按驱动选择 tag,如 cu118/cu122/cu124/cu126…) docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" --gpus all --rm -it -p 7860:7860 athomasson2/ebook2audiobook:cu[118/122/124/126 etc..] # ROCm(如 rocm6.0/6.1/6.4…) docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" --device=/dev/kfd --device=/dev/dri --rm -it -p 7860:7860 athomasson2/ebook2audiobook:rocm[6.0/6.1/6.4 etc..] # XPU(Intel/AMD/ARM) docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" --device=/dev/dri --rm -it -p 7860:7860 athomasson2/ebook2audiobook:xpu # JETSON(如 jetson51/60/61…) docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" --runtime nvidia --rm -it -p 7860:7860 athomasson2/ebook2audiobook:jetson[51/60/61 etc...]运行容器(Headless 模式)
在 GUI 模式命令基础上追加数据卷挂载与 headless 参数:
# CPU docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" -v "/my/real/ebooks/folder/absolute/path:/app/another_ebook_folder" --rm -it -p 7860:7860 ebook2audiobook:cpu --headless --ebook "/app/another_ebook_folder/myfile.pdf" [--voice /app/my/voicepath/voice.mp3 etc..] # CUDA docker run ... --gpus all ... ebook2audiobook:cu[118/122/124/126 etc..] --headless --ebook "/app/another_ebook_folder/myfile.pdf" [--voice ...] # ROCm(加 --device=/dev/kfd --device=/dev/dri) # XPU(加 --device=/dev/dri) # JETSON(加 --runtime nvidia)容器内 MPS 不可用(MPS 未在 Docker 中暴露),因此 Apple Silicon 用户在 Docker 下须使用 CPU。
Docker Compose / Podman Compose(以 CUDA 12.8 为例)
# Docker Compose:Gradio GUI DEVICE_TAG=cu128 docker compose --profile gpu up --no-log-prefix # Docker Compose:Headless DEVICE_TAG=cu128 docker compose --profile gpu run --rm ebook2audiobook --headless --ebook "/app/ebooks/myfile.pdf" --voice /app/voices/eng/adult/female/some_voice.wav etc.. # Podman Compose:Gradio GUI DEVICE_TAG=cu128 podman-compose -f podman-compose.yml --profile gpu up # Podman Compose:Headless DEVICE_TAG=cu128 podman-compose -f podman-compose.yml --profile gpu run --rm ebook2audiobook-gpu --headless --ebook "/app/ebooks/myfile.pdf" --voice /app/voices/eng/adult/female/some_voice.wav etc..docker-compose.yml 通过--profile(cpu/cuda/rocm/xpu/jetson)选择加速后端,DEVICE_TAG控制镜像 tag;Podman 对应 podman-compose.yml。需要 Compose V2(docker compose插件)而非旧版docker-composev1。
语音克隆(Cloned Voices)
官方文档说明:任何支持格式的录音均可上传用于语音克隆,理想时长 1–5 分钟;录音即使带噪声背景或音乐也没关系,E2A 会自动为你清洗音频。内置克隆音色列表目前以英语为主,其他语言音色如需加入官方列表,需联系项目方审核后添加。
源码佐证:语音上传后会经过 lib/classes/voice_extractor.py 的VoiceExtractor管线——先做格式校验(_validate_format)与转 WAV(_convert2wav),再调用 lib/classes/background_detector.py 检测背景噪声/音乐(_detect_background),如检测到则用 Demucs 分离人声(_demucs_voice),随后执行静音移除与修剪(_remove_silences、_trim_and_clean)并最终归一化(normalize_audio)。这与文档“自动清洗噪声”的描述完全一致。支持的音色文件格式在 lib/conf.py 的voice_formats中列出(mp4/m4b/m4a/mp3/wav/aac/flac/alac/ogg/aiff/aif/wma/dsd/opus/pcmu/pcma/gsm 等)。
微调(Fine-tuned)TTS 模型
- 训练自己的 XTTSv2 模型:官方推荐使用配套的 Universal_TTS_Finetune 项目,并提供了 Colab 笔记本(Notebooks/finetune/xtts/colab_xtts_finetune_webui.ipynb)与 Kaggle 笔记本(Notebooks/finetune/xtts/kaggle-xtts-finetune-webui-gradio-gui.ipynb)。
- 训练数据降噪:可使用 DeepFilterNet 等工具对训练音频去噪,提升微调质量。
- 微调模型集合:E2A 团队在 Hugging Face 维护官方微调模型库;自定义 XTTSv2 模型必须附带该音色的参考音频片段(ref.wav)。
自定义配置(libs/conf.py)
官方文档允许自由编辑lib/conf.py(文档原文写作 libs/conf.py,实际路径为 lib/conf.py)以增删所需设置,并给出两条重要建议:
- 修改前先复制原始 conf.py 备份,以便每次升级后恢复再重新套用你的改动;
models.py(即 lib/conf_models.py)同样建议按此流程处理。
若希望将自己的自定义模型加入官方微调预置列表,可联系项目方审核。
回退到旧版本
正式发行版可在 Releases 页面找到,本地/Compose 部署回退命令:
git checkout tags/VERSION_NUM # 示例:git checkout tags/v25.7.7常见问题(官方 FAQ)
- NVIDIA/ROCm/XPU/MPS GPU 未被检测到:参见官方 GPU-ISSUES Wiki 页面。
- CPU 太慢:GPU 几乎可实时转换;CPU(尤其多路 SMP 服务器)明显更慢。注意 CPU 上没有 zero-shot 语音克隆,音色为 Siri 级,但速度快很多。
- “依赖问题”:直接用 Docker——完全自包含,且支持 headless 模式,可在
docker run命令末尾追加--help获取更多信息。 - “音频被截断”:请到仓库提交 issue。项目方并不通晓所有语言,需要用户反馈以微调句切分逻辑。
贡献者须知:Python 代码风格规范
官方文档为贡献者明确了代码规范,核心条目:
- 代码之间除函数/类之间外不留空行;
- 所有 key 使用单引号(
dict()与 json 除外),dict['key']一律单引号调用; - 4 空格缩进,完全禁用 tab;
- 所有函数及参数、返回值必须严格类型标注;
- 参数与类型标注之间、
->与返回值之间均无空格。
官方示例:
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="alice@example.com", role="admin", is_active=True), dict(id=2, name="bob", email="bob@example.com", role="editor", is_active=False), dict(id=3, name="carol", email="carol@example.com", 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'])路线图要点与平台兼容性
官方路线图确认已完成:转换前章节/分块预览、SML 标签集成、多语言-h/--help、PDF/JPG/BMP/PNG/TIFF 的 OCR、Notebooks 目录、Docker/Docker Compose/Podman Compose、Kaggle 与 Colab 笔记本、Audiobookshelf 集成、电子书翻译选项、输出格式选择、多线程转换、批量目录转换、GPU 设备检测、克隆音频背景降噪、自定义微调模型上传。规划中(未完成)的有:逐句编辑以实现精确文本修改、iOS/Android 应用、以及 GPT-SoVITS、OpenVoice、fish-speech、ChatTTS、CosyVoice、F5-TTS、StyleTTS2、Kokoro-TTS、Qwen3-TTS 等更多 TTS 引擎的接入。
操作系统兼容性方面,官方确认已支持:Mac Intel x86、Windows x86、Linux x86、Apple Silicon Mac、ARM Windows、ARM Linux。
延伸:Notebook 与远程运行
除本地与 Docker 外,E2A 还提供开箱即用的云端路径:Google Colab 笔记本(Notebooks/colab_ebook2audiobook.ipynb)与 Kaggle 笔记本(Notebooks/kaggle-ebook2audiobook.ipynb),适合没有本地 GPU 或希望一键体验的用户;XTTSv2 微调也有对应的 Colab 与 Kaggle 笔记本。README 多语言版本(含匈牙利语 hun、中文 zho 等 27 种)可在 readme 目录中查阅。
小结
本文完整继承了匈牙利语版官方文档的全部实操内容(安装、GUI、headless、Docker/Compose、SML、克隆、微调、FAQ、回退版本、贡献规范),并以源码为依据对参数默认值、校验逻辑与底层管线做了交叉印证。核心要点可归纳为:
- 两种运行模式:Gradio GUI(
http://localhost:7860)与--headless命令行,二者通过 app.py 的 argparse 严格区分; - 三选一输入:
--ebook(单文件)、--ebooks_dir(批量)、--text(原始文本,≤1024 字符); - 默认值集中于 lib/conf.py 与 lib/conf_models.py,
m4b/mono/eng/XTTS 参数等均可按需修改; - SML 标签是控制停顿与换声的关键手段,
[pause:N]可直接指定秒数; - 语音克隆自带降噪,1–5 分钟带噪录音也能直接使用;
- 容器部署需本地构建镜像(
pull_policy: never),按加速后端选择cpu/cu*/rocm*/xpu/jetsontag。
- AI 应用
- 语音
- 音频
- 本地部署
【免费下载链接】ebook2audiobook
Generate audiobooks from e-books, voice cloning & 1158+ languages!
相关推荐
AgentsView 文件系统会话同步:跨机器 Session 归档的 session_sources 配置与传输规范
AgentsView 文件系统会话同步:跨机器 Session 归档的 session_sources 配置与传输规范 本文围绕 AgentsView 的「文件
AI 应用语音音频本地部署ebook2audiobook 使用指南:从电子书到多语言有声书的完整实战手册
ebook2audiobook 使用指南:从电子书到多语言有声书的完整实战手册 本篇指南围绕开源项目 ebook2audiobook(E2A)展开,完整讲解其本
AI 应用语音音频本地部署Kubernetes Goat 场景 15 实战:容器镜像层取证——从镜像中找回被删除的敏感文件
Kubernetes Goat 场景 15 实战:容器镜像层取证——从镜像中找回被删除的敏感文件 本文基于 Kubernetes Goat 的 Scenario
AI 应用语音音频本地部署
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考