Files
root 95bb7c50ee feat: point the fleet at wss LiveKit room uwh-telhai
Publish and subscribe over wss://livekit.uni-wh.de:7800 and refuse
cleartext ws://. Conference room is uwh-telhai. Includes the uncommitted
encoded H.264 publish path, Rally hairpin, and KMS wall overlay.
2026-10-11 00:48:50 +00:00

125 lines
5.0 KiB
Bash

# LiveKit server connection
# Remote LiveKit. Local livekit-server.service is disabled.
# Signaling must be wss://. The client verifies the TLS cert (do not use ws://).
LIVEKIT_URL=wss://livekit.uni-wh.de:7800
LIVEKIT_API_KEY=APIKey_xxx
LIVEKIT_API_SECRET=APIsecret_xxx
# Room / naming
# Conference room. Publishers and the KMS wall must use this same name.
LIVEKIT_ROOM=uwh-telhai
PARTICIPANT_PREFIX=cam
# Published on local camera participants as LiveKit attributes tag/tags.
PARTICIPANT_TAGS=uwh
# Display wall: empty = show local cameras (filter OFF). Set to uwh to hide
# local tagged participants so remotes fill the wall instead.
DISPLAY_HIDE_TAGS=
# 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=1200000
# Rally 1080p encode (bps). Rollback if encode/gst dies: 12000000 then restart cameras.
VIDEO_RALLY_BITRATE=20000000
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, 100 ms emit
ENHANCE_CHUNK_S=1.0
ENHANCE_HOP_S=0.1
# MetricGAN mask: auto (OpenVINO CPU, Torch fallback) | openvino | torch
ENHANCE_INFER=auto
# 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 * hop)
BEAMFORM_TDOA_EVERY=5
# One MetricGAN process for all cameras (workers send hops over a unix socket).
# ENHANCE_DAEMON=0 reverts to per-worker model load (~10 GiB extra RAM).
ENHANCE_DAEMON=1
ENHANCE_SOCKET=/tmp/livekit-enhance.sock
# --- optional latency knobs (defaults keep current behavior) ---
# AUDIO_QUEUE_MS=60 # LiveKit AudioSource queue; unset = max(150, hop_ms+50)
# VIDEO_HOLD_S=0 # hold published video this many seconds; unset = match hop; 0 = no hold
# WORKER_SPLIT_EXECUTOR=1 # dedicated thread pools: ffmpeg reads vs enhance
# ENHANCE_SPEAKER_ONLY=1 # MetricGAN+beamform only on DISPLAY_SPEAKER_CAMERA (rally)
# AUDIO_GATE=1 # optional hop mute; off by default so two talkers both publish
# AUDIO_GATE_OPEN_DB=-28
# AUDIO_GATE_CLOSE_DB=-34
# AUDIO_GATE_HOLD_S=0.3
# DISPLAY_VIDEO_CAPACITY=1 # VideoStream ring; 0 = unbounded, 1 = latest frame
# DISPLAY_VIDEO_FORMAT=bgra # request BGRA from SDK (skip extra convert)
# DISPLAY_GST_QUEUE_BUFFERS=1
# DISPLAY_SPEAKER_PUSH=arrival # timer | arrival (push speaker pane on decode)
#
# Suggested A/B (wall, ~hop 50 ms, speaker-only enhance):
# ENHANCE_HOP_S=0.05 AUDIO_QUEUE_MS=60 WORKER_SPLIT_EXECUTOR=1
# ENHANCE_SPEAKER_ONLY=1 DISPLAY_VIDEO_CAPACITY=1 DISPLAY_VIDEO_FORMAT=bgra
# DISPLAY_GST_QUEUE_BUFFERS=1 DISPLAY_SPEAKER_PUSH=arrival
# Aggressive (no neural enhance, 20 ms hops):
# ENHANCE_MODE=off BEAMFORM_MODE=off ENHANCE_HOP_S=0.02 AUDIO_QUEUE_MS=40 VIDEO_HOLD_S=0
# 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 HDMI pane: LiveKit identity of the Logitech Rally (not a C920).
# The Rally is not on this host yet — pane shows a placeholder until `rally` joins.
DISPLAY_SPEAKER_CAMERA=rally
DISPLAY_GRID_COLS=5
DISPLAY_GRID_ROWS=4
DISPLAY_GRID_WIDTH=1920
DISPLAY_GRID_HEIGHT=1080
DISPLAY_GRID_FPS=30
# Yellow tile border when a participant raises a hand (MoveNet on the wall).
# DISPLAY_HAND_RAISE=0 to disable. Displays-only restart.
DISPLAY_HAND_RAISE=1
DISPLAY_HAND_RAISE_HZ=4
DISPLAY_HAND_RAISE_HOLD_S=1.0
# DISPLAY_HAND_RAISE_MODEL=thunder # thunder (256) or lightning (192); displays-only
# Green speaker chrome: LiveKit candidates, hop RMS picks louder vs two talkers.
# DISPLAY_SPEAK_MIN_DB=-40
# DISPLAY_SPEAK_RISE_DB=3
# DISPLAY_SPEAK_MARGIN_DB=6
# DISPLAY_SPEAK_HOLD_S=0.6
# DISPLAY_SPEAK_CORR=0.6 # hop xcorr; similar waveforms = bleed, keep louder
# DISPLAY_SPEAK_CONFIRM=2 # consecutive hops before a new seat greens
# Screen share is a stub until production LiveKit is online.
LIVEKIT_PUBLIC_URL=
# Person-aware background blur on C920 publish (OpenVINO CPU, not iGPU/Arc).
# Empty seats passthrough. Rally is not blurred. Rollback: PORTRAIT_BLUR=0 then
# cameras-only restart.
PORTRAIT_BLUR=1
# PORTRAIT_HZ=8
# PORTRAIT_BLUR_PX=7
# PORTRAIT_HOLD_S=0.8
# PORTRAIT_SHM_DIR=/run/livekit-cameras/portrait