4.5 KiB
🎙️ LiveFlow
Transcription de réunions en direct, 100 % locale, dans Docker. Capture du micro depuis un navigateur (PC ou téléphone), transcription par Qwen3-ASR sur GPU NVIDIA, affichage du texte au fil de l'eau, historique et export (TXT, Markdown, SRT, JSON).
Architecture détaillée : voir ARCHITECTURE.md (proposition 2 retenue, sans reverse proxy : l'app sert directement le HTTPS).
Navigateur (micro, HTTPS/WebSocket)
→ app FastAPI (HTTPS auto-signé + VAD + segments + SQLite + interface web)
→ conteneur ASR Qwen3-ASR via vLLM (API compatible OpenAI)
Prérequis
- Docker + Docker Compose
- GPU NVIDIA avec pilotes récents et le
NVIDIA Container Toolkit
(
nvidia-ctk runtime configure --runtime=docker) - ~6 Go de VRAM libres pour Qwen3-ASR-1.7B (ajuster
--gpu-memory-utilization)
Démarrage
docker compose up -d --build
Au premier lancement, le conteneur asr télécharge le modèle depuis
Hugging Face (quelques Go, mis en cache dans un volume). Suivre avec :
docker compose logs -f asr
Puis ouvrir https://<ip-du-serveur>:8443 depuis un PC ou un téléphone du réseau local, accepter l'avertissement de certificat, autoriser le micro, et cliquer sur Démarrer.
Sur iPhone/iPad, utiliser impérativement HTTPS (https://<ip>:8443 ou un
reverse proxy HTTPS). Safari bloque le micro en HTTP sur le réseau local.
Après acceptation du certificat, le bouton Démarrer déclenche la demande
micro et l'interface passe en mode mobile.
⚠️ Le HTTPS est obligatoire : les navigateurs n'autorisent l'accès au micro (
getUserMedia) qu'en HTTPS (ou surlocalhost). L'app génère elle-même un certificat auto-signé au premier démarrage pour l'adresseLIVEFLOW_HOST(stocké dans le volume de données ; supprimezdata/certs/pour le régénérer après un changement d'adresse).
Unraid
Un compose dédié est fourni : docker-compose.unraid.yml
(image préconstruite ghcr.io/r0m1k3/liveflow, GPU via runtime: nvidia,
port 8443). Prérequis : plugins Nvidia Driver et Docker Compose Manager.
Renseigner LIVEFLOW_HOST (IP du serveur) dans le compose, créer une stack
pointant sur ce fichier, puis ouvrir https://<ip-unraid>:8443.
Mises à jour
À chaque push sur GitHub, une GitHub Action construit l'image de l'app et la
publie sur ghcr.io/r0m1k3/liveflow:latest. Pour mettre à jour l'app :
docker compose -f docker-compose.unraid.yml pull app && \
docker compose -f docker-compose.unraid.yml up -d app
Première utilisation : le paquet ghcr.io doit être public (GitHub → page du dépôt → Packages → liveflow → Package settings → Change visibility).
Configuration
Variables d'environnement (fichier .env à la racine, voir .env.example) :
| Variable | Défaut | Rôle |
|---|---|---|
ASR_LANGUAGE |
(vide) | Code langue forcé (fr, en…) ; vide = détection auto |
ASR_API_KEY |
sk-local |
Clé envoyée au moteur ASR (inutile en local) |
HF_TOKEN |
(vide) | Jeton Hugging Face si nécessaire au téléchargement |
DIARIZATION |
on |
Active les badges locuteurs (Locuteur 1, Locuteur 2…) |
DIARIZATION_THRESHOLD |
0.70 |
Seuil de séparation des voix |
DIARIZATION_MAX_SPEAKERS |
8 |
Nombre maximal de locuteurs par réunion |
La première activation de la diarisation télécharge le modèle SpeechBrain
ECAPA-TDNN dans /data/models/ecapa-tdnn. Si le modèle n'est pas chargé,
l'interface désactive l'option Locuteurs au lieu de laisser croire que la
fonction est active.
Changer de moteur de transcription
L'app ne parle au moteur que via l'API OpenAI (/v1/audio/transcriptions).
Pour changer de moteur, remplacer le service asr dans docker-compose.yml
et ajuster ASR_MODEL. Exemples :
# CPU uniquement — Parakeet-TDT-0.6B-v3 (rapide, 25 langues dont FR)
asr:
image: ghcr.io/groxaxo/parakeet-tdt-0.6b-v3-fastapi-openai:latest
# Écosystème Whisper — Speaches (faster-whisper, CPU/GPU)
asr:
image: ghcr.io/speaches-ai/speaches:latest-cuda
Récupérer une transcription
Depuis l'interface (boutons TXT / MD / SRT / JSON / Copier) ou en direct via l'API :
curl -k https://<ip>/api/meetings # liste des réunions
curl -k https://<ip>/api/meetings/1/export?format=txt # export texte