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

Python3.9下pyenchant与SAPI.SpVoice因libstdc++-6.dll冲突解决方案问询

解决方案

以下两种方案均不需要大幅修改现有业务代码,可快速解决DLL版本冲突问题:

方案1:修改pyenchant依赖的DLL名称(一劳永逸,业务代码零修改)

核心思路是将pyenchant依赖的libstdc++-6.dll改名,同时修改pyenchant底层库的导入表,让两个组件分别加载独立的DLL文件:

  • 找到pyenchant安装目录(虚拟环境下通常为venv/Lib/site-packages/enchant/),将目录下自带的libstdc++-6.dll重命名为libstdc++_enchant.dll
  • 用CFF Explorer或Dependency Walker等工具打开同目录下的_enchant.pyd(或libenchant-2.dll,因版本不同可能有差异),在导入表中找到对libstdc++-6.dll的依赖项,将依赖名称修改为libstdc++_enchant.dll后保存
  • 直接运行原有业务代码即可,无需做任何其他修改

方案2:子进程封装语音调用(无需修改本地库文件,仅需调整少量封装代码)

核心思路是将SAPI语音逻辑剥离到独立子进程运行,和主进程的pyenchant环境完全隔离,上层调用逻辑保持不变:

  1. 新建独立的语音执行脚本speak_worker.py,代码如下:
import sys
import win32com.client
speaker = win32com.client.Dispatch("SAPI.SpVoice")

def speak(text):
    voices = speaker.GetVoices("Language = 409", 'Gender = Male')
    for voice in voices:
        desc = voice.GetDescription()
        if "Eric" in desc:
            speaker.Voice = voice
            speaker.Speak(text)
            break

if __name__ == "__main__":
    text = sys.argv[1]
    speak(text)
  1. 将原有代码中的speaktest函数替换为以下实现:
import subprocess
import sys

def speaktest(text):
    subprocess.run(
        [sys.executable, "speak_worker.py", text],
        capture_output=True,
        text=True
    )
  1. 原有上层调用逻辑完全不需要改动,直接运行即可。

内容的提问来源于stack exchange,提问作者Megan Caithlyn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:54:02