原文要解决的问题是用 Python 把 PDF 文本抽取出来,再交给 gTTS 合成 mp3。脚本由两条链路组成:PyPDF2 负责按页读取和提取文本,gTTS 负责语音合成。原文环境为 Python 3.x,依赖 PyPDF2 与 gtts。
核心函数拆解:read_pdf(file_path) 以 rb 模式打开 PDF,用 PyPDF2.PdfFileReader 创建阅读器,通过 numPages 遍历页,调用 getPage(page_num).extractText() 收集每页文本,返回文本列表。convert_to_speech(text) 用 gTTS(text=text, lang='zh') 生成中文语音,并保存为 output.mp3。main() 从 input 获取 PDF 路径,先执行 read_pdf,再对每页调用 convert_to_speech。
原文基础实现整理如下:- import PyPDF2
- from gtts import gTTS
- def read_pdf(file_path):
- with open(file_path, 'rb') as file:
- pdf_reader = PyPDF2.PdfFileReader(file)
- text_content = []
- for page_num in range(pdf_reader.numPages):
- text_content.append(pdf_reader.getPage(page_num).extractText())
- return text_content
- def convert_to_speech(text):
- tts = gTTS(text=text, lang='zh')
- tts.save('output.mp3')
- print('有声读物已生成,请查看输出文件。')
- def main():
- file_path = input('请输入 Pdf 文件路径:')
- text_content = read_pdf(file_path)
- for page_text in text_content:
- convert_to_speech(page_text)
- if __name__ == '__main__':
- main()
复制代码
参数与调用关系方面,lang 控制合成语言,原文固定为 zh;进阶版本的 convert_to_speech(text, lang, tts_speed) 将 tts_speed 传给 gTTS 的 slow 参数,但 slow 是慢速开关,不是任意速度数值。convert_multiple_pages_to_speech(file_path, pages, lang, tts_speed) 通过 pages 选择页面,再用 text_content[page_num] 取文本。pages 的索引语义原文没有说明,代码直接按列表下标使用;若传入自然页码,需要减 1,否则会错页或越界。
主要问题与排查重点:
1)输出覆盖。main 和多页函数都逐页调用 convert_to_speech,而函数内部固定保存为 output.mp3,后一页会覆盖前一页,最终只留下最后一页。排查时先看输出目录是否只有一个 output.mp3。修正方向是输出文件名带页码,或将多页文本合并后一次合成。
2)PyPDF2 接口兼容性。原文代码使用 PdfFileReader、numPages、getPage、extractText 这套接口;运行环境安装的 PyPDF2 版本若接口名不同,会出现找不到属性。应先核对所安装 PyPDF2 的版本和接口,再决定固定依赖或按实际接口改写读取部分。
3)slow 参数语义。tts_speed 变量名像速度,但 gTTS 的 slow 是布尔型慢速开关,传非布尔值不符合参数含义。
4)文本提取结果。extractText 按页提取,若 PDF 没有可提取的文本层,结果可能为空;原文未涉及 OCR 处理。
排查流程可参考:确认 Python 3.x;确认 PyPDF2 和 gtts 已安装;用明确路径确认 PDF 可读;打印 read_pdf 返回的页数和每页文本长度;检查 output.mp3 是否被覆盖;检查 pages 是否按 0 基索引传入;检查 lang 与 slow 参数是否符合 gTTS 调用含义。
按原文函数结构做小幅修正时,可保留 read_pdf 和 convert_to_speech 的职责,只把输出文件名加入页码、把 slow 改为布尔参数、在多页函数中传递页码,从而避免覆盖和参数误用。示例仍使用原文的 PyPDF2 旧接口;若运行环境接口不同,需要按实际版本调整读取部分:- import PyPDF2
- from gtts import gTTS
- def read_pdf(file_path):
- with open(file_path, 'rb') as file:
- pdf_reader = PyPDF2.PdfFileReader(file)
- text_content = []
- for page_num in range(pdf_reader.numPages):
- text_content.append(pdf_reader.getPage(page_num).extractText())
- return text_content
- def convert_to_speech(text, page_num=0, lang='zh', slow=False):
- tts = gTTS(text=text, lang=lang, slow=slow)
- filename = 'output_%d.mp3' % page_num
- tts.save(filename)
- print('有声读物已生成:', filename)
- def convert_multiple_pages_to_speech(file_path, pages, lang='zh', slow=False):
- text_content = read_pdf(file_path)
- for page_num in pages:
- convert_to_speech(text_content[page_num], page_num, lang, slow)
- def main():
- file_path = input('请输入 Pdf 文件路径:')
- text_content = read_pdf(file_path)
- for page_num, page_text in enumerate(text_content):
- convert_to_speech(page_text, page_num)
- if __name__ == '__main__':
- main()
复制代码
适用场景是文本型 PDF 的有声化、按页选择合成和中文朗读。原文只覆盖文本提取与 gTTS 合成,没有实现扫描件 OCR、音频合并和断句优化,这些不应被当作原文已具备的能力。 |