将文档转为章节语音音频的完整流程:提取文本 → 检测章节 → 合成语音 → 输出MP3
# 一句话调用(自动提取+分章+合成+输出)
import asyncio
from scripts.pdf_to_speech import process_book
result = asyncio.run(process_book(
input_path="精益医院.pdf",
output_dir="./audio", # 音频输出目录
voice="zh-CN-XiaoxiaoNeural", # 女声(推荐听书场景)
rate="0%", # 语速调节
per_chapter=True, # 按章节分文件输出
))
pip install edge-tts pypdf2 python-docx pdfplumber
from scripts.pdf_to_speech import extract_text
# 自动识别文件类型(.pdf / .docx / .txt)
text = extract_text("精益医院.pdf")
from scripts.pdf_to_speech import detect_chapters, split_into_chapters
# 自动检测章节标题(支持中英文多种格式)
chapters = detect_chapters(text)
# 按章节切分内容
chapter_contents = split_into_chapters(text, chapters)
支持的章节标题格式:
第一章 引言、第1章 概述、第1节 内容Chapter 1: xxx、Part 1. xxx1. 、1、、1) 等行列标题注意: 某些文档的章节格式可能不规范(如标题分两行、编号缺失等)。此时可手动传入自定义正则:
# 自定义章节检测模式
import re
custom_patterns = [
r"第[一二三四五六七八九十百零]+章", # 仅匹配"第X章"格式
]
chapters = detect_chapters(text, patterns=custom_patterns)
from scripts.pdf_to_speech import synth_text_to_speech
# 单段文本合成
result = await synth_text_to_speech(
text="要朗读的文本内容",
output_path="chapter1.mp3",
voice="zh-CN-XiaoxiaoNeural", # 女声
rate="0%", # 语速(+10%加快,-10%减慢)
volume="0%", # 音量
pitch="0Hz", # 音调
chunk_size=2500 # 每段最大字符数
)
自动分段机制: 超长文本(>2500字符)会自动按段落切分为多个合成段,合成完成后二进制拼接为单一 MP3 文件(无需 ffmpeg)。
import asyncio
from scripts.pdf_to_speech import process_book
async def main():
result = await process_book(
input_path="精益医院.pdf",
output_dir="./audio",
voice="zh-CN-XiaoxiaoNeural", # 女声
rate="0%",
per_chapter=True, # 分章输出
chunk_size=2500,
naming="auto" # 自动从章节标题命名
)
# result = {"chapters": [(title, mp3_path), ...], "total_size": int}
for title, mp3 in result["chapters"]:
print(f" ✓ {title} -> {mp3}")
asyncio.run(main())
参见 references/voices.md 获取完整语音列表。
推荐配置:
zh-CN-XiaoxiaoNeural(女声温柔自然,首选)zh-CN-YunxiNeural(男声沉稳专业)zh-CN-YunyangNeural(男声浑厚有力)zh-CN-XiaoyiNeural(女声热情清晰)也可直接在终端使用脚本,适合不需要 Python 代码的场景:
# 基本用法(默认女声)
python pdf_to_speech.py 精益医院.pdf --output-dir ./audio
# 指定男声 + 减慢语速
python pdf_to_speech.py 报告.docx -v zh-CN-YunxiNeural -r -10% -o ./audio
# 整篇合成一个文件(不分章)
python pdf_to_speech.py 文章.txt --no-chapter -o ./audio
以下是处理 1.4MB PDF/DOCX、165,382 字符、12章全书时的参数:
result = asyncio.run(process_book(
input_path="精益医院_世界最佳医院管理实践_GLMOCR版.docx",
output_dir="./ebook_output/audio",
voice="zh-CN-XiaoxiaoNeural", # 女声
chunk_size=2500, # 每段2500字符
))
# 输出:12章 MP3,总计约 172MB
| 问题 | 建议 | |
|---|---|---|
| ------ | ------ | |
| 章节标题格式不规范(分两行/无编号) | 手动传入 chapter_patterns 自定义正则匹配 | |
| 合成超时(沙箱600s限制) | 使用子进程运行脚本,或用 python pdf_to_speech.py CLI 模式 | |
| PDF 扫描版(图片格式) | 需先使用 OCR 工具提取文本(如 GLM-OCR),本技能不包含 OCR | |
| 文本中包含特殊字符影响合成 | 脚本已自动过滤 `\\/:*?"<> | ` 等非法文件名字符 |
| 文件过大超长 | 按章节分文件合成,每章节自动分段2500字符 |
输入文件(.pdf/.docx/.txt)
│
▼
提取文本(自动识别格式)
│
▼
检测章节标题(正则匹配中英文格式)
│
▼
逐章合成(长文本自动分段→Edge TTS→二进制拼接)
│
▼
输出 MP3 文件(每章一个独立文件)
pdf_to_speech.py — 核心脚本,包含全部功能(文本提取、章节检测、语音合成、CLI入口)voices.md — Edge TTS 语音列表及参数说明共 1 个版本