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

Python 3.9环境下同时使用bleak与pyttsx3触发OSError问题咨询

错误原因

该报错仅出现在Windows平台,是COM组件的线程模式冲突导致,具体逻辑如下:

  • bleak在Windows环境下依赖WinRT接口实现蓝牙低功耗通信,模块导入时会自动将当前线程的COM模式设置为多线程单元(MTA)
  • pyttsx3底层调用Windows SAPI语音接口,pyttsx3.init()执行时要求当前线程必须为*单线程单元(STA)*模式
  • Windows COM规则规定线程模式一旦设置就无法修改,因此先导入bleak再初始化pyttsx3时就会触发该报错
解决方法

方案1:调整初始化顺序(最简单适配方案)

优先完成pyttsx3的初始化操作,再导入bleak,bleak的WinRT实现兼容STA线程模式,不会触发冲突。
示例代码:

import pyttsx3
# 先初始化pyttsx3
engine = pyttsx3.init()
# 再导入并使用bleak
import bleak

# 后续业务逻辑

方案2:将pyttsx3逻辑放在独立STA线程中运行

如果业务逻辑要求必须先加载bleak,可以将pyttsx3的所有操作放到单独指定为STA模式的子线程中运行,避免线程模式冲突。
该方案需要先安装pywin32依赖,执行pip install pywin32即可
示例代码:

import threading
import pythoncom
import pyttsx3
import bleak

def tts_task():
    # 子线程初始化COM为STA模式
    pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)
    engine = pyttsx3.init()
    # 执行语音相关操作
    engine.say("测试语音")
    engine.runAndWait()
    # 释放COM资源
    pythoncom.CoUninitialize()

# 主线程可正常使用bleak
# 启动独立线程处理语音
tts_thread = threading.Thread(target=tts_task)
tts_thread.start()
tts_thread.join()

方案3:使用多进程隔离运行

如果上述方案都不满足需求,可以将bleak和pyttsx3的逻辑分别放在两个独立进程中运行,进程之间的COM环境完全隔离,不会出现模式冲突。


内容的提问来源于stack exchange,提问作者Val Gretchev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:15:04