- diarizer.py (ECAPA-TDNN + clustering incrémental) repris tel quel de main
- Hooks dans le pipeline : colonne speaker, identification par segment dans
un thread, locuteur dans l'interface (étiquettes colorées) et les exports
- Pause/reprise : bouton ⏸, le client coupe l'envoi, le serveur clôt le
segment en cours
- Case « Locuteurs » pour désactiver la diarisation par réunion
- DIARIZATION=on par défaut dans les compose, PyTorch CPU dans l'image
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
- Page de connexion, session 7 jours par cookie HMAC signé (secret persisté)
- Protection de l'API (401) et du WebSocket (code 4401), / redirige vers /login
- Bouton de déconnexion, redirection automatique à l'expiration de session
- Identifiants configurables via LIVEFLOW_USER / LIVEFLOW_PASSWORD
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
- Workflow build-image.yml : construit et pousse ghcr.io/r0m1k3/liveflow à
chaque modification de app/
- Compose Unraid : image préconstruite au lieu du build local, service
watchtower scopé par label pour redéployer l'app automatiquement
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
Un conteneur de moins. Le HTTPS reste nécessaire pour l'accès micro
(getUserMedia) depuis un autre appareil : certificat auto-signé généré au
démarrage pour LIVEFLOW_HOST, servi par uvicorn.
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe