# BookSpeak **Repository Path**: ue5/book-speak ## Basic Information - **Project Name**: BookSpeak - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-26 - **Last Updated**: 2026-08-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BookSpeak 本地电子书转语音工具。把 PDF / TXT 电子书拆成章节,用 edge-tts 生成中文有声书,Web 界面管理转换与试听。 - **平台**:Windows 本地运行 - **技术栈**:Next.js 15 (App Router) + React 19 + Tailwind CSS 3.4;Python 3.13 子进程负责 PDF 提取与 TTS - **默认音色**:`zh-CN-YunjianNeural` ## 快速开始 直接双击 `BookSpeak-start.bat`:它会自动建 Python venv、装依赖、装 Node 依赖、建 `data/` 目录,并打开 http://localhost:3000 。 ### 手动启动 ```bash # 1. Python 环境(首次) python -m venv python/venv python/venv/Scripts/activate pip install -r python/requirements.txt # 2. Node 依赖(首次) npm install # 3. 启动 npm run dev # 开发模式,访问 http://localhost:3000 ``` > Node 20+ / 22 推荐;Python 3.11+(PyMuPDF 需要)。 ## 使用流程 1. 把 PDF(或 `.txt`)放进 `data/import/` 目录。 2. Web 界面左侧「PDF 导入」里点「转换」——后台 spawn `python/pdf_to_txt.py` 生成 `data/{书名}/{书名}.txt`。 3. 在书库里选书,「拆分章节」——可预览标题再确认(通用正则匹配章节,Web 端预览+确认)。 4. 选 TTS 音色 / 码率,开始转换,进度条显示剩余时间。 5. 音频落在 `data/{书名}/chapters/audio/`,每章一个 mp3。 ## 配置(settings.json) 全部设置持久化到 `settings.json`,启动时自动恢复: | 字段 | 说明 | 取值 | |---|---|---| | `voice` | TTS 音色 | 默认 `zh-CN-YunjianNeural` | | `bitrate` | 音频码率 | `48` 或 `96`(默认 `96`;喜马拉雅推荐 ≥64) | | 间隔/超时 | TTS 顺序执行的控制项 | 秒数 | | `titleCleanupPatterns` | 拆分前对章节标题执行的正则清理(一行一条) | 如 `^第一卷\s*` | ## 已知限制 - **扫描件(图片型 PDF)不支持**:无 OCR,`pdf_to_txt.py` 检测到空文本会退出码 2(界面提示「暂不支持」)。 - **PDF 页脚水印会混入正文**:源 PDF 自带的水印(如「更多书籍请关注公众号:韭菜服务区」)尚未清理,属页脚剥离范畴,未实现。 - **段落判定靠垂直间距**:纯靠首行缩进、零垂直间距分隔的段落可能被合并(不会断词,无害;CJK 书几乎都有段间距)。 - **改完 `pdf_to_txt.py` 必须重转+重拆**:转换接口只覆盖 `book.txt`,**不会**重拆 `chapters/`,UI 仍读旧章节。 ## 排错 - **API 报「PDF 不存在」**:用 curl 传全角文件名时别用 `-d "{\"filename\":\"$VAR\"}"`(shell 转义会破坏特殊字符),改用 `--data-binary @-` + heredoc。 - **venv 创建失败**:Git Bash 下可能失败,改用 PowerShell 创建。 - **TTS 转换失败**:查看返回信息——`lib/tts.ts` 已捕获 Python stderr 末行回传真因,不再只报 `Exit code: X`。 ## 目录结构 ``` data/ import/ # 待转换的 PDF / txt {书名}/ {书名}.txt # 转换后的完整电子书 chapters/ # 章节 txt + audio/ python/ pdf_to_txt.py # PDF→TXT 转换器(几何重建,见文件 docstring) tts_worker.py # edge-tts 包装(码率 monkeypatch) requirements.txt # edge-tts, PyMuPDF lib/ # TS 侧:PDF 列表、章节拆分、TTS 调用 app/ # Next.js App Router + API Routes components/ # React UI 组件 ```