streamware

πŸ—οΈ System Architecture

StreamWare system design and data flow.

← Back to Documentation


High-Level Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         STREAMWARE                                  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚   RTSP       β”‚    β”‚  FastCapture β”‚    β”‚   Frame      β”‚           β”‚
β”‚  β”‚   Camera     │───▢│  (OpenCV)    │───▢│   Queue      β”‚           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β”‚                                                 β”‚                   β”‚
β”‚                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚                      β”‚                          β”‚              β”‚    β”‚
β”‚                      β–Ό                          β–Ό              β”‚    β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”‚    β”‚
β”‚              β”‚ DSL Analysis β”‚          β”‚ LLM Analysis β”‚        β”‚    β”‚
β”‚              β”‚  (OpenCV)    β”‚          β”‚  (Ollama)    β”‚        β”‚    β”‚
β”‚              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚    β”‚
β”‚                      β”‚                          β”‚              β”‚    β”‚
β”‚                      β–Ό                          β–Ό              β”‚    β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”‚    β”‚
β”‚              β”‚  WebSocket   β”‚          β”‚   Response   β”‚        β”‚    β”‚
β”‚              β”‚   Server     β”‚          β”‚   Filter     β”‚        β”‚    β”‚
β”‚              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚    β”‚
β”‚                      β”‚                          β”‚              β”‚    β”‚
β”‚                      β–Ό                          β–Ό              β”‚    β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”‚    β”‚
β”‚              β”‚   Browser    β”‚          β”‚  TTS/Webhook β”‚        β”‚    β”‚
β”‚              β”‚   Viewer     β”‚          β”‚   Output     β”‚        β”‚    β”‚
β”‚              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚    β”‚
β”‚                                                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Multiprocessing Architecture

When --realtime is enabled:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     MAIN PROCESS (PID: parent)  β”‚    β”‚   DSL STREAMER (PID: child)     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                 β”‚    β”‚                                 β”‚
β”‚  /dev/shm/streamware/           β”‚    β”‚  /dev/shm/streamware_dsl/       β”‚
β”‚                                 β”‚    β”‚                                 β”‚
β”‚  FastCapture (0.5 FPS)          β”‚    β”‚  FastCapture (5-20 FPS)         β”‚
β”‚      β”‚                          β”‚    β”‚      β”‚                          β”‚
β”‚      β–Ό                          β”‚    β”‚      β–Ό                          β”‚
β”‚  LLM Analysis                   β”‚    β”‚  DSL Analysis (~10ms)           β”‚
β”‚      β”‚                          β”‚    β”‚      β”‚                          β”‚
β”‚      β–Ό                          β”‚    β”‚      β–Ό                          β”‚
β”‚  Response Filter                β”‚    β”‚  WebSocket Server               β”‚
β”‚      β”‚                          β”‚    β”‚      β”‚                          β”‚
β”‚      β–Ό                          β”‚    β”‚      β–Ό                          β”‚
β”‚  TTS / Webhook                  β”‚    β”‚  Browser :8766                  β”‚
β”‚                                 β”‚    β”‚                                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚                                       β”‚
           └───────── Completely Isolated β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Component Details

FastCapture (fast_capture.py)

FastCapture(
    rtsp_url="rtsp://...",
    fps=5.0,
    buffer_size=5,
    output_dir="/dev/shm/streamware"
)

FrameDiffAnalyzer (frame_diff_dsl.py)

analyzer = FrameDiffAnalyzer(
    motion_threshold=25,
    min_blob_area=500,
    filter_static=True
)
delta = analyzer.analyze(frame_path)

DSL Streamer Process (dsl_streamer_process.py)

from dsl_streamer_process import start_dsl_streamer
process = start_dsl_streamer(rtsp_url, fps=10)

RealtimeDSLServer (realtime_dsl_server.py)

AsyncLLM (async_llm.py)

Data Flow

DSL-Only Mode

Camera β†’ FastCapture β†’ DSL Analysis β†’ WebSocket β†’ Browser
                           β”‚
                           └─→ HTML Export

Real-time + LLM Mode

                    β”Œβ”€β†’ DSL Process β†’ WebSocket β†’ Browser
Camera β†’ FastCapture─
                    └─→ Main Process β†’ LLM β†’ Filter β†’ TTS

File Structure

streamware/
β”œβ”€β”€ components/
β”‚   └── live_narrator.py      # Main orchestrator
β”œβ”€β”€ fast_capture.py           # RTSP capture
β”œβ”€β”€ frame_diff_dsl.py         # DSL analysis
β”œβ”€β”€ dsl_streamer_process.py   # Separate process
β”œβ”€β”€ realtime_dsl_server.py    # WebSocket server
β”œβ”€β”€ async_llm.py              # Async LLM
β”œβ”€β”€ dsl_timing_logger.py      # Performance logs
β”œβ”€β”€ response_filter.py        # LLM filtering
β”œβ”€β”€ image_optimizer.py        # Image preprocessing
└── tts.py                    # Text-to-speech

Threading Model

Component Thread/Process Notes
FastCapture Background thread Continuous capture
DSL Analysis Main thread Fast (~10ms)
DSL Streamer Separate process Isolated
LLM Inference ThreadPool Non-blocking
WebSocket Asyncio Event loop
TTS Background thread Non-blocking

Related: