English summary. Briefly AI is a local, privacy-first assistant for Linux that writes up a webinar for you: join the webinar, click Start, and leave. It captures the audio, transcribes it with faster-whisper, analyses it with a local model (llama.cpp) and emails you a structured summary. No audio or webinar content leaves your machine. This is a proof of concept, and the documentation is in French.
Assistant local, privacy-first, qui automatise le compte rendu d'un webinar sur Linux : vous rejoignez le webinar, cliquez sur Start, et partez. L'application capture l'audio, transcrit, analyse et envoie un résumé structuré par email — sans qu'aucun audio ni contenu du webinar ne quitte votre machine.
Je rejoins le webinar → Start → je pars → je reçois le résumé par email
État affiché pendant l'exécution : Recording → Transcribing → AI Analysis → Sending → Done
POC — voir docs/ARCHITECTURE.md pour l'analyse du besoin, les choix techniques et leurs justifications, et les limites connues de cette version.
Les outils de compte rendu de réunion/webinar actuels (Otter.ai, Fireflies, Zoom AI Companion, Microsoft Copilot, Fathom, Grain, etc.) souffrent de plusieurs limites pour un usage exigeant en confidentialité :
- Cloud obligatoire : l'audio, la transcription et parfois le contenu complet du webinar transitent par les serveurs du fournisseur pour être traités, ce qui est inacceptable pour des contenus confidentiels, internes ou soumis à des contraintes réglementaires (RGPD, secret professionnel, propriété intellectuelle).
- Bot de réunion intrusif : la plupart nécessitent qu'un "bot" rejoigne explicitement l'appel (visible des autres participants, à autoriser côté organisateur), ce qui ne fonctionne pas pour un simple webinar visionné dans un navigateur, sans contrôle sur les participants.
- Dépendance à un abonnement et à un fournisseur : coût récurrent, disponibilité conditionnée à un service tiers, export de données parfois limité, verrouillage propriétaire du format de sortie.
- Intervention manuelle résiduelle : il faut souvent démarrer/arrêter l'enregistrement soi-même, puis récupérer et diffuser le résumé manuellement — l'automatisation de bout en bout (jusqu'à l'email) est rarement complète.
- Boîte noire côté IA : peu de garanties ou de mécanismes explicites contre les hallucinations du résumé par rapport à la transcription source.
Ce POC répond à ces limites en restant strictement local (aucune donnée du webinar ne sort de la machine, seul le résumé final est envoyé par email), générique (aucune intégration à un client de visio particulier), et entièrement automatisé une fois lancé.
Audio système (parec)
→ Speech-to-Text local (faster-whisper)
→ transcription (texte + JSON)
→ découpage en chunks si nécessaire
→ analyse LLM locale (llama.cpp, map-reduce)
→ résumé structuré consolidé (JSON)
→ évaluation de fidélité (heuristiques)
→ envoi par email (SMTP) — seule sortie réseau
- Aucun audio, aucune transcription et aucun contenu du webinar n'est envoyé vers un service cloud : le STT (faster-whisper) et le LLM (llama.cpp) tournent 100 % localement, sur CPU.
- Le seul point de sortie réseau de l'application est l'envoi du
résumé final par email (
briefly_ai/emailing.py).
- Linux desktop générique avec PulseAudio ou PipeWire (
pipewire-pulse). - Python 3.11+.
- ~16 Go de RAM, aucun GPU requis.
- Paquets système :
(
# Debian/Ubuntu sudo apt install pulseaudio-utils python3-tk # Fedora sudo dnf install pulseaudio-utils python3-tkinter # Arch sudo pacman -S libpulse tk
python3-tkn'est nécessaire que pour l'interface graphique.)
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp config.example.yaml config.yaml
cp .env.example .env # renseignez vos identifiants SMTP, puis: export $(grep -v '^#' .env | xargs)
# Modèle LLM local (GGUF, ~2 Go, téléchargé séparément — voir docs/ARCHITECTURE.md)
./scripts/download_models.shLe modèle Whisper (faster-whisper) est téléchargé automatiquement au
premier lancement par la bibliothèque elle-même.
python -m briefly_ai.cli start --config config.yaml --title "Nom du webinar"Rejoignez votre webinar, appuyez sur Entrée pour démarrer, puis n'intervenez plus : la fin du webinar est détectée automatiquement après une période de silence prolongé (configurable), et le résumé est envoyé par email.
python -m briefly_ai.guiFenêtre minimale (Tkinter) : bouton Start, état courant, bouton d'arrêt manuel optionnel, journal des étapes.
Voir config.example.yaml, commenté. Principaux
réglages :
| Section | Clé | Rôle |
|---|---|---|
audio |
silence_duration_seconds |
Durée de silence avant détection automatique de fin de webinar |
transcription |
model_size |
Taille du modèle Whisper (tiny…medium) |
summarization |
model_path |
Chemin du modèle LLM GGUF local |
summarization |
chunk_chars |
Taille des morceaux de transcription envoyés au LLM |
email |
smtp_host, recipients, ... |
Envoi du résumé final |
evaluation |
min_coverage_ratio |
Seuil d'alerte de fidélité du résumé |
Les secrets (mot de passe SMTP) se référencent via ${VARIABLE} et sont
résolus depuis l'environnement — jamais committés en clair.
Chaque session produit, dans sessions/<horodatage>/ :
audio.wav— capture brutetranscript.json— transcription (segments horodatés)summary.json— résumé structuré, contrat utilisé pour l'email :
{
"executive_summary": "…",
"key_points": ["…"],
"decisions": ["…"],
"action_items": ["…"],
"resources": ["…"]
}faithfulness.json— résultat des évaluations de fidélité (voir plus bas)
Le prompt système interdit explicitement au LLM d'inventer des informations
absentes de la transcription (briefly_ai/summarization/prompts.py).
En complément, briefly_ai/evaluation/faithfulness.py calcule après coup :
- coverage_ratio : proportion des mots significatifs du résumé qui apparaissent réellement dans la transcription (un score bas indique un possible vocabulaire halluciné) ;
- compression_ratio : longueur résumé / longueur transcription, pour repérer un résumé vide ou anormalement long ;
- unsupported_terms : liste des termes du résumé absents de la transcription, pour investigation manuelle rapide.
Ce sont des heuristiques légères (pas de dépendance supplémentaire), pas une
preuve formelle — voir docs/ARCHITECTURE.md pour leurs limites.
Chaque composant est isolé derrière une interface (Protocol) et injectable
dans WebinarAssistantPipeline :
briefly_ai/transcription/base.py→ remplacer faster-whisper par un autre moteur STT local (vosk, whisper.cpp, ...).briefly_ai/summarization/base.py→ remplacer llama.cpp par un autre runtime LLM local (Ollama, etc.) sans toucher au reste du pipeline.
pip install -r requirements-dev.txt
pytestLes tests couvrent le découpage en chunks, le schéma de résumé structuré, le parsing JSON du LLM, les heuristiques de fidélité, le suivi de silence audio et le pipeline complet (avec des doublures pour l'audio/STT/LLM/email — aucun test ne nécessite de matériel audio réel ni de modèle téléchargé).
- La capture audio et la détection de silence n'ont pas pu être testées sur
un véritable environnement PulseAudio/PipeWire dans cet environnement de
développement (sandbox sans serveur audio) : la logique est unitairement
testée (
SilenceTracker, calcul RMS), mais une validation sur poste de travail réel est recommandée avant usage. - L'interface graphique a été testée en pilotage automatique via Xvfb (pas d'aperçu visuel humain dans cet environnement).
- L'évaluation de fidélité est lexicale (pas de lemmatisation) : des reformulations légitimes du LLM peuvent faire baisser le score sans qu'il y ait réellement hallucination.
MIT — voir LICENSE.