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

pyttsx3批量转换大体积txt为mp3时长期卡死问题如何解决

问题原因
  • 核心逻辑错误:转存mp3的逻辑被写在了逐行读取的循环内部,每读一行就会把当前已拼接的所有内容重新转一次mp3,还重复覆盖同一个文件。假设一本小说有10万行,就要执行10万次转码操作,绝大部分都是完全无用的重复计算,直接占满系统资源导致卡死。
  • 大文本处理缺陷:超大体积txt直接全部读取拼接成单条超长字符串喂给pyttsx3,框架本身处理超长文本时容易出现缓冲区阻塞、内存溢出问题。
  • 无状态反馈与异常捕获:转码过程没有任何进度提示,也没有错误捕获逻辑,出现问题时只会显示程序无响应,无法定位具体故障点。
解决方法
  1. 把转存mp3的逻辑移出逐行读取的循环,等整个txt文件全部读取完成后,再执行一次转码操作即可。
  2. 单个文件处理完成后释放TTS引擎资源,避免长时间运行积累缓存占用。
  3. 加入异常捕获和进度打印逻辑,方便掌握处理进度、定位故障。
  4. 几百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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:06:04