口罩检测代码调用pyttsx3后内核崩溃求助及工具推荐
问题分析与修复方案
内核崩溃原因
你的代码核心问题在于每次检测到未戴口罩时重复初始化pyttsx3引擎,视频循环每秒会处理数十帧,频繁创建引擎会导致系统资源耗尽,直接引发内核崩溃。另外代码里还有几处细节错误:
engine.endLoop()是无效方法,pyttsx3不存在这个接口,调用会抛出异常- 视频捕获对象命名为
vide,最后却调用cap.release(),导致资源无法正常释放 - 未做语音提示防抖,每帧检测到未戴口罩都会触发语音,短时间内大量语音请求会压垮进程
修复后的代码
import cv2 import numpy as np from keras.models import load_model import pyttsx3 import time def main_function(): # 仅初始化一次pyttsx3引擎 engine = pyttsx3.init() voices = engine.getProperty('voices') engine.setProperty('rate', 210) engine.setProperty('voice', voices[7].id) # 加载模型与分类器 model1 = load_model('/Users/draculalemon/Documents/macbook file/all project /deepLearning/mask_file.h5') face_cascade = cv2.CascadeClassifier('/Users/draculalemon/Documents/haarcascade_frontalface_default.xml') vide = cv2.VideoCapture(0) # 语音提示冷却时间(避免频繁触发) last_alert_time = 0 alert_cooldown = 3 # 3秒内只提示一次 while True: _, frame = vide.read() video_face = face_cascade.detectMultiScale(frame, 1.8, 5) # 绘制人脸框 for (x, y, w, h) in video_face: cv2.rectangle(frame, (x, y), (x+w, y+h), (255,255,102), 3) # 人脸检测提示 try: np.argmax(video_face) cv2.putText(frame, "FACE DETECTED", (20,100), cv2.FONT_HERSHEY_SIMPLEX, 2, (124,252,0), 4) except ValueError: pass # 口罩检测预测 imgr1 = cv2.resize(frame, (224,224)) imgrgb1 = cv2.cvtColor(imgr1, cv2.COLOR_BGR2RGB) final_format1 = np.array([imgrgb1]).astype('float64')/255.0 predd = model1.predict(final_format1, verbose=0) # 关闭预测日志输出 index = np.argmax(predd[0]) label_name = ['MASK ON','MASK OFF'] labels = label_name[index] if labels == "MASK ON": cv2.putText(frame, f'{labels}', (20,50), cv2.FONT_HERSHEY_SIMPLEX, 3, (124,252,0), 4) else: cv2.putText(frame, f'{labels}', (20,50), cv2.FONT_HERSHEY_SIMPLEX, 3, (1,1,255), 4) # 检查冷却时间,避免频繁提示 current_time = time.time() if current_time - last_alert_time >= alert_cooldown: try: engine.say('Please bring your hand near to sanitizer machine') engine.runAndWait() engine.stop() last_alert_time = current_time except Exception as e: print(f"语音提示出错: {e}") cv2.imshow('imgg', frame) if cv2.waitKey(1) & 0XFF == ord('d'): break # 释放资源 vide.release() cv2.destroyAllWindows() if __name__ == "__main__": main_function()
关键修复点说明
- 将pyttsx3引擎初始化移到循环外,全程仅创建一次实例
- 添加语音提示冷却机制,避免短时间内重复触发
- 修复视频捕获对象的释放错误,改为
vide.release() - 关闭模型预测的日志输出(
verbose=0),减少控制台冗余输出 - 移除无效的
engine.endLoop()调用
Python实时文本转语音工具推荐
- pyttsx3:本地运行、无需联网、延迟极低,适合实时场景,优化后可稳定使用
- Coqui TTS:开源本地TTS框架,支持自定义语音模型,离线实时生成,适合需要定制化的场景
- 系统原生TTS:Windows用
pywin32调用SAPI,macOS用NSSpeechSynthesizer,完全本地,延迟最低 - gTTS:谷歌文本转语音API,声音自然度高,但需要联网,实时性稍弱
- ElevenLabs:AI生成语音,音色接近真人,支持实时生成,但需要API密钥且依赖网络
内容的提问来源于stack exchange,提问作者abhishek chakraborty
相关产品推荐
相关产品推荐

