How Visual and Audio Alerts Work in the Multi-Cam Face Tracker
The Multi-Cam Face Tracker coordinates notifications through a centralized AlertSystem class that uses pygame-mixer for audio playback, OpenCV for screenshot capture, and an optional Telegram integration for remote visual alerts.
The aarambhdevhub/multi-cam-face-tracker repository implements a comprehensive alert pipeline that notifies users when faces are detected across multiple camera feeds. This system separates concerns between audio notifications, visual evidence capture, and remote messaging through a dedicated alert manager. Understanding how visual and audio alerts are handled reveals the architecture behind real-time security notifications in modern computer vision applications.
AlertSystem Architecture
At the heart of the notification pipeline lies the AlertSystem class defined in core/alert_system.py. This singleton-style manager orchestrates all alert modalities through a single entry point: trigger_alert(). When a face is detected, the main application loop invokes this method with the camera ID, face metadata, confidence score, and the raw video frame.
The system uses an AlertEvent dataclass to encapsulate detection metadata, including timestamps, screenshot paths, and recognition confidence. This event object travels through the pipeline, enabling the UI to display historical alerts and ensuring Telegram messages contain complete context.
Audio Alert Implementation
Audio notifications rely on pygame-mixer to stream sound files asynchronously without blocking the video processing pipeline.
The private method _play_alert_sound() handles audio playback:
- It validates that the file specified in
app.alert_soundexists before attempting playback - Loads the audio via
mixer.music.load()and plays viamixer.music.play() - Logs errors gracefully without stopping the face detection pipeline
This non-blocking approach ensures that a corrupted sound file or missing audio hardware does not interrupt real-time video analysis.
Visual Alert Mechanisms
Visual alerts serve dual purposes: local evidence preservation and remote notification delivery.
Local Screenshot Capture
When screenshots are enabled, trigger_alert() delegates to _capture_screenshot() to persist frames to disk:
- The method writes images using OpenCV’s
cv2.imwrite()to the directory specified byapp.screenshot_dir - Each screenshot is saved as a
.jpgfile with a unique timestamp - The file path is attached to the
AlertEventinstance for later retrieval by the UI or Telegram dispatcher
Telegram Integration
For remote monitoring, the system formats detection data into markdown-style messages containing the person’s name, age, gender, camera source, confidence percentage, and timestamp. The AlertSystem forwards both this text and the screenshot file path to TelegramManager via the send_alert() method defined in core/telegram_manager.py.
This integration is gated by the config.telegram.enabled flag, allowing deployments to operate entirely offline if desired.
UI Integration and Runtime Control
The AlertPanel class in ui/alert_panel.py provides a Qt-based interface for monitoring alert history and toggling notification preferences in real time.
Users can interact with the alert system through these public methods:
get_recent_alerts(limit): Retrieves the latestAlertEventinstances from the internalalert_historylist for display in the panel’s list widgetenable_alerts(boolean): Toggles thealert_enabledflag to mute or unmute audio notificationsenable_screenshots(boolean): Controls thescreenshot_enabledflag without requiring an application restart
The UI formats each entry with human-readable timestamps, camera names, and confidence percentages, allowing security personnel to scan recent detections quickly.
Configuration-Driven Setup
All alert behaviors are governed by config/config.yaml, which supplies:
alert_sound: File system path to the audio cue (e.g.,.wavor.mp3)screenshot_dir: Destination folder for captured frames- Telegram credentials: Bot token and chat ID for remote notifications
This declarative approach allows operators to customize alert sounds and storage locations without modifying source code.
Code Examples
Triggering an Alert from Application Code
# frame is a numpy.ndarray from OpenCV VideoCapture
# face is a Face dataclass with age, gender, and name attributes
alert_system.trigger_alert(
camera_id=1,
camera_name="Front Door",
face_name="John Doe",
face=face,
confidence=0.93,
frame=frame,
)
This invocation creates an AlertEvent, writes a screenshot if enabled, plays the audio cue, and dispatches a Telegram message.
Enabling and Disabling Alerts at Runtime
# Silence audio notifications during maintenance
alert_system.enable_alerts(False)
# Re-enable automatic screenshot capture
alert_system.enable_screenshots(True)
The AlertPanel invokes these same methods when users check or uncheck the corresponding UI checkboxes.
Displaying Recent Alerts
# Fetch the 10 newest detection events
alerts = alert_system.get_recent_alerts(10)
for ev in alerts:
formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(ev.timestamp))
print(f"{formatted_time} – {ev.face_name} @ {ev.camera_name} (conf: {ev.confidence:.2%})")
Each entry surfaces the timestamp, recognized identity, camera source, and model confidence score.
Summary
- The
AlertSystemclass incore/alert_system.pyserves as the single coordination point for all notifications, preventing fragmentation across the codebase. - Audio alerts use pygame-mixer with defensive file-existence checks that log errors without crashing the video pipeline.
- Visual alerts combine OpenCV screenshot capture (
cv2.imwrite()) with optional Telegram delivery viaTelegramManager.send_alert(). - The
AlertPanelinui/alert_panel.pyenables runtime toggling of audio and screenshot features throughenable_alerts()andenable_screenshots(). - Configuration in
config/config.yamlcontrols file paths and remote notification credentials, keeping deployment-specific settings out of the source code.
Frequently Asked Questions
How do I change the alert sound file?
Modify the alert_sound path in config/config.yaml to point to your preferred audio file. The AlertSystem._play_alert_sound() method validates the file existence before calling mixer.music.load(), ensuring the system degrades gracefully if the path is invalid.
Can I disable audio alerts while keeping screenshot capture active?
Yes. Call alert_system.enable_alerts(False) to mute audio while leaving enable_screenshots(True) active. These flags operate independently, allowing you to mix notification modalities based on your monitoring requirements.
What information is included in the Telegram alert message?
According to the implementation in core/alert_system.py, Telegram messages include the detected person’s name, age, gender, source camera name, confidence score, and timestamp. If screenshot capture is enabled, the image file is attached to the message via TelegramManager.send_alert().
How does the AlertPanel retrieve historical detection events?
The AlertPanel queries alert_system.get_recent_alerts(n), which returns the last n entries from the internal alert_history list. Each entry is an AlertEvent dataclass containing the screenshot path, timestamp, and face metadata required to populate the UI list widget.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →