EPUB到有声书转换器
加入我们的Discord服务器,提出任何问题或进行讨论。
这个项目提供了一个命令行工具,用于将EPUB电子书转换为有声书。它现在支持微软Azure语音合成API(也可以使用EdgeTTS)以及 OpenAI语音合成API来生成每章电子书的音频。输出的音频文件经过优化,可用于Audiobookshelf。
这个项目是在ChatGPT的帮助下开发的。
音频示例
如果你有兴趣听一下这个工具生成的有声书示例,请查看以下链接。
- Azure TTS示例
- OpenAI TTS示例
- Edge TTS示例:声音与Azure TTS几乎相同
需求
- Python 3.6+ 或 Docker
- 使用Azure TTS时,需要拥有一个能访问微软认知服务语音服务的Microsoft Azure账户。
- 使用OpenAI TTS时,需要OpenAI API密钥。
- 使用Edge TTS时,无需API密钥。
Audiobookshelf集成
这个项目生成的有声书经过优化,可用于Audiobookshelf。EPUB文件中的每一章都会被转换成单独的MP3文件,并提取并包含章节标题作为元数据。
章节标题
从EPUB文件中解析和提取章节标题可能具有挑战性,因为不同电子书的格式和结构可能差异很大。脚本采用了一种简单但有效的方法来提取章节标题,这种方法适用于大多数EPUB文件。该方法涉及解析EPUB文件并查找每章节HTML内容中的title
标签。如果没有标题标签,则会使用章节文本的前几个单词生成一个后备标题。
请注意,这种方法可能并不适用于所有EPUB文件,尤其是那些具有复杂或非标准格式的文件。然而,在大多数情况下,它为在Audiobookshelf中提取章节标题提供了可靠的方式。
当你将生成的MP3文件导入到Audiobookshelf中时,章节标题将会显示,这使得在各章节之间导航更加容易,并增强了你的聆听体验。
安装
-
克隆此仓库:
git clone https://github.com/p0n1/epub_to_audiobook.git cd epub_to_audiobook
-
创建一个虚拟环境并激活它:
python3 -m venv venv source venv/bin/activate
-
安装所需的依赖项:
pip install -r requirements.txt
-
使用你的Azure语音合成API凭证或OpenAI API密钥设置以下环境变量:
export MS_TTS_KEY=<your_subscription_key> # 适用于Azure export MS_TTS_REGION=<your_region> # 适用于Azure export OPENAI_API_KEY=<your_openai_api_key> # 适用于OpenAI
使用方法
要将EPUB电子书转换为有声书,请运行以下命令,并使用--tts
选项指定你选择的TTS提供商:
python3 main.py <input_file> <output_folder> [options]
要检查此脚本的最新选项描述,可以在终端中运行以下命令:
python3 main.py -h
usage: main.py [-h] [--tts {azure,openai,edge}]
[--log {DEBUG,INFO,WARNING,ERROR,CRITICAL}] [--preview]
[--no_prompt] [--language LANGUAGE]
[--newline_mode {single,double,none}]
[--title_mode {auto,tag_text,first_few}]
[--chapter_start CHAPTER_START] [--chapter_end CHAPTER_END]
[--output_text] [--remove_endnotes] [--voice_name VOICE_NAME]
[--output_format OUTPUT_FORMAT] [--model_name MODEL_NAME]
[--voice_rate VOICE_RATE] [--voice_volume VOICE_VOLUME]
[--voice_pitch VOICE_PITCH] [--proxy PROXY]
[--break_duration BREAK_DURATION]
input_file output_folder
将文本书转换为有声书
位置参数:
input_file EPUB文件的路径
output_folder 输出文件夹的路径
选项:
-h, --help 显示此帮助信息并退出
--tts {azure,openai,edge}
选择TTS提供商(默认:azure)。azure:Azure认知服务,openai:OpenAI TTS API。使用azure时,必须设置环境变量MS_TTS_KEY和MS_TTS_REGION。使用openai时,必须设置环境变量OPENAI_API_KEY。
--log {DEBUG,INFO,WARNING,ERROR,CRITICAL}
日志级别(默认:INFO),可选DEBUG、INFO、WARNING、ERROR、CRITICAL
--preview 启用预览模式。在预览模式下,脚本不会将文本转换为语音。相反,它将打印章节索引、标题和字符数。
--no_prompt 在估算TTS云端费用后,不再询问用户是否继续。适用于脚本化。
--language LANGUAGE 语音合成服务的语言(默认:en-US)。对于Azure TTS(--tts=azure),请查看https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=tts#text-to-speech以获取支持的语言列表。对于OpenAI TTS(--tts=openai),其API会自动检测语言。但设置此项也有助于在此工具中以不同策略将文本拆分为块,尤其是中文书籍。对于中文书籍,使用zh-CN、zh-TW或zh-HK。
--newline_mode {single,double,none}
选择检测新段落的模式:'single','double'或'none'。'single'表示单个换行符,而'double'表示两个连续的换行符。”none“表示所有换行符将被替换为空格,因此不会检测段落。(默认:double,适用于大多数电子书,但对于某些电子书会检测到较少的段落)
--title_mode {auto,tag_text,first_few}
选择章节标题解析模式,'tag_text'搜索'title','h1','h2','h3'标签的标题,'first_few'将前60个字符设置为标题,'auto'为当前章节自动应用最佳模式。
--chapter_start CHAPTER_START
章节起始索引(默认:1,从1开始)
--chapter_end CHAPTER_END
章节结束索引(默认:-1,表示到最后一章)
--output_text 启用输出文本。 这将为指定的每一章导出一个纯文本文件,并将文件写入指定的输出文件夹。
--remove_endnotes 将删除句子末尾或中间的尾注编号。 这对于学术书籍很有用。
--voice_name VOICE_NAME
各种TTS提供商有不同的语音名称,请查找您的提供商设置。
--output_format OUTPUT_FORMAT
语音合成服务的输出格式。支持的格式取决于所选的TTS提供商
--model_name MODEL_NAME
各种TTS提供商有不同的神经网络模型名称
edge specific:
--voice_rate VOICE_RATE
语速。有效的相对值范围是-50%(--xxx='-50%')到+100%。对于负值请使用格式--arg=value,
--voice_volume VOICE_VOLUME
语音音量。有效的相对值下限为-100%。对于负值请使用格式--arg=value,
--voice_pitch VOICE_PITCH
语音基调。有效的相对值如-80Hz,+50Hz,音调变化应在原始音频的0.5到1.5倍之间。对于负值请使用格式--arg=value,
--proxy PROXY TTS提供商的代理服务器。格式:http://[username:password@]proxy.server:port
azure/edge specific:
--break_duration BREAK_DURATION
不同段落或部分的暂停时间(默认:1250毫秒,即1.25秒)。有效值范围为0到5000毫秒(适用于Azure TTS)。
示例:
python3 main.py examples/The_Life_and_Adventures_of_Robinson_Crusoe.epub output_folder
执行上述命令会生成一个名为output_folder
的目录,并使用默认的TTS提供商和语音将每章的MP3文件保存到该目录中。生成后,你可以将这些音频文件导入到Audiobookshelf中,或使用任何音频播放器播放它们。
预览模式
在将你的epub文件转换为有声书之前,你可以使用--preview
选项来获得每章的摘要。这将为你提供每章的字符数和总字符数,而不是将文本转换为语音。
示例:
python3 main.py examples/The_Life_and_Adventures_of_Robinson_Crusoe.epub output_folder --preview
使用Docker
此工具作为Docker镜像提供,使其无需管理Python依赖项即可轻松运行。
首先,确保你的系统已安装Docker。
你可以从GitHub容器注册表中拉取Docker镜像:
docker pull ghcr.io/p0n1/epub_to_audiobook:latest
然后,你可以使用以下命令运行该工具:
docker run -i -t --rm -v ./:/app -e MS_TTS_KEY=$MS_TTS_KEY -e MS_TTS_REGION=$MS_TTS_REGION ghcr.io/p0n1/epub_to_audiobook your_book.epub audiobook_output --tts azure
对于OpenAI,你可以运行以下命令:
docker run -i -t --rm -v ./:/app -e OPENAI_API_KEY=$OPENAI_API_KEY ghcr.io/p0n1/epub_to_audiobook your_book.epub audiobook_output --tts openai
用你的Azure语音合成API凭证替换 $MS_TTS_KEY
和 $MS_TTS_REGION
。用你的OpenAI API密钥替换 $OPENAI_API_KEY
。用输入EPUB文件的名称替换 your_book.epub
,用你要保存输出文件的目录的名称替换 audiobook_output
。
-v ./:/app
选项将当前目录(.
)挂载到Docker容器中的 /app
目录。这样工具就可以读取输入文件并将输出文件写入到你的本地文件系统。
-i
和 -t
选项用于启用交互模式并分配伪TTY。
你也可以查看这个示例配置文件以了解docker-compose用法。
面向Windows用户的用户友好指南
对于Windows用户,尤其是那些不太熟悉命令行工具的用户,我们为你们提供了指南。我们了解挑战,并为你们专门编写了一份指南。
查看这份逐步指南,如果遇到问题,请留言。
如何获取你的Azure认知服务密钥?
如何获取你的 OpenAI API 密钥?
请检查 https://platform.openai.com/docs/quickstart/account-setup。在使用前,请确保检查[价格](https://openai.com/pricing)详情。
✨ 关于 Edge TTS
Edge TTS 和 Azure TTS 几乎相同,区别在于 Edge TTS 不需要 API 密钥,因为它基于 Edge 的朗读功能,并且参数有所限制,例如自定义 ssml。
查看 https://gist.github.com/BettyJJ/17cbaa1de96235a7f5773b8690a20462 获取支持的语音列表。
如果你想快速尝试这个项目,强烈推荐使用 Edge TTS。
语音和语言的定制化
你可以在运行脚本时通过传递 --voice_name
和 --language
选项来自定义文本到语音转换的语音和语言。
Microsoft Azure 提供了多种语音和语言供文本到语音服务使用。有关可用选项的列表,请参阅Microsoft Azure 文本到语音文档。
你也可以在Azure TTS 声音画廊中收听可用语音的样本,帮助你选择最适合你的有声读物的声音。
例如,如果你想使用英式英语女性语音进行转换,可以使用以下命令:
python3 main.py <input_file> <output_folder> --voice_name en-GB-LibbyNeural --language en-GB
对于 OpenAI TTS,可以使用 --model_name
, --voice_name
和 --output_format
选项来指定模型、语音和格式选项。
更多示例
以下是一些演示各种选项组合的示例:
使用 Azure TTS 的示例
-
使用默认设置的基本转换
此命令将使用 Azure 的默认 TTS 设置将 EPUB 文件转换为有声读物。python3 main.py "path/to/book.epub" "path/to/output/folder" --tts azure
-
使用自定义语言、语音和日志等级进行 Azure 转换
使用指定的语音和自定义日志等级将 EPUB 文件转换为有声读物,以便进行调试。python3 main.py "path/to/book.epub" "path/to/output/folder" --tts azure --language zh-CN --voice_name "zh-CN-YunyeNeural" --log DEBUG
-
带有章节范围和段落间隔的 Azure 转换
使用自定义段落间隔将指定范围的章节从 EPUB 文件转换为有声读物。python3 main.py "path/to/book.epub" "path/to/output/folder" --tts azure --chapter_start 5 --chapter_end 10 --break_duration "1500"
使用 OpenAI TTS 的示例
-
使用默认设置的基本转换
此命令将使用 OpenAI 的默认 TTS 设置将 EPUB 文件转换为有声读物。python3 main.py "path/to/book.epub" "path/to/output/folder" --tts openai
-
使用高清模型和特定语音的 OpenAI 转换
使用高清 OpenAI 模型和特定语音选项将 EPUB 文件转换为有声读物。python3 main.py "path/to/book.epub" "path/to/output/folder" --tts openai --model_name "tts-1-hd" --voice_name "fable"
-
带有预览和文本输出的 OpenAI 转换
启用预览模式和文本输出,将显示章节索引和标题,并同时导出文本。python3 main.py "path/to/book.epub" "path/to/output/folder" --tts openai --preview --output_text
使用 Edge TTS 的示例
-
使用默认设置的基本转换
此命令将使用 Edge 的默认 TTS 设置将 EPUB 文件转换为有声读物。python3 main.py "path/to/book.epub" "path/to/output/folder" --tts edge
-
使用自定义语言、语音和日志等级进行 Edge 转换 使用指定的语音和自定义日志等级将 EPUB 文件转换为有声读物,以便进行调试。
python3 main.py "path/to/book.epub" "path/to/output/folder" --tts edge --language zh-CN --voice_name "zh-CN-YunxiNeural" --log DEBUG
-
带有章节范围和段落间隔的 Edge 转换 使用自定义段落间隔将指定范围的章节从 EPUB 文件转换为有声读物。
python3 main.py "path/to/book.epub" "path/to/output/folder" --tts edge --chapter_start 5 --chapter_end 10 --break_duration "1500"
故障排除
ModuleNotFoundError: No module named 'importlib_metadata'
这可能是因为你使用的 Python 版本低于 3.8。可以尝试手动安装 pip3 install importlib-metadata
,或使用更高版本的 Python。
FileNotFoundError: [Errno 2] No such file or directory: 'ffmpeg'
确保 ffmpeg 可执行文件可以从你的路径中访问。如果你使用的是 Mac 并且使用 homebrew,可以执行 brew install ffmpeg
,在 Ubuntu 上可以执行 sudo apt install ffmpeg
相关项目
- Epub to Audiobook (M4B): 通过 HuggingFace Spaces API,将 Epub 转换为 MB4 有声读物的项目。
- Storyteller: 一个自动同步电子书和有声读物的自托管平台。
许可证
此项目遵循 MIT 许可证。有关详细信息,请参阅 LICENSE 文件。