一个完全离线的本地有声书管理器,支持文本转语音(TTS)和音频播放。
- 📚 多本书管理 - 同时管理多本有声书
- 🎧 TTS 转换 - 使用 Piper 将文本转为语音(完全离线),支持中英文
▶️ 音频播放 - 使用 mpv 播放音频,支持流畅的章节切换- ⏸️ 暂停/恢复 - 使用 mpv IPC 原生控制,支持即时暂停和恢复
- ⏸️ 断点续播 - 记住每本书的播放进度
- 🔊 音量控制 - 实时音量调节,自动保存设置
- ⏩ 播放速度 - 支持 0.5x - 2.0x 播放速度,预设常用档位
- 📖 阅读模式 - 纯文本阅读模式,支持章节导航、字体调节、多主题(日间/夜间/护眼)
- ⌨️ 快捷键支持 - 完整的键盘快捷键控制(空格播放/暂停、PageUp/Down 翻章等)
- 🎨 GUI 界面 - 基于 PySide6 的现代化图形界面
- 🚀 智能缓存 - LRU 缓存机制,优先级调度,快速首次出声
- 🔄 分块导航 - 精确到 ~100 字的细粒度导航
- 🌐 Edge TTS 支持 - 支持 Microsoft Edge TTS 在线语音(可选)
- 💾 本地存储 - SQLite 数据库,所有数据本地保存
- 📴 完全离线 - Piper TTS 无需网络连接
- 🗑️ 自动清理 - 自动清理旧音频文件,节省存储空间
- 操作系统: Linux(推荐),Windows,macOS
- Python: 3.11(仅从源码运行时需要)
无需安装 Python 环境,直接下载运行:
- Linux: 下载 AppImage - 适用于大多数 Linux 发行版
- Windows: 下载 ZIP - 解压即用
- macOS: 下载 ZIP - 适用于 macOS 10.15+
详见 发布页面 获取所有版本。
注意: 从源码运行需要安装系统依赖。预编译版本已包含所有依赖。
git clone https://github.com/power721/novel-reader
cd novel-readerpip install -r requirements.txtsudo apt update
sudo apt install mpv ffmpegsudo pacman -S mpv ffmpegbrew install mpv ffmpeg说明:
mpv是必需的,用于音频播放ffmpeg是可选的,仅在需要使用 Edge TTS 时需要(用于 MP3 到 WAV 转换)
使用提供的脚本快速下载推荐模型:
./download_piper_model.sh脚本支持以下模型:
- 英文: lessac (medium/small), amy (medium)
- 中文: 花檐/小雅/朝文 (medium/small)
首次运行程序时,可以通过 设置 -> TTS 模型设置 对话框:
- 选择需要的中英文模型
- 点击"下载"按钮下载模型
- 下载完成后保存设置
中文模型:
xiao_ya(小雅) - 默认中文模型,约 60MBhuayan(花檐) - 约 60MBchaowen(潮文) - 约 60MB
英文模型:
amy- 默认英文模型,约 60MBlessac- 约 60MBalan(英式英语) - 约 60MB
模型会下载到 models/ 目录,首次运行时自动复制到用户数据目录。
首次运行会自动创建配置文件和数据库:
python -m novel_reader配置文件位置:~/.config/novel-reader/config.json
# 启动 GUI
python -m novel_reader
# 启动 GUI 并创建测试数据
python -m novel_reader --test- 导入书籍 - 支持导入 TXT、EPUB、MOBI、AZW3 等格式的文本文件
- 自动分章 - 智能识别章节标题并分割
- 分块导航 - 精确到 ~100 字的细粒度导航
- 智能缓存 - 优先级调度,快速首次出声(0.1-0.3s)
- 流畅播放 - 后台预合成,自动播放下一章
- 即时暂停 - 使用 mpv IPC 原生控制,支持即时暂停和恢复播放
- 进度管理 - 自动保存播放位置,支持断点续播
- 书签 - 在任意位置添加书签
- 音量控制 - 实时调节播放音量(0% - 100%),设置自动保存
- 播放速度 - 调节播放速度(0.5x - 2.0x),支持预设档位(0.5x, 1.0x, 1.25x, 1.5x, 2.0x)
- 阅读模式 - 纯文本阅读,支持章节导航、字号和行距调节、三种主题(日间/夜间/护眼)
- 快捷键控制 - 完整的键盘快捷键支持,无需鼠标即可控制播放
- 自动清理 - 自动清理旧音频文件,节省存储空间
- 书籍列表 - 查看和管理所有导入的书籍,支持右键菜单快速操作
- 章节列表 - 浏览和跳转到任意章节
- 播放器 - 统一的播放/暂停按钮、章节导航、分段导航、进度显示、文本高亮、音量和速度调节
- 阅读模式 - 纯文本阅读界面,支持章节导航、字号/行距调节、三种主题切换、目录显示/隐藏
- 设置 - 配置 TTS 模型、音频参数等
Novel Reader 支持完整的键盘快捷键控制:
| 快捷键 | 功能 |
|---|---|
空格 |
播放 / 暂停 |
Escape |
停止播放 |
← / → |
后退 / 前进一个分段 |
PageUp / PageDown |
上一章 / 下一章 |
↑ / ↓ |
增加 / 减少音量 |
Ctrl + R |
切换阅读模式 |
Ctrl + I |
导入书籍 |
F5 |
刷新列表 |
F1 |
显示快捷键帮助 |
提示:按 F1 可随时查看完整的快捷键列表。
- Piper TTS (默认) - 完全离线,支持中英文
- Edge TTS (可选) - Microsoft Edge TTS 在线语音,支持多种中英文音色,需要安装 ffmpeg
阅读模式提供纯文本阅读体验,适合安静阅读或查看书籍内容:
主要功能:
- 📖 章节导航 - 快速跳转到任意章节
- 🔤 字体调节 - 支持 12-32px 字号大小调节
- 📏 行距调节 - 支持 50%-250% 行距调节
- 🎨 多主题 - 日间模式、夜间模式、护眼模式
- 📋 目录显示 - 可折叠的章节目录,显示/隐藏切换
- 💾 进度保存 - 自动保存阅读位置,重启后恢复
进入方式:
- 快捷键:
Ctrl + R - 视图菜单:视图 → 阅读模式
- 右键菜单:书籍列表中右键点击书籍 → 进入阅读模式
主题样式:
- ☀️ 日间模式 - 明亮背景,适合白天使用
- 🌙 夜间模式 - 深色背景,保护眼睛
- 🌿 护眼模式 - 暖色调,减少蓝光
程序支持完整的模型管理功能:
- 模型选择 - 分别设置中文和英文 TTS 模型
- 下载管理 - 通过 GUI 下载和删除模型
- 进度显示 - 实时显示下载进度
- 状态检查 - 查看所有可用模型的下载状态
- 模型切换 - 切换模型后自动清理缓存
所有模型文件存储在 ~/.local/share/novel-reader/models/ 或 models/ 目录。
novel-reader/
├── novel_reader/ # 主程序包
│ ├── __main__.py # 程序入口
│ ├── gui/ # PySide6 GUI
│ │ ├── pyside_main.py # GUI 入口
│ │ ├── main_window.py # 主窗口
│ │ ├── widgets/ # UI 组件
│ │ ├── workers/ # 后台线程
│ │ ├── dialogs/ # 对话框
│ │ └── controllers/ # 控制器适配器
│ ├── ui/ # TUI 界面(遗留)
│ ├── core/ # 核心逻辑(v2 架构)
│ │ ├── models_v2.py # 数据模型
│ │ ├── playback_controller_v2.py # 播放控制器
│ │ ├── chunk_manager_v2.py # 文本分块
│ │ ├── tts_scheduler_v2.py # TTS 调度
│ │ ├── audio_cache.py # LRU 缓存
│ │ ├── audio_player_v2.py # 音频播放
│ │ ├── model_config.py # TTS 模型配置
│ │ ├── model_downloader.py # 模型下载管理
│ │ ├── settings.py # 配置管理
│ │ ├── tts.py # TTS 核心引擎
│ │ └── sentence_manager.py # 句子处理
│ ├── models/ # 数据库模型
│ └── utils/ # 工具函数
├── tests/ # 测试
├── docs/ # 文档
├── g2pW/ # 中文转拼音工具
├── requirements.txt # Python 依赖
├── download_piper_model.sh # TTS 模型下载脚本
└── README.md # 本文件
编辑配置文件 ~/.config/novel-reader/config.json:
{
"tts_engine": "piper",
"tts_model": "lessac-medium",
"tts_voice": "en_US-lessac-medium.onnx",
"audio_cache_size": 80,
"text_chunk_size": 100,
"prefetch_chunks": 2,
"volume": 1.0,
"playback_speed": 100
}| 参数 | 说明 | 默认值 |
|---|---|---|
auto_play_on_startup |
启动时自动播放 | true |
auto_play_on_book_select |
选择书籍时自动播放 | false |
remember_last_book |
记住最后选择的书籍 | true |
auto_play_next_book |
自动播放下一本书 | false |
auto_play_next_chapter |
自动播放下一章节 | true |
chinese_model_id |
中文 TTS 模型 ID | xiao_ya |
english_model_id |
英文 TTS 模型 ID | amy |
model_dir |
模型存储目录 | models |
prefetch_chunk_count |
预转换后续 chunk 数量 | 3 |
cleanup_old_chunk_threshold |
清理 N 之前的音频文件 | 50 |
audio_cache_size |
缓存 chunk 数量 | 80 |
text_chunk_size |
每个 chunk 字符数 | 100 |
prefetch_chunks |
预取 chunk 数量 | 2 |
volume |
播放音量 (0.0 - 1.0) | 1.0 |
playback_speed |
播放速度 (50 - 200) | 100 |
- 配置:
~/.config/novel-reader/config.json - 数据库:
~/.local/share/novel-reader/library.db - 音频:
~/.local/share/novel-reader/audio/ - TTS 模型:
~/.local/share/novel-reader/models/
- 确认
piper-tts已安装:python -c "import piper_tts" - 使用
./download_piper_model.sh下载 TTS 模型 - 或通过 GUI 界面下载模型(设置 -> TTS 模型设置)
- 检查模型文件是否在
~/.local/share/novel-reader/models/或models/ - 确认配置文件中的模型 ID 正确:
chinese_model_id和english_model_id - 查看日志:
~/.cache/novel-reader/logs/
- 检查网络连接(或使用 HuggingFace 镜像)
- 确认磁盘空间充足(每个模型约 60MB)
- 尝试手动从 HuggingFace 下载模型文件
- 检查模型目录的写入权限
- 确认 mpv 已正确安装:
mpv --version - 检查音频设备是否正常工作
- 尝试使用
mpv <audio_file>直接播放测试
- 确认 ffmpeg 已正确安装:
ffmpeg --version - Edge TTS 需要使用 ffmpeg 将 MP3 转换为 WAV 格式
- 检查网络连接(Edge TTS 需要在线访问 Microsoft 服务器)
- 尝试切换到 Piper TTS(完全离线)
项目内置中文支持,包括:
- 自动繁简转换
- 拼音转换(用于多音字处理)
- 数字/标点符号朗读优化
使用 ./download_piper_model.sh 下载中文模型(花檐、小雅、朝文)。
Novel Reader 采用模块化的 v2 架构:
- Chunk-based - 文本被分割成 ~100 字的 chunk 作为最小逻辑单元
- 优先级调度 - 当前播放 chunk 获得最高 TTS 优先级(URGENT > HIGH > NORMAL > LOW)
- LRU 缓存 - 智能缓存策略,避免重复 TTS 转换
- 状态机 - 清晰的播放状态管理(IDLE, LOADING, READY, PLAYING, PAUSED)
- IPC 控制 - 通过 mpv IPC socket 实现即时暂停/恢复、音量和速度调节
- 模型管理 - 支持多个 Piper 模型,支持中英文自动切换
- 音频清理 - 自动清理旧的音频文件,节省存储空间
详细架构文档请参考 ARCHITECTURE.md。
为了节省存储空间,Novel Reader 实现了自动清理机制:
- 触发时机:每次播放完一个 chunk 后自动触发清理
- 清理规则:删除
当前chunk索引 - 阈值之前的所有音频文件 - 默认阈值:50(保留最近播放的 50 个 chunk 的音频)
通过配置文件 ~/.config/novel-reader/config.json 调整清理阈值:
{
"cleanup_old_chunk_threshold": 50
}假设当前正在播放 chunk N,清理阈值为 50:
- 保留:chunk N-50 到 N 的音频文件
- 删除:chunk 0 到 N-51 的音频文件
- 清理操作不会影响当前播放和预取的音频
- 删除的音频文件可以随时重新生成(TTS 转换)
- 设置较小的阈值可以节省更多空间,但可能需要重新生成音频
如果需要手动清理所有音频文件:
# 删除指定书籍的所有音频
rm -rf ~/.local/share/novel-reader/audio/<book_id>/Novel Reader 使用 Piper TTS 引擎进行离线文本转语音,支持以下特性:
- 中英文混合 - 自动检测文本语言并使用相应模型
- 多音色支持 - 提供多个中文和英文音色供选择
- 模型缓存 - Python API 模式下自动缓存加载的模型
- 热切换 - 切换模型时自动清理缓存并重新加载
每个模型包含两个文件:
{model_name}.onnx- 模型权重文件{model_name}.onnx.json- 模型配置文件
示例:
models/
├── zh_CN-xiao_ya-medium.onnx
├── zh_CN-xiao_ya-medium.onnx.json
├── en_US-amy-medium.onnx
└── en_US-amy-medium.onnx.json
程序按以下顺序搜索模型文件:
models/- 当前项目目录~/.local/share/piper_voices/- 用户数据目录~/piper_models/- 用户主目录- 当前目录
模型配置定义在 novel_reader/core/model_config.py 中,包含:
- 模型唯一标识符 (ID)
- 显示名称(中英文)
- 语言代码 (zh/en)
- HuggingFace 下载地址
- 文件大小信息
可以通过修改此文件添加新的模型支持。
使用提供的打包脚本将程序打包为独立的可执行文件:
# 安装打包工具
pip install pyinstaller
# 运行打包脚本
./build.sh打包完成后,在 dist/ 目录会生成:
dist/
├── novel-reader # 可执行文件
├── novel-reader-linux/ # 发布目录
│ ├── novel-reader # 可执行文件
│ ├── start.sh # 启动脚本
│ ├── README.txt # 用户说明
│ └── INSTALL.md # 安装指南
└── novel-reader-YYYYMMDD-linux-x86_64.tar.gz # 压缩包
打包后的程序在目标系统上需要:
- mpv 播放器(必需):
sudo apt install mpv - TTS 模型(可选): 首次运行时下载
将压缩包发送给用户:
# 用户解压
tar -xzf novel-reader-YYYYMMDD-linux-x86_64.tar.gz
cd novel-reader-linux
# 安装系统依赖
sudo apt install mpv
# 运行程序
./start.sh详细的打包指南请参考 docs/BUILD.md。
# 代码格式化(需先安装 black)
black novel_reader/
# 运行示例测试
python -m novel_examples.test_new_archMIT License
欢迎提交 Issue 和 Pull Request!