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

口罩检测代码调用pyttsx3后内核崩溃求助及工具推荐

问题分析与修复方案

内核崩溃原因

你的代码核心问题在于每次检测到未戴口罩时重复初始化pyttsx3引擎,视频循环每秒会处理数十帧,频繁创建引擎会导致系统资源耗尽,直接引发内核崩溃。另外代码里还有几处细节错误:

  1. engine.endLoop()是无效方法,pyttsx3不存在这个接口,调用会抛出异常
  2. 视频捕获对象命名为vide,最后却调用cap.release(),导致资源无法正常释放
  3. 未做语音提示防抖,每帧检测到未戴口罩都会触发语音,短时间内大量语音请求会压垮进程

修复后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:39:18