Files
LiveFlow/README.md

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 sur localhost). L'app génère elle-même un certificat auto-signé au premier démarrage pour l'adresse LIVEFLOW_HOST (stocké dans le volume de données ; supprimez data/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