Pyttsx3实现PDF语音朗读时的倒计时语音播报问题求助
解决PDF语音朗读中的倒计时语音播报问题
问题描述
需要修改现有PDF语音朗读Python代码,将原有的5到1倒计时功能改为10到0,同时让扬声器播报每个倒计时数字。尝试添加speaker.say(str(i))实现语音播报时出现报错,请求解决。
原代码如下:
import pyttsx3 as audio_converter import PyPDF2 # version 1.26.0 import time import sys book = open("OOP.pdf", "rb") pdfreader = PyPDF2.PdfFileReader(book) pages = pdfreader.numPages # to find out number of pages print(f'PDF name : "Object Oriented Programing (OOP)\nPage number : {pages}"') speaker = audio_converter.init() # to init the package of pyttsx3 page = pdfreader.getPage(7) # pdf page number + 1 (index 0) text = page.extractText() speaker.say(f"Bismillah, Let's read the pdf {text}") # pdf audio will start after the following commands for i in range(5, 0, -1): sys.stdout.write(str(i)+' ') sys.stdout.flush() time.sleep(1) speaker.runAndWait() # this line will read existing pdf only
修改后可运行代码
import pyttsx3 as audio_converter import PyPDF2 # version 1.26.0 import time import sys book = open("OOP.pdf", "rb") pdfreader = PyPDF2.PdfFileReader(book) pages = pdfreader.numPages # 获取PDF总页数 print(f'PDF名称:"Object Oriented Programing (OOP)\n总页数:{pages}"') speaker = audio_converter.init() # 初始化语音转换引擎 page = pdfreader.getPage(7) # 读取第8页(索引从0开始计数) text = page.extractText() # 执行10到0的倒计时,同步播报每个数字 for i in range(10, -1, -1): sys.stdout.write(str(i)+' ') sys.stdout.flush() # 播报当前倒计时数字 speaker.say(str(i)) speaker.runAndWait() # 立即处理当前语音请求,避免队列堆积 time.sleep(1) # 倒计时结束后开始朗读PDF内容 speaker.say(f"Bismillah, Let's read the pdf {text}") speaker.runAndWait() book.close() # 关闭PDF文件,释放资源
问题原因与修改说明
报错原因:
- 原代码的
range(5, 0, -1)仅循环5到1,无法实现10到0的需求;直接添加speaker.say(str(i))后未调用speaker.runAndWait(),pyttsx3的语音请求会堆积在队列中,time.sleep的阻塞会导致引擎无法及时处理请求,引发异常。 - 原代码将PDF朗读请求放在倒计时之前,会导致倒计时未完成就开始朗读PDF,不符合需求逻辑。
- 原代码的
核心修改点:
- 调整循环范围为
range(10, -1, -1),确保覆盖10到0的所有数字。 - 在每次播报倒计时数字后调用
speaker.runAndWait(),让语音引擎立即处理当前播报请求,避免队列堆积和顺序混乱。 - 将PDF朗读的语音请求移到倒计时循环之后,保证倒计时完成后再开始朗读PDF。
- 添加
book.close()关闭文件,避免资源泄漏。
- 调整循环范围为
内容的提问来源于stack exchange,提问作者Jabed Khan
相关产品推荐
相关产品推荐

