Commit Graph
38 Commits
Author SHA1 Message Date
Claude a903c45874 Merge de main : conflits résolus en faveur de cette branche
Cette branche intègre déjà les apports de main (diarisation ECAPA-TDNN,
pause/reprise, sélecteur de micro) tout en conservant ce que main avait
perdu : authentification, décodeurs audio vLLM (correctif des 400),
basculement automatique de micro, amplification des segments faibles,
filtre CJK, CI sans filtre de chemins.

https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 17:51:01 +00:00
Claude db73e8db02 Diarisation des locuteurs et pause/reprise (intégration des travaux de main)
- 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
2026-06-12 17:50:51 +00:00
Claude 21866ec334 Filtrage des interjections chinoises de Qwen3-ASR (嗯, 咳咳...)
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 17:42:33 +00:00
Michael 124a2089af docs: mise a jour du progress log dans task.md 2026-06-12 16:56:20 +02:00
Michael 52fda48e5f feat: gestion de pause/reprise de reunion et correction du bug de sigles chinois (ASR francais par defaut) 2026-06-12 16:53:24 +02:00
Michael 6d1419492f fix: forcer le rechargement de app.js et style.css via cache-busting (?v=2) 2026-06-12 16:39:39 +02:00
Michael c06b490a0c feat: indicateur visuel de volume micro en temps réel et boîte de diagnostic des erreurs JS 2026-06-12 16:35:17 +02:00
Michael e59bdd1feb fix: sécuriser startRecording, stopRecording et utiliser la contrainte de micro ideal 2026-06-12 16:32:39 +02:00
Michael dd31090d3f fix: gestion des contextes non sécurisés, erreurs websocket et rechargement liste des réunions 2026-06-12 16:27:34 +02:00
Michael a343c90340 feat: configurer le nombre max de locuteurs via DIARIZATION_MAX_SPEAKERS (défaut 8) 2026-06-12 16:23:38 +02:00
Michael 8dbc657d7d fix: correction de la détection et du listing des micros au chargement 2026-06-12 16:21:13 +02:00
Michael a85051c4dd docs: ajout du fichier de suivi task.md 2026-06-12 16:19:09 +02:00
Michael d46ba02b39 fix: rafraîchir les étiquettes des micros après autorisation getUserMedia 2026-06-12 16:18:08 +02:00
Michael 86f94fc22c feat: sélecteur de microphone dans l'interface
- Select dropdown peuplé via enumerateDevices() au chargement
- Mise à jour automatique quand un périphérique est branché/débranché (devicechange)
- Le deviceId sélectionné est passé à getUserMedia() via exact constraint
- Option 'Micro par défaut' pour le comportement d'origine
2026-06-12 16:15:51 +02:00
Michael 284011428a feat: diarisation des locuteurs en temps réel (ECAPA-TDNN + clustering incrémental)
- Nouveau module diarizer.py : EmbeddingModel (SpeechBrain ECAPA-TDNN) + SpeakerDiarizer par session
- Backend : chargement modèle au lifespan, migration DB (colonne speaker), worker enrichi, exports avec locuteur
- Frontend : badges locuteurs colorés (8 couleurs), toggle activation, copie avec [Locuteur X]
- Config : DIARIZATION=on/off, DIARIZATION_THRESHOLD=0.70, PyTorch CPU-only dans Dockerfile
- Rétrocompatible : désactivé par défaut (DIARIZATION=off)
2026-06-12 16:03:43 +02:00
Michael ca936255e8 chore: update .gitignore to exclude non-project dirs 2026-06-12 15:49:58 +02:00
Claude 9b083579e1 Recherche automatique d'un micro fonctionnel pendant l'enregistrement
Si le micro actif reste muet 5 s, l'app bascule à chaud sur les autres
micros un par un jusqu'à en trouver un qui capte du son, puis le mémorise.
Le sélecteur permet aussi de changer de micro en cours d'enregistrement.

https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 13:22:42 +00:00
Claude f92e6dd51f Adaptation aux micros instables (Bluetooth) sans changer la config du poste
- Sélecteur de micro intégré à l'interface (persisté, deviceId exact)
- Amplification serveur des segments trop faibles (mode mains-libres BT)
- Alerte visible si aucun son n'est capté pendant 5 s
- Niveau crête de chaque segment dans les logs
- Cache-Control: no-cache sur les fichiers statiques (fini le vieux JS en cache)

