使用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
相关产品推荐
相关产品推荐

