如何让speak_text()函数将页码视为int类型?
问题描述
我编写了一段使用pyttsx3和PyPDF2实现PDF文本朗读的Python代码,现需让其中的speak_text()函数将页码当作整数类型处理,请问该如何实现?
原代码如下:
import pyttsx3 as pytts import PyPDF2 as pypdf def open_file(file_name): try: pdf_file = open(file_name, 'rb') except: print('file opening operation filed...') pdf_reader = pypdf.PdfFileReader(pdf_file) pages = pdf_reader.numPages user_input = input("Start from page 1? Enter answer: > ") if user_input.lower() == 'yes' or user_input.lower() == 'y': prefered_page = 1 else: prefered_page = input("Enter desired page number: >") page = pdf_reader.getPage(int(prefered_page)) def speak_text(file_name, page): for p in range(int(page) -1, pages): speaker = pytts.init() txt = page.extractText() speaker.say(txt) speaker.runAndWait() speak_text(file_name,page) def home (): file_name = 'short_story.pdf' open_file(file_name) home()
解决方案
原代码的核心问题是speak_text函数接收的page参数是PyPDF2的PdfPage对象,而非整数页码,同时存在缩进错误、循环逻辑失效、重复初始化语音引擎等问题。以下是修正后的代码,确保speak_text以整数作为页码参数:
import pyttsx3 as pytts import PyPDF2 as pypdf def open_file(file_name): try: pdf_file = open(file_name, 'rb') pdf_reader = pypdf.PdfFileReader(pdf_file) return pdf_reader except Exception as e: print(f'文件打开失败: {str(e)}') return None def speak_text(pdf_reader, start_page): # 确保start_page是整数类型,做一次强制转换容错 start_page = int(start_page) total_pages = pdf_reader.numPages # 校验页码合法性 if start_page < 1 or start_page > total_pages: print(f"无效页码!请输入1到{total_pages}之间的数字") return # 只初始化一次语音引擎,避免重复创建资源 speaker = pytts.init() # 从指定页码开始遍历到最后一页 for page_num in range(start_page - 1, total_pages): current_page = pdf_reader.getPage(page_num) txt = current_page.extractText() if txt: # 跳过无文本的页面 print(f"正在朗读第{page_num + 1}页...") speaker.say(txt) speaker.runAndWait() speaker.stop() def home(): file_name = 'short_story.pdf' pdf_reader = open_file(file_name) if not pdf_reader: return total_pages = pdf_reader.numPages user_input = input(f"从第1页开始朗读吗?(是/否)\n> ") if user_input.lower() in ['yes', 'y', '是']: preferred_page = 1 else: # 循环获取合法的页码输入 while True: try: preferred_page = int(input(f"请输入起始页码(1-{total_pages}):\n> ")) if 1 <= preferred_page <= total_pages: break else: print(f"请输入1到{total_pages}之间的数字") except ValueError: print("请输入有效的整数页码!") speak_text(pdf_reader, preferred_page) home()
关键修改说明
- 调整
speak_text参数:改为接收pdf_reader对象和整数类型的start_page,直接以整数作为页码处理 - 修复变量作用域与缩进:将
pdf_reader的创建逻辑放到open_file函数内部,返回对象供后续使用,避免全局变量混乱 - 页码合法性校验:增加输入验证,确保用户输入的页码在有效范围内,同时强制转换为整数类型
- 优化语音引擎初始化:将
speaker = pytts.init()放到循环外,避免重复创建引擎,提升性能 - 修正朗读逻辑:循环中根据
page_num动态获取对应页码的内容,而非一直朗读传入的单页文本
内容的提问来源于stack exchange,提问作者LittleDjin49
相关产品推荐
相关产品推荐

