基于pyttsx3的PDF阅读器如何实现音频暂停、恢复及停止功能?
实现PDF阅读器的音频暂停/恢复/停止功能
原代码的问题在于speaker.runAndWait()是阻塞调用,一旦开始朗读就会执行到当前文本结束,无法实时响应暂停或停止指令。要实现随时控制的功能,需要通过线程分离朗读逻辑+全局状态变量+实时键盘监听来实现,具体方案如下:
修改后的完整代码
import pyttsx3 import PyPDF2 import keyboard import threading import time # 全局状态变量,控制朗读状态 is_paused = False is_stopped = False def read_pdf(): book = open(r"C:\Users\M E T R O\OneDrive\Desktop\self-motivational books\the_richest_man_in_babylon.pdf", "rb") pdfreader = PyPDF2.PdfReader(book) pages = len(pdfreader.pages) speaker = pyttsx3.init() speaker.setProperty("rate", 140) for i in range(4, pages): if is_stopped: break page = pdfreader.pages[i] text = page.extractText() # 将文本拆分为短句,提升状态响应灵敏度 sentences = text.split('. ') for sentence in sentences: if is_stopped: speaker.stop() book.close() return # 暂停时循环等待,直到恢复或停止 while is_paused: speaker.stop() time.sleep(0.1) if is_stopped: book.close() return speaker.say(sentence + '.') speaker.runAndWait() book.close() # 键盘事件处理函数 def toggle_pause(event): global is_paused is_paused = not is_paused def stop_reading(event): global is_stopped is_stopped = True # 绑定快捷键:空格=暂停/恢复,Q=停止 keyboard.on_press_key('space', toggle_pause) keyboard.on_press_key('q', stop_reading) # 启动朗读线程 reading_thread = threading.Thread(target=read_pdf) reading_thread.start() # 主线程保持运行,监听键盘事件 reading_thread.join()
关键逻辑说明
- 线程分离:把PDF朗读逻辑放到独立线程中,避免阻塞主线程的键盘监听
- 状态变量:用
is_paused和is_stopped两个全局变量标记当前状态,朗读过程中实时检查变量值 - 文本拆分:将每页文本拆分为短句朗读,确保每次朗读的内容片段足够短,让暂停/停止指令能及时响应
- 键盘监听:通过
keyboard模块绑定快捷键,按下空格切换暂停/恢复状态,按下Q直接终止朗读 - 资源清理:停止朗读时及时关闭PDF文件,释放资源
内容的提问来源于stack exchange,提问作者Chandler Bong
相关产品推荐
相关产品推荐

