You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:40:45