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

使用pyttsx3与speech_recognition时Python出现段错误如何解决?

解决pyttsx3与speech_recognition结合时的Segmentation fault错误

问题描述

运行结合pyttsx3和speech_recognition库的Python脚本时触发“Segmentation fault (core dumped)”错误,简化代码如下:

import time
import pyttsx3
import speech_recognition as sr

recognizer = sr.Recognizer()
engine = pyttsx3.init()

def speke(text):
    engine.say("")
    engine.say(text)
    engine.runAndWait()

def dot_s():
    for i in range(4):
        time.sleep(0.5)
        print(".", end="", flush=True)
    print("")

if __name__ == "__main__":
    speke("Initialize Jarvis......")
    while True:
        try:
            with sr.Microphone() as source:
                print("\nListening", end="", flush=True)
                dot_s()
                audio = recognizer.listen(source, timeout=2, phrase_time_limit=2)
            print("Recognizing", end="", flush=True)
            dot_s()
            Word = recognizer.recognize_google(audio)
            if Word.lower() == "jarvis":
                speke("ya")
                with sr.Microphone() as source:
                    print("\nJarvis Activating", end="", flush=True)
                    dot_s()
                    audio = recognizer.listen(source)
                    print("Recognizing", end="", flush=True)
                    dot_s()
                    command = recognizer.recognize_google(audio)
                    processCommand(command)
        except Exception as x:
            print(f"Error : {x}")

解决方案

1. 将语音播报放入独立线程

pyttsx3的runAndWait()是阻塞操作,与speech_recognition的麦克风监听阻塞逻辑冲突,导致资源竞争引发段错误。修改speke函数,用线程异步执行语音播报:

import threading
# 保留原有导入代码...

def speke(text):
    def speak_task():
        engine.say(text)
        engine.runAndWait()
    threading.Thread(target=speak_task, daemon=True).start()

(注:移除原代码中多余的engine.say("")调用)

2. 复用麦克风实例

重复创建sr.Microphone()实例可能导致音频设备资源泄漏,全局初始化一个麦克风实例复用:

# 全局初始化麦克风
recognizer = sr.Recognizer()
engine = pyttsx3.init()
microphone = sr.Microphone()  # 新增全局麦克风实例

# 后续使用时替换为:
with microphone as source:
    # 监听逻辑...

3. 更新依赖库版本

旧版本的pyttsx3或speech_recognition可能存在兼容性bug,执行更新命令:

pip install --upgrade pyttsx3 speechrecognition

4. 检查系统音频设备权限

确保当前用户拥有音频设备访问权限:

  • Linux系统:检查用户是否在audio组,执行groups查看;若不在,执行sudo usermod -aG audio $USER,然后重新登录。
  • Windows/macOS:在系统设置中确认麦克风和音频输出权限已授予该Python程序。

5. 替换pyttsx3为其他TTS引擎

若pyttsx3与系统音频环境兼容性差,可改用gTTS(基于Google在线语音合成,需联网):
安装依赖:

pip install gTTS playsound

修改speke函数:

from gtts import gTTS
from playsound import playsound
import os

def speke(text):
    tts = gTTS(text=text, lang='en')
    temp_file = "temp_tts.mp3"
    tts.save(temp_file)
    playsound(temp_file)
    os.remove(temp_file)

内容的提问来源于stack exchange,提问作者Sandip Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:41:17