Whisper — c'est quoi ? 01
Whisper est un modèle de reconnaissance vocale (Speech-to-Text) d'OpenAI, publié open-source. Il transcrit de l'audio en texte avec une précision remarquable, dans plus de 90 langues, y compris le français.
Whisper.cpp est une réimplémentation en C++ du modèle original Python — beaucoup plus rapide, sans dépendances lourdes comme PyTorch, et qui tourne même sur CPU de façon satisfaisante. C'est la version qu'on recommande pour un usage pratique.
- Rapide : transcrit la parole en temps réel sur un CPU moderne
- Multilingue : français, anglais, espagnol, japonais… détection automatique de la langue
- Local : rien ne quitte ta machine
- Formats acceptés : WAV, MP3, MP4, M4A, FLAC, OGG…
Installation — option simple via Python 02
Il existe deux approches : compiler Whisper.cpp depuis les sources (plus performant), ou utiliser le binding Python faster-whisper qui encapsule une version optimisée. On commence par l'option Python — plus simple pour débuter.
mkdir whisper-tuto
cd whisper-tuto
python -m venv venv
venv\Scripts\activate # Windows
source venv/bin/activate # macOS / Linux
# faster-whisper : binding Python de Whisper.cpp optimisé (CTranslate2)
pip install faster-whisper
# ffmpeg est nécessaire pour la conversion audio
# Windows : télécharger sur https://ffmpeg.org/download.html et ajouter au PATH
# macOS : brew install ffmpeg
# Linux : sudo apt install ffmpeg
ffmpeg est indispensable. Whisper ne lit pas directement tous les formats audio — ffmpeg convertit à la volée. Sans ffmpeg, seuls les fichiers WAV mono 16kHz fonctionnent nativement.
Transcrire un fichier audio 03
Crée transcribe.py. On commence par transcrire un fichier audio existant :
from faster_whisper import WhisperModel
import sys
import os
# ── Charger le modèle ─────────────────────────────────────────────────────────
# Tailles disponibles : tiny, base, small, medium, large-v3
# tiny → très rapide, moins précis (~75 Mo)
# base → bon compromis pour le français (~145 Mo)
# small → meilleur en précision (~485 Mo)
# medium → excellent, lent sur CPU (~1.5 Go)
# large-v3 → le meilleur, GPU recommandé (~3 Go)
MODELE = "base" # on commence avec "base"
DEVICE = "cpu" # "cuda" si tu as un GPU NVIDIA
COMPUTE_TYPE = "int8" # int8 = plus rapide sur CPU, float16 sur GPU
print(f"Chargement du modèle Whisper '{MODELE}'...")
model = WhisperModel(MODELE, device=DEVICE, compute_type=COMPUTE_TYPE)
print("Modèle prêt.\n")
def transcrire_fichier(chemin_audio: str, langue: str = None) -> str:
"""
Transcrit un fichier audio en texte.
chemin_audio : chemin vers le fichier audio (WAV, MP3, MP4…)
langue : code langue ("fr", "en"…) ou None pour détection automatique
Retourne le texte transcrit.
"""
if not os.path.exists(chemin_audio):
raise FileNotFoundError(f"Fichier introuvable : {chemin_audio}")
print(f"Transcription de : {chemin_audio}")
# segments est un générateur — chaque segment est un morceau transcrit
# info contient les métadonnées (langue détectée, durée…)
segments, info = model.transcribe(
chemin_audio,
language=langue, # None = détection automatique
beam_size=5, # plus élevé = plus précis mais plus lent
vad_filter=True, # VAD = Voice Activity Detection, ignore les silences
vad_parameters=dict(
min_silence_duration_ms=500, # silence > 500ms = nouvelle phrase
),
)
langue_detectee = info.language
proba_langue = info.language_probability
print(f"Langue détectée : {langue_detectee} (confiance : {proba_langue:.0%})")
print(f"Durée audio : {info.duration:.1f} secondes\n")
# Assembler les segments en texte complet
texte_complet = ""
for segment in segments:
# Chaque segment a : start (secondes), end (secondes), text (texte)
debut = segment.start
fin = segment.end
texte = segment.text.strip()
print(f"[{debut:5.1f}s → {fin:5.1f}s] {texte}")
texte_complet += texte + " "
return texte_complet.strip()
# ── Point d'entrée ────────────────────────────────────────────────────────────
if __name__ == "__main__":
# Utilisation : python transcribe.py mon_audio.mp3
if len(sys.argv) < 2:
print("Usage : python transcribe.py ")
print("Exemple : python transcribe.py interview.mp3")
sys.exit(1)
fichier = sys.argv[1]
try:
texte = transcrire_fichier(fichier)
print("\n" + "="*50)
print("TRANSCRIPTION COMPLÈTE :")
print("="*50)
print(texte)
# Sauvegarder dans un fichier .txt
nom_sortie = os.path.splitext(fichier)[0] + "_transcription.txt"
with open(nom_sortie, "w", encoding="utf-8") as f:
f.write(texte)
print(f"\nTranscription sauvegardée : {nom_sortie}")
except FileNotFoundError as e:
print(f"Erreur : {e}")
# Remplace mon_audio.mp3 par ton fichier
python transcribe.py mon_audio.mp3
# Forcer la langue française (évite les erreurs de détection)
# modifie la ligne : transcrire_fichier(fichier, langue="fr")
Transcrire depuis le microphone en temps réel 04
On peut aussi transcrire directement depuis le micro. Pour ça, on a besoin de sounddevice pour capturer l'audio :
pip install sounddevice numpy scipy
import sounddevice as sd
import numpy as np
import scipy.io.wavfile as wav
import tempfile
import os
from faster_whisper import WhisperModel
# Paramètres audio
SAMPLE_RATE = 16000 # Whisper travaille en 16 kHz
DUREE_ECOUTE = 5 # secondes d'enregistrement par chunk
MODELE = "base"
print("Chargement du modèle Whisper...")
model = WhisperModel(MODELE, device="cpu", compute_type="int8")
print("Modèle prêt. Parle dans ton micro — Ctrl+C pour arrêter.\n")
def enregistrer_chunk(duree: int) -> np.ndarray:
"""Enregistre `duree` secondes depuis le micro, retourne un tableau numpy."""
print(f"🎙 Écoute ({duree}s)...", end=" ", flush=True)
audio = sd.rec(
int(duree * SAMPLE_RATE),
samplerate=SAMPLE_RATE,
channels=1,
dtype="float32",
)
sd.wait() # attendre la fin de l'enregistrement
return audio.flatten()
def transcrire_numpy(audio: np.ndarray) -> str:
"""Transcrit un tableau numpy audio en texte."""
# Whisper accepte un tableau numpy float32 directement
segments, _ = model.transcribe(
audio,
language="fr",
beam_size=5,
vad_filter=True,
)
return " ".join(seg.text.strip() for seg in segments)
# Boucle d'écoute en continu
try:
while True:
audio = enregistrer_chunk(DUREE_ECOUTE)
texte = transcrire_numpy(audio)
if texte:
print(f"→ {texte}")
else:
print("(silence)")
except KeyboardInterrupt:
print("\nArrêt.")
Ce script transcrit par chunks de 5 secondes. Pour une transcription plus fluide en production, on utiliserait un buffer glissant et une détection de fin de phrase — mais pour un premier projet, ce modèle est parfaitement fonctionnel.
Choisir le bon modèle selon ton matériel 05
Whisper existe en plusieurs tailles. Voilà un guide rapide pour choisir :
# tiny → CPU lent / vieux PC | ~75 Mo | rapide mais imprécis en français
# base → CPU moderne | ~145 Mo | bon compromis pour débuter
# small → CPU rapide / GPU | ~485 Mo | recommandé pour le français
# medium → GPU 4+ Go | ~1.5 Go | excellent pour le français
# large-v3 → GPU 8+ Go | ~3 Go | meilleur modèle disponible
# Changer le modèle dans le script :
model = WhisperModel("small", device="cpu", compute_type="int8") # CPU
model = WhisperModel("large-v3", device="cuda", compute_type="float16") # GPU
Pour de la transcription de conférences ou d'interviews en français, small sur CPU ou medium sur GPU offre un excellent rapport qualité/vitesse. Le modèle large-v3 est quasi-parfait mais nécessite un bon GPU.