Whisper + Ollama : pipeline transcription et résumé 100% local
Transcrire une réunion d'une heure puis en sortir un compte-rendu structuré : c'est exactement ce que vendent Otter, Fireflies ou Tactiq — moyennant l'envoi de votre audio chez un tiers. Whisper (OpenAI, mais open source et exécutable hors-ligne) couplé à un LLM Ollama fait la même chose sur votre machine, sans abonnement et sans fuite. Ce guide monte le pipeline whisper.cpp → Ollama de bout en bout : install, choix du modèle, script bash, script Python, et un cas concret de transcription locale d'une réunion d'1h.
#Pourquoi un pipeline whisper + ollama de transcription locale ?
Un enregistrement de réunion contient des noms de clients, des chiffres, des arbitrages stratégiques, parfois des données RH. Les services SaaS de transcription stockent ces audios sur leurs serveurs et les utilisent (selon les CGU) pour entraîner leurs propres modèles. Pour une équipe qui prend la confidentialité au sérieux, ce n'est pas négociable.
Whisper d'OpenAI est librement téléchargeable et tourne offline. whisper.cpp (le port C++ par Georgi Gerganov) le fait tourner efficacement sur CPU et GPU, sans Python ni CUDA obligatoire. Ollama, de son côté, expose un LLM local sur http://localhost:11434. Les deux brique à brique : audio → texte (Whisper) → résumé structuré (Ollama). Tout reste sur votre disque.
#Prérequis
- macOS, Linux ou Windows (WSL2)
- whisper.cpp compile partout. Sous Windows pur, utilisez WSL2 — la compilation native marche mais demande plus de bricolage.
- Ollama installé et opérationnel
- Un ollama run mistral doit répondre. Sinon, repassez par le guide d'installation pour votre OS.
- Compilateur C++ et CMake
- build-essential cmake sur Debian/Ubuntu, Xcode Command Line Tools sur macOS.
- ffmpeg
- Pour convertir vos .m4a/.mp3/.mp4 en WAV 16 kHz, le seul format que whisper.cpp accepte en entrée.
- 8 Go de RAM minimum
- 16 Go confortable. Le modèle large-v3 charge ~3 Go en RAM/VRAM. Un LLM 7B Q4 en plus, ~5 Go.
- GPU optionnel
- Une RTX 3060 12 Go transcrit 1h d'audio en ~4 min avec large-v3. Sur Apple Silicon, Metal est activé automatiquement et c'est tout aussi rapide.
#1. Installer whisper.cpp
Pas de paquet officiel : on clone le dépôt et on compile. C'est 2 minutes et ça donne un binaire portable que vous pouvez bouger où vous voulez.
Le binaire principal arrive dans build/bin/whisper-cli (anciennement nommé main avant la refonte CMake). C'est lui que vous appellerez pour transcrire.
Installez ffmpeg séparément si ce n'est pas déjà fait :
#2. Choisir le bon modèle Whisper (tiny → large-v3)
Whisper existe en cinq tailles, multipliées par deux variantes : multilingue (par défaut) et anglais uniquement (suffixe .en). Pour du français, restez multilingue. Le tableau ci-dessous résume ce qui change vraiment.
- tiny (75 Mo)
- Rapide mais médiocre en français. Réservé aux tests rapides ou aux Raspberry Pi. WER (taux d'erreur) ~30% en français spontané.
- base (142 Mo)
- Acceptable pour de l'anglais clair, faiblard en français bruité. Bonne option si vous avez très peu de ressources.
- small (466 Mo)
- Le premier palier sérieux. WER ~10–12% en français propre. Transcrit 1h d'audio en ~3 min sur GPU modeste.
- medium (1.5 Go)
- Très bon compromis qualité/vitesse pour le français de réunion. WER ~7–8%. Reconnaît bien la ponctuation.
- large-v3 (3.1 Go)
- État de l'art. Quasi parfait en français propre, robuste sur accents et bruit de fond. À privilégier dès que vous avez >6 Go de RAM/VRAM libres.
Pour transcrire une réunion en français, la recommandation pratique : medium par défaut, large-v3 si vous avez le GPU pour. small est un bon repli sur laptop sans GPU dédié.
Les modèles arrivent dans models/ au format ggml (l'équivalent de gguf pour les LLM). Vous pouvez télécharger plusieurs tailles et alterner selon le besoin.
#3. Transcrire un fichier audio
whisper.cpp ne lit que du WAV 16 kHz mono. On utilise ffmpeg pour préparer l'audio, puis whisper-cli pour transcrire.
- -ar 16000
- Resample à 16 kHz (la fréquence d'entraînement de Whisper).
- -ac 1
- Force le mono. Whisper ignore la stéréo de toute façon.
- -c:a pcm_s16le
- PCM 16-bit little-endian, le format WAV non compressé attendu.
Le résultat sort dans reunion.txt avec les segments timestampés. Quelques flags utiles à connaître :
- -l fr
- Force le français. Sans ce flag, Whisper détecte la langue automatiquement — mais se trompe parfois sur les phrases courtes.
- -otxt / -osrt / -ovtt / -ojson
- Format de sortie : texte brut, sous-titres SRT, VTT, ou JSON structuré avec timestamps. Vous pouvez les combiner.
- -of <prefixe>
- Préfixe des fichiers de sortie (sans extension).
- -t 8
- Nombre de threads CPU. Par défaut, whisper.cpp en utilise 4 — montez à 8 ou 16 sur un CPU récent.
- --print-progress
- Affiche une barre de progression. Pratique pour les longs fichiers.
#4. Résumer la transcription avec Ollama
Une fois la transcription brute en main, on l'envoie à Ollama via son API HTTP locale. L'endpoint /api/chat est le plus direct pour un usage one-shot.
Pour une réunion de 1h, la transcription pèse facilement 10 000 à 15 000 tokens. Mistral 7B accepte 32k de contexte natif, c'est confortable. Pour plus long, Qwen 2.5 14B monte à 128k.
#5. Pipeline complet : exemple compte-rendu de réunion (1h)
On assemble tout dans un script Python qui prend un fichier audio en entrée et sort un compte-rendu Markdown. C'est le cœur d'un pipeline whisper ollama de transcription locale réutilisable.
Sur une réunion d'1h avec une RTX 3060 12 Go et le modèle medium : ~3 minutes pour la transcription, ~30 secondes pour le résumé Mistral. Total : moins de 4 minutes, zéro requête réseau. Sur un MacBook M2 16 Go en CPU + Metal : ~6 minutes total.
#Astuces et dépannage
- Transcription qui hallucine en silences
- Whisper invente parfois des phrases dans les longs silences ("Sous-titrage par...", "Merci d'avoir regardé"). Activez le VAD : --vad --vad-model models/ggml-silero-v5.1.2.bin (à télécharger via le même script).
- Noms propres déformés
- Whisper ne connaît pas les noms de vos collègues. Passez-les en prompt initial via --prompt "Marie, Julien, Samir, ACME Corp, ProjetX". Ils seront orthographiés correctement.
- Audio compressé (Zoom, Teams)
- Les enregistrements Zoom MP4 contiennent souvent un audio mono de mauvaise qualité. Préférez l'export Zoom "audio seul" (M4A) ou enregistrez en parallèle avec OBS si la qualité prime.
- Erreur ggml_metal_init sur Mac
- Vous avez compilé sans Metal ou whisper.cpp ne trouve pas les ressources. Recompilez depuis zéro : rm -rf build && cmake -B build && cmake --build build --config Release -j.
- Ollama timeout sur gros contexte
- Le client HTTP coupe avant la fin. Augmentez timeout=600 (10 min) côté requests. Côté serveur, OLLAMA_KEEP_ALIVE=30m garde le modèle chaud.
- Transcription tronquée
- Si le résumé semble couper l'audio en cours de route, c'est que num_ctx est trop bas. Vérifiez le nombre de tokens (wc -w sur le .txt × 1.3 ≈ tokens) et alignez num_ctx au double.
- Diarisation (qui parle)
- whisper.cpp ne fait pas la diarisation. Pour distinguer les locuteurs, ajoutez pyannote.audio dans le pipeline avant la transcription, puis annotez chaque segment. C'est une autre couche, hors scope ici.
#Pour aller plus loin
Votre pipeline transcrit et résume en local. Trois directions logiques selon votre besoin :
- Compte-rendu médical avec faster-whisper
- Le guide transcription des consultations utilise faster-whisper (port Python optimisé) avec un focus secret médical, diarisation pyannote, et conformité RGPD santé. Variante intéressante du même pattern.
- Choisir le bon LLM de résumé
- Le résumé est le maillon où la qualité varie le plus. Le guide choisir sa quantification compare Q4_K_M, Q5_K_M et Q8_0 — différence audible sur du texte long avec des nuances.
- Automatiser le pipeline avec n8n
- Pour déclencher la chaîne dès qu'un fichier audio arrive (dossier surveillé, mail, Slack), le guide automatisation n8n + Ollama montre comment construire le workflow sans code.
Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.