# LiveKit server connection # Local TEST server (autostarted). Switch this URL to the remote # LiveKit later; then: systemctl disable --now livekit-server LIVEKIT_URL=ws://127.0.0.1:7880 LIVEKIT_API_KEY=APIKey_xxx LIVEKIT_API_SECRET=APIsecret_xxx # Room / naming LIVEKIT_ROOM=cameras PARTICIPANT_PREFIX=cam # Streams # "all" = every discovered camera, "1,3,5" or "0-19" = subset CAMERAS=all VIDEO_WIDTH=640 VIDEO_HEIGHT=360 VIDEO_FPS=30 VIDEO_MIN_FPS=5 VIDEO_BITRATE=800000 VIDEO_CODEC=h264 VIDEO_ENCODER=vaapi LIBVA_DRM_DEVICE=/dev/dri/renderD129 LIBVA_DRIVER_NAME=iHD # Audio AUDIO_SAMPLE_RATE=16000 AUDIO_CHANNELS=1 # Audio cleanup (speechbrain) # mode: auto (default: enhanced if the model is cached, otherwise passthrough) # force (always enhance), off (always passthrough) ENHANCE_MODE=auto # speechbrain model repo (must be 16 kHz; metricGAN-plus runs ~20-40ms/frame on CPU) ENHANCE_MODEL=speechbrain/metricgan-plus-voicebank # model window vs publish hop: 1 s context, 200 ms emit ENHANCE_CHUNK_S=1.0 ENHANCE_HOP_S=0.2 # C920 stereo Delay-and-Sum (SpeechBrain GCC-PHAT) before MetricGAN # auto (default): beamform if speechbrain loads, else average channels # force: require DelaySum_Beamformer, off: average L/R BEAMFORM_MODE=auto # One BLAS/Torch thread per worker (20 workers vs 28 cores) TORCH_NUM_THREADS=1 # Recompute GCC-PHAT TDOA every N hops (5 * 200 ms = 1 s) BEAMFORM_TDOA_EVERY=5 # Misc PUBLISH_TIMEOUT_S=60 LOG_LEVEL=INFO # Headless display wall (run_displays.py / livekit-displays.service) # 3 DRM roles: 20-cam grid, designated speaker camera, screenshare STUB DISPLAY_COUNT=3 DISPLAY_ROLES=grid,speaker,screenshare # Empty = auto (connected heads first, prefer Arc HDMI-A-*) DISPLAY_CONNECTORS= DISPLAY_IDENTITY=display-wall # Speaker camera pane: cam-NN or "active" DISPLAY_SPEAKER_CAMERA=cam-01 DISPLAY_GRID_COLS=5 DISPLAY_GRID_ROWS=4 DISPLAY_GRID_WIDTH=1920 DISPLAY_GRID_HEIGHT=1080 DISPLAY_GRID_FPS=30 # Screen share is a stub until production LiveKit is online. LIVEKIT_PUBLIC_URL=