https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 13:12:31 +00:00
Claude b802a3c95f Authentification : login/mot de passe (admin/admin par défaut)
- 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
2026-06-12 12:43:39 +00:00
Claude c9b4094049 Correction du crash en boucle de l'ASR : command en liste à élément unique
Avec entrypoint bash -c, une command en chaîne YAML est découpée en
plusieurs arguments et bash n'exécutait que le premier echo (exit 0,
restart loop).

https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 12:37:41 +00:00
Claude 27c63566df ASR : marqueurs de log au démarrage pour vérifier l'installation des décodeurs
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 12:35:23 +00:00
Claude a8a8d84923 ASR : installation des décodeurs audio (soundfile, librosa) au démarrage de vLLM
L'image officielle vllm/vllm-openai ne contient pas les extras audio, ce qui
faisait échouer /v1/audio/transcriptions en 400 'Invalid or unsupported
audio file'.

https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 11:36:46 +00:00
Claude b32119d5c0 Diagnostic : vumètre micro dans l'interface et logs serveur des segments/transcriptions
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 11:10:47 +00:00
Claude 480a380dde Micro : nouvel essai avec contrainte minimale si getUserMedia échoue
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 11:03:31 +00:00
Claude 09c76508d7 CI : construire l'image à chaque push (retrait du filtre paths)
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 10:58:02 +00:00
Claude 80176e9f82 ASR : repli automatique sans le paramètre language refusé par certains moteurs
vLLM avec Qwen3-ASR peut répondre 400 quand 'language' est fourni. L'app
retente alors en détection automatique, et les erreurs ASR remontent
désormais avec le corps de la réponse pour faciliter le diagnostic.
Ajout du favicon (404 dans la console).

https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 09:33:40 +00:00
Claude b8bef6327f Retrait de Watchtower : mise à jour via docker compose pull
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 09:23:15 +00:00
Claude de817e189e Mises à jour automatiques : image publiée sur ghcr.io via GitHub Actions + Watchtower
- 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
2026-06-12 09:04:07 +00:00
Claude 16f41d6303 Option LIVEFLOW_TLS=off pour servir en HTTP derrière un reverse proxy existant
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 09:01:26 +00:00
Claude 71ee13f845 Frontend : message d'erreur micro détaillé selon la cause (NotReadableError, etc.)
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 09:00:15 +00:00
Claude 8ba9cfb234 ASR : limite --max-model-len à 8192 pour tenir dans le cache KV du GPU
Par défaut vLLM réserve le contexte max du modèle (65k tokens = 7 Go de KV
cache), ce qui dépasse la mémoire restante après chargement des poids sur
les GPU modestes. 8192 tokens sont très largement suffisants pour des
segments audio de 25 s.

https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-12 07:06:10 +00:00
Claude 3c83b67538 Suppression de Caddy : l'app sert directement le HTTPS auto-signé
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
2026-06-11 22:52:41 +00:00
Claude 0101452bc1 Correction ERR_SSL_PROTOCOL_ERROR : certificat généré pour l'adresse du serveur
Un site catch-all :443 avec tls internal ne génère aucun certificat, ce qui
fait échouer la négociation TLS. Le Caddyfile prend désormais l'adresse via
LIVEFLOW_HOST (+ default_sni pour les connexions par IP, sans SNI).

https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-11 22:42:21 +00:00
Claude b986b23693 Unraid : suppression du port HTTP 8088 (conflit fréquent, redirection inutile)
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-11 22:37:18 +00:00
Claude a2f7398076 Ajout du docker-compose dédié Unraid
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-11 21:54:31 +00:00
Claude a8517c3597 Implémentation complète de LiveFlow (proposition 2, moteur Qwen3-ASR)
- docker-compose : Caddy (HTTPS local) + app FastAPI + Qwen3-ASR via vLLM (GPU)
- Backend : WebSocket audio, segmentation VAD (WebRTC), appel ASR compatible
  OpenAI, stockage SQLite, exports TXT/MD/SRT/JSON
- Frontend : capture micro (AudioWorklet, rééchantillonnage 16 kHz),
  transcription live, historique des réunions, copie et téléchargement
- README : démarrage, prérequis GPU, changement de moteur ASR

https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-11 16:28:17 +00:00
Claude 4fa5964988 Ajout du comparatif 2026 des moteurs ASR locaux (Qwen3-ASR, Parakeet, Whisper...)
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-11 16:20:34 +00:00
Claude b1551fe5f8 Ajout des 3 propositions d'architecture pour LiveFlow
https://claude.ai/code/session_01YHMp3EKzr4s6o8w1ygxuUe
2026-06-11 16:17:17 +00:00