pyttsx3批量转换大体积txt为mp3时长期卡死问题如何解决
问题原因
- 核心逻辑错误:转存mp3的逻辑被写在了逐行读取的循环内部,每读一行就会把当前已拼接的所有内容重新转一次mp3,还重复覆盖同一个文件。假设一本小说有10万行,就要执行10万次转码操作,绝大部分都是完全无用的重复计算,直接占满系统资源导致卡死。
- 大文本处理缺陷:超大体积txt直接全部读取拼接成单条超长字符串喂给pyttsx3,框架本身处理超长文本时容易出现缓冲区阻塞、内存溢出问题。
- 无状态反馈与异常捕获:转码过程没有任何进度提示,也没有错误捕获逻辑,出现问题时只会显示程序无响应,无法定位具体故障点。
解决方法
- 把转存mp3的逻辑移出逐行读取的循环,等整个txt文件全部读取完成后,再执行一次转码操作即可。
- 单个文件处理完成后释放TTS引擎资源,避免长时间运行积累缓存占用。
- 加入异常捕获和进度打印逻辑,方便掌握处理进度、定位故障。
- 几百MB级别的超大txt可以按固定长度(比如每5000字)切割成多个小段分别转码,最后合并mp3片段即可,避免单次处理文本过长导致阻塞。
修正后可运行代码
import os import glob import pyttsx3 def init_tts_engine(): """单独封装引擎初始化逻辑,避免长期运行积累缓存问题""" engine = pyttsx3.init() # 语速默认200为正常水平,原代码600过快可根据需求调整 engine.setProperty('rate', 300) # 音量设置范围0.0-1.0 engine.setProperty('volume', 1.0) # 音色设置,根据系统实际可用音色调整索引即可 voices = engine.getProperty('voices') engine.setProperty('voice', voices[1].id) return engine file_pattern = '*.txt' file_name_list = glob.glob(file_pattern) if not file_name_list: print("当前文件夹下未找到txt文件") exit() print(f"共找到{len(file_name_list)}个待转换txt文件") for index, target in enumerate(file_name_list, 1): print(f"正在处理第{index}个文件:{target}") string_to_parse = '' # 读取目标txt文件 try: with open(target, 'r', encoding='utf-8', errors='ignore') as text_file: string_to_parse = text_file.read() except Exception as e: print(f"读取文件{target}失败:{str(e)},已跳过该文件") continue if not string_to_parse.strip(): print(f"文件{target}内容为空,已跳过") continue # 初始化引擎并执行转码 engine = init_tts_engine() mp3_filename = target.replace('.txt', '.mp3') fullPath = os.path.join(os.getcwd(), mp3_filename) try: print(f"正在生成{mp3_filename},大文件请耐心等待...") engine.save_to_file(string_to_parse, fullPath) engine.runAndWait() print(f"{mp3_filename} 转码完成") except Exception as e: print(f"转码文件{target}失败:{str(e)}") finally: # 停止引擎释放资源 engine.stop() del engine print("所有文件处理完成")
内容的提问来源于stack exchange,提问作者starcat
相关产品推荐
相关产品推荐

