
Tutoriel OpenAI Whisper : guide complet de la transcription parole vers texte
Eric King
Author
Tutoriel OpenAI Whisper : guide complet de la transcription parole vers texte
OpenAI Whisper est un modèle de reconnaissance automatique de la parole (ASR) open source conçu pour la transcription parole vers texte et la traduction de la parole. Il prend en charge de nombreuses langues, gère bien les accents et le bruit de fond, et sert souvent pour les podcasts, réunions, interviews et sous-titres vidéo.
Ce tutoriel complet vous guide sur tout ce qu’il faut savoir pour démarrer avec Whisper, de l’installation aux usages avancés.
Qu’est-ce qu’OpenAI Whisper ?
Whisper a été entraîné sur 680 000 heures d’audio multilingue, ce qui le rend particulièrement solide sur l’audio réel et imparfait. C’est l’un des modèles de reconnaissance vocale open source les plus précis.
Fonctionnalités clés
- Prise en charge multilingue – plus de 99 langues
- Transcription parole vers texte – convertir l’audio en texte
- Traduction de la parole – traduire la parole directement en anglais
- Détection de langue – détecte automatiquement la langue parlée
- Horodatage – au niveau du mot et du segment
- Open source et gratuit – licence MIT, sans coût d’API
- Hors ligne – s’exécute en local sur votre machine
- Formats multiples – prend en charge divers formats audio et vidéo
Tailles de modèles Whisper
Whisper propose plusieurs tailles de modèle pour équilibrer vitesse et précision :
| Modèle | Paramètres | Vitesse | Précision | Mémoire | Cas d’usage |
|---|---|---|---|---|---|
| tiny | 39M | ⭐⭐⭐⭐⭐ | ⭐⭐ | ~1 Go | Tests rapides, démos |
| base | 74M | ⭐⭐⭐⭐ | ⭐⭐⭐ | ~1 Go | Audio simple, tâches rapides |
| small | 244M | ⭐⭐⭐ | ⭐⭐⭐⭐ | ~2 Go | Usage général, équilibré |
| medium | 769M | ⭐⭐ | ⭐⭐⭐⭐⭐ | ~5 Go | Audio bruité, haute précision |
| large | 1550M | ⭐ | ⭐⭐⭐⭐⭐⭐ | ~10 Go | Meilleure précision, production |
Recommandations :
- Pour la vitesse : utilisez
tinyoubase - Pour l’équilibre : utilisez
smalloumedium - Pour la précision : utilisez
largeoularge-v3 - Pour la production : le plus courant est
mediumoularge-v2
Prérequis
Avant d’utiliser Whisper, assurez-vous d’avoir :
- Python 3.8 ou plus (Python 3.9+ recommandé)
- Le gestionnaire de paquets pip
- FFmpeg installé (pour le traitement audio/vidéo)
- (Facultatif) GPU NVIDIA avec CUDA pour aller plus vite
- (Facultatif) 4 Go+ de RAM pour le modèle base, 10 Go+ pour large
Étape 1 : installation
Installer Whisper
Installez le paquet OpenAI Whisper avec pip :
pip install openai-whisper
Ou avec une version précise :
pip install openai-whisper==20231117
Installer FFmpeg
FFmpeg est nécessaire pour décoder les fichiers audio et vidéo.
macOS (avec Homebrew) :
brew install ffmpeg
Ubuntu / Debian:
sudo apt update
sudo apt install ffmpeg
Windows :
- Téléchargez FFmpeg sur ffmpeg.org
- Décompressez et ajoutez-le au PATH système
- Ou utilisez :
choco install ffmpeg(avec Chocolatey)
Vérifier l’installation :
ffmpeg -version
whisper --version
Étape 2 : utilisation de base en Python
Transcription simple
Voici le moyen le plus simple de transcrire de l’audio :
import whisper
# Load model (downloads automatically on first use)
model = whisper.load_model("base")
# Transcribe audio file
result = model.transcribe("audio.mp3")
# Print transcription
print(result["text"])
Sortie :
Hello everyone, welcome to today's meeting. We will discuss the project timeline and upcoming milestones.
Exemple complet avec gestion d’erreurs
import whisper
import os
def transcribe_audio(audio_path, model_size="base"):
"""
Transcribe an audio file using Whisper.
Args:
audio_path (str): Path to the audio file
model_size (str): Whisper model size (tiny, base, small, medium, large)
Returns:
dict: Transcription result with text and segments
"""
try:
# Check if audio file exists
if not os.path.exists(audio_path):
raise FileNotFoundError(f"Audio file not found: {audio_path}")
# Load the Whisper model
print(f"Loading Whisper model: {model_size}")
model = whisper.load_model(model_size)
# Transcribe the audio
print(f"Transcribing: {audio_path}")
result = model.transcribe(audio_path)
print(f"✓ Transcription complete!")
print(f" Language: {result['language']}")
print(f" Duration: {result['segments'][-1]['end']:.2f}s")
return result
except Exception as e:
print(f"Error during transcription: {str(e)}")
return None
# Example usage
if __name__ == "__main__":
audio_file = "meeting.mp3"
result = transcribe_audio(audio_file, model_size="base")
if result:
print("\n" + "="*50)
print("TRANSCRIPTION:")
print("="*50)
print(result["text"])
Étape 3 : détection et spécification de la langue
Détection automatique de la langue
Whisper détecte automatiquement la langue :
import whisper
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
print(f"Detected language: {result['language']}")
print(f"Language probability: {result.get('language_probability', 0):.2%}")
print(f"\nTranscription:\n{result['text']}")
Indiquer la langue (plus rapide et plus précis)
Lorsque vous connaissez la langue, la préciser améliore la vitesse et la précision :
import whisper
model = whisper.load_model("base")
# Specify language
result_en = model.transcribe("audio.mp3", language="en") # English
result_zh = model.transcribe("audio.mp3", language="zh") # Chinese
result_es = model.transcribe("audio.mp3", language="es") # Spanish
result_fr = model.transcribe("audio.mp3", language="fr") # French
result_de = model.transcribe("audio.mp3", language="de") # German
result_ja = model.transcribe("audio.mp3", language="ja") # Japanese
print(result_en["text"])
Langues prises en charge :
Whisper prend en charge plus de 99 langues. Codes courants :
en– anglaiszh– chinoises– espagnolfr– françaisde– allemandja– japonaisko– coréenpt– portugaisru– russeit– italien
Étape 4 : horodatages et segments
Accéder aux segments avec horodatages
import whisper
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
# Print full transcription
print("Full Text:")
print(result["text"])
# Print segments with timestamps
print("\n" + "="*50)
print("Segments with Timestamps:")
print("="*50)
for segment in result["segments"]:
start = segment["start"]
end = segment["end"]
text = segment["text"].strip()
print(f"[{start:6.2f}s - {end:6.2f}s] {text}")
Sortie :
Full Text:
Hello everyone, welcome to today's meeting. We will discuss the project timeline.
==================================================
Segments with Timestamps:
==================================================
[ 0.00s - 5.20s] Hello everyone, welcome to today's meeting.
[ 5.20s - 12.50s] We will discuss the project timeline.
Formater les horodatages en timecode
def format_timestamp(seconds):
"""Format seconds to HH:MM:SS."""
hours = int(seconds // 3600)
minutes = int((seconds % 3600) // 60)
secs = int(seconds % 60)
return f"{hours:02d}:{minutes:02d}:{secs:02d}"
for segment in result["segments"]:
start_time = format_timestamp(segment["start"])
end_time = format_timestamp(segment["end"])
print(f"[{start_time} - {end_time}] {segment['text']}")
Horodatages au niveau du mot
Activez les horodatages au niveau du mot pour un repérage précis :
import whisper
model = whisper.load_model("base")
result = model.transcribe(
"audio.mp3",
word_timestamps=True # Enable word-level timestamps
)
for segment in result["segments"]:
print(f"\n[{segment['start']:.2f}s - {segment['end']:.2f}s]")
print(f"Text: {segment['text']}")
# Word-level timestamps
if "words" in segment:
print("Words:")
for word in segment["words"]:
print(f" {word['word']} [{word['start']:.2f}s - {word['end']:.2f}s]")
Étape 5 : traduction de la parole
Whisper peut traduire une parole autre que l’anglais directement en anglais :
import whisper
model = whisper.load_model("base")
# Translate to English (regardless of source language)
result = model.transcribe("spanish_audio.mp3", task="translate")
print("Translated to English:")
print(result["text"])
# Original transcription (in original language)
result_original = model.transcribe("spanish_audio.mp3", task="transcribe")
print("\nOriginal language transcription:")
print(result_original["text"])
Cas d’usage :
- Réunions internationales
- Traitement de contenu multilingue
- Localisation de contenu
- Supports d’apprentissage des langues
Étape 6 : paramètres avancés
Température et taille de faisceau (beam size)
Contrôlez la qualité et la vitesse de transcription :
import whisper
model = whisper.load_model("base")
result = model.transcribe(
"audio.mp3",
temperature=0.0, # Lower = more deterministic (0.0 recommended)
beam_size=5, # Higher = more accurate but slower (default: 5)
best_of=5, # Number of candidates to consider
patience=1.0, # Beam search patience
condition_on_previous_text=True, # Use context from previous segments
initial_prompt="This is a technical meeting about AI and machine learning." # Context prompt
)
Valeurs de température
temperature=0.0– le plus déterministe, recommandétemperature=0.2-0.4– un peu plus de variationtemperature=1.0– plus créatif, moins précis
Invite initiale pour le contexte
Donnez du contexte pour améliorer la précision :
result = model.transcribe(
"technical_meeting.mp3",
initial_prompt="This meeting discusses API endpoints, microservices, Kubernetes, and CI/CD pipelines."
)
result = model.transcribe(
"medical_audio.mp3",
initial_prompt="This is a medical consultation discussing patient symptoms and treatment options."
)
Étape 7 : interface en ligne de commande (CLI)
Whisper propose une interface en ligne de commande puissante :
Utilisation CLI de base
whisper audio.mp3
Spécifier le modèle
whisper audio.mp3 --model small
whisper audio.mp3 --model medium
whisper audio.mp3 --model large-v2
Spécifier la langue
whisper audio.mp3 --language en
whisper audio.mp3 --language zh
Formats de sortie
# SRT subtitles
whisper audio.mp3 --output_format srt
# VTT subtitles
whisper audio.mp3 --output_format vtt
# Text file
whisper audio.mp3 --output_format txt
# JSON (with all metadata)
whisper audio.mp3 --output_format json
# TSV (tab-separated values)
whisper audio.mp3 --output_format tsv
Options CLI avancées
# Full example with all options
whisper audio.mp3 \
--model medium \
--language en \
--task transcribe \
--output_format srt \
--output_dir ./transcripts \
--verbose True \
--temperature 0.0 \
--beam_size 5 \
--best_of 5 \
--fp16 True
Référence des options CLI
| Option | Description | Défaut |
|---|---|---|
--model | Taille du modèle (tiny, base, small, medium, large) | base |
--language | Code langue (en, zh, es, etc.) | Détection auto |
--task | transcribe ou translate | transcribe |
--output_format | Format de sortie (txt, srt, vtt, json, tsv) | txt |
--output_dir | Dossier de sortie | Répertoire courant |
--temperature | Température d’échantillonnage | 0.0 |
--beam_size | Taille de faisceau pour la recherche en faisceau | 5 |
--best_of | Nombre de candidats | 5 |
--fp16 | Utiliser la précision FP16 (GPU) | True |
--verbose | Sortie détaillée | False |
Étape 8 : formats audio et vidéo pris en charge
Whisper prend en charge les formats les plus courants via FFmpeg :
Formats pris en charge
- Audio : MP3, WAV, M4A, FLAC, OGG, AAC, WMA
- Vidéo : MP4, AVI, MKV, MOV, WebM, FLV
- Streaming : peut traiter des flux audio
Exemples de formats
import whisper
model = whisper.load_model("base")
# Audio formats
model.transcribe("audio.mp3")
model.transcribe("audio.wav")
model.transcribe("audio.m4a")
model.transcribe("audio.flac")
# Video formats (extracts audio automatically)
model.transcribe("video.mp4")
model.transcribe("video.mkv")
model.transcribe("video.webm")
Étape 9 : exemple complet pour la production
Voici un exemple complet prêt pour la production :
import whisper
import json
from pathlib import Path
from datetime import datetime
class WhisperTranscriber:
"""Production-ready Whisper transcription service."""
def __init__(self, model_size="base"):
"""Initialize transcriber with specified model."""
print(f"Loading Whisper model: {model_size}")
self.model = whisper.load_model(model_size)
print("✓ Model loaded successfully")
def transcribe_file(self, audio_path, output_dir="transcripts", **kwargs):
"""
Transcribe audio file and save results.
Args:
audio_path: Path to audio file
output_dir: Directory to save outputs
**kwargs: Additional transcribe parameters
"""
audio_path = Path(audio_path)
if not audio_path.exists():
raise FileNotFoundError(f"Audio file not found: {audio_path}")
output_path = Path(output_dir)
output_path.mkdir(exist_ok=True)
print(f"\nTranscribing: {audio_path.name}")
# Transcribe
result = self.model.transcribe(
str(audio_path),
word_timestamps=True,
**kwargs
)
# Prepare output data
output_data = {
"file": str(audio_path),
"transcribed_at": datetime.now().isoformat(),
"language": result["language"],
"language_probability": result.get("language_probability", 0),
"duration": result["segments"][-1]["end"] if result["segments"] else 0,
"text": result["text"],
"segments": result["segments"]
}
# Save outputs
base_name = audio_path.stem
# Save as text
text_file = output_path / f"{base_name}.txt"
with open(text_file, "w", encoding="utf-8") as f:
f.write(result["text"])
# Save as JSON
json_file = output_path / f"{base_name}.json"
with open(json_file, "w", encoding="utf-8") as f:
json.dump(output_data, f, indent=2, ensure_ascii=False)
# Save as SRT
srt_file = output_path / f"{base_name}.srt"
self._save_srt(result["segments"], srt_file)
print(f"✓ Transcription saved:")
print(f" - Text: {text_file}")
print(f" - JSON: {json_file}")
print(f" - SRT: {srt_file}")
return output_data
def _save_srt(self, segments, output_path):
"""Save segments as SRT subtitle file."""
with open(output_path, "w", encoding="utf-8") as f:
for i, segment in enumerate(segments, start=1):
start = self._format_srt_time(segment["start"])
end = self._format_srt_time(segment["end"])
text = segment["text"].strip()
f.write(f"{i}\n{start} --> {end}\n{text}\n\n")
def _format_srt_time(self, seconds):
"""Format seconds to SRT timestamp."""
hours = int(seconds // 3600)
minutes = int((seconds % 3600) // 60)
secs = int(seconds % 60)
millis = int((seconds % 1) * 1000)
return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"
# Usage
if __name__ == "__main__":
transcriber = WhisperTranscriber(model_size="base")
result = transcriber.transcribe_file(
"meeting.mp3",
output_dir="transcripts",
language="en",
temperature=0.0
)
print(f"\nLanguage: {result['language']}")
print(f"Duration: {result['duration']:.2f}s")
print(f"\nTranscription preview:")
print(result['text'][:200] + "...")
Étape 10 : bonnes pratiques
1. Choisir le bon modèle
# For speed (testing, demos)
model = whisper.load_model("tiny")
# For balance (general use)
model = whisper.load_model("base") # or "small"
# For accuracy (production)
model = whisper.load_model("medium") # or "large-v2"
2. Indiquer la langue lorsqu’elle est connue
# Faster and more accurate
result = model.transcribe("audio.mp3", language="en")
# Instead of auto-detection
result = model.transcribe("audio.mp3") # Slower
3. Utiliser une température adaptée
# Recommended for most cases
result = model.transcribe("audio.mp3", temperature=0.0)
# For creative content (not recommended for transcription)
result = model.transcribe("audio.mp3", temperature=0.2)
4. Fournir du contexte avec une invite initiale
# Technical content
result = model.transcribe(
"meeting.mp3",
initial_prompt="This meeting discusses software architecture, APIs, and deployment strategies."
)
# Medical content
result = model.transcribe(
"consultation.mp3",
initial_prompt="This is a medical consultation about patient symptoms and treatment."
)
5. Réutiliser les instances du modèle
# Load once, reuse multiple times
model = whisper.load_model("base")
# Process multiple files
for audio_file in ["file1.mp3", "file2.mp3", "file3.mp3"]:
result = model.transcribe(audio_file)
# Process result...
6. Gérer de longs fichiers audio
Pour les fichiers audio très longs, envisagez de les découper en segments :
import whisper
from pydub import AudioSegment
def transcribe_long_audio(audio_path, chunk_length_ms=600000): # 10 minutes
"""Transcribe long audio by splitting into chunks."""
model = whisper.load_model("base")
# Load audio
audio = AudioSegment.from_file(audio_path)
duration_ms = len(audio)
all_text = []
all_segments = []
# Process in chunks
for i in range(0, duration_ms, chunk_length_ms):
chunk = audio[i:i + chunk_length_ms]
chunk_path = f"chunk_{i}.wav"
chunk.export(chunk_path, format="wav")
result = model.transcribe(chunk_path)
all_text.append(result["text"])
all_segments.extend(result["segments"])
# Clean up chunk file
os.remove(chunk_path)
return {
"text": " ".join(all_text),
"segments": all_segments
}
Problèmes courants et solutions
Problème 1 : FFmpeg introuvable
Erreur :
FileNotFoundError: ffmpegSolution :
# Install FFmpeg
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt install ffmpeg
# Verify
ffmpeg -version
Problème 2 : mémoire insuffisante
Erreur :
RuntimeError: CUDA out of memory ou le système manque de RAMSolutions :
# Use smaller model
model = whisper.load_model("base") # Instead of "large"
# Or use CPU
import torch
model = whisper.load_model("base", device="cpu")
# Or process in chunks (see above)
Problème 3 : transcription lente
Problème : la transcription est très lente
Solutions :
# Use GPU if available
import torch
device = "cuda" if torch.cuda.is_available() else "cpu"
model = whisper.load_model("base", device=device)
# Use smaller model
model = whisper.load_model("tiny") # or "base"
# Reduce beam size (faster but slightly less accurate)
result = model.transcribe("audio.mp3", beam_size=1)
Problème 4 : précision insuffisante
Problème : la transcription comporte de nombreuses erreurs
Solutions :
# Use larger model
model = whisper.load_model("medium") # or "large"
# Specify language
result = model.transcribe("audio.mp3", language="en")
# Provide context
result = model.transcribe(
"audio.mp3",
initial_prompt="Context about the audio content..."
)
# Use optimal settings
result = model.transcribe(
"audio.mp3",
temperature=0.0,
beam_size=5,
best_of=5
)
Cas d’usage
1. Transcription de podcasts
model = whisper.load_model("medium")
result = model.transcribe("podcast.mp3", language="en")
# Save transcript
with open("podcast_transcript.txt", "w") as f:
f.write(result["text"])
2. Génération de sous-titres YouTube
model = whisper.load_model("base")
result = model.transcribe("video.mp4", language="en")
# Generate SRT
# (Use CLI: whisper video.mp4 --output_format srt)
3. Comptes rendus de réunion
model = whisper.load_model("base")
result = model.transcribe(
"meeting.mp3",
language="en",
initial_prompt="This is a business meeting discussing project updates and deadlines."
)
# Save with timestamps
for segment in result["segments"]:
print(f"[{segment['start']:.0f}s] {segment['text']}")
4. Transcription d’entretiens
model = whisper.load_model("medium")
result = model.transcribe("interview.mp3", language="en")
# Export for editing
with open("interview.txt", "w") as f:
for segment in result["segments"]:
f.write(f"[{segment['start']:.2f}s] {segment['text']}\n")
5. Traduction de contenu multilingue
model = whisper.load_model("base")
# Translate to English
result = model.transcribe("spanish_audio.mp3", task="translate")
print(result["text"]) # English translation
Whisper par rapport aux alternatives
| Fonctionnalité | Whisper | API cloud | Faster-Whisper |
|---|---|---|---|
| Coût | Gratuit | Payant à la minute | Gratuit |
| Hors ligne | ✅ | ❌ | ✅ |
| Vitesse | Moyenne | Rapide | Rapide (2–4×) |
| Précision | Élevée | Élevée | Élevée (identique) |
| Installation | Facile | Très facile | Facile |
| Temps réel | ❌ | ✅ | ❌ |
| Confidentialité | ✅ Local | ❌ Cloud | ✅ Local |
Choisissez Whisper lorsque :
- vous voulez une transcription gratuite et hors ligne
- la confidentialité est importante
- vous avez le contrôle de l’infrastructure
- vous traitez des fichiers par lots ou du contenu archivé
Choisissez les API cloud lorsque :
- vous avez besoin de transcription en temps réel
- vous voulez une infrastructure gérée
- vous avez un budget pour les coûts d’API
- vous avez besoin d’un support entreprise
Étapes suivantes
Maintenant que vous maîtrisez les bases, approfondissez ici :
- Whisper Python Example – exemples Python plus détaillés
- Faster-Whisper Guide – transcription 2 à 4× plus rapide
- Whisper Accuracy Tips – améliorer la qualité de transcription
- Whisper Transcript Formatting – formater les sorties (SRT, VTT, JSON)
- Whisper for Meetings – transcription orientée réunions
Conclusion
OpenAI Whisper compte parmi les modèles parole vers texte open source les plus puissants disponibles aujourd’hui. Avec une solide prise en charge multilingue, une grande précision de transcription et une capacité entièrement hors ligne, c’est un excellent choix pour les développeurs et les créateurs qui veulent un contrôle total sur leur flux de transcription.
Points clés :
- Whisper prend en charge plus de 99 langues avec une haute précision
- Choisissez la taille de modèle adaptée à vos besoins
- Indiquez la langue lorsqu’elle est connue pour de meilleures performances
- Utilisez les horodatages au niveau du mot pour un repérage précis
- Réutilisez les instances du modèle pour plusieurs fichiers
- Envisagez faster-whisper pour les déploiements en production
Que vous transcriviez des podcasts, génériez des sous-titres ou traitiez des enregistrements de réunion, Whisper offre une solution robuste, gratuite et respectueuse de la vie privée pour la transcription parole vers texte.
Vous cherchez une solution professionnelle parole vers texte ? Visitez SayToWords pour découvrir notre plateforme de transcription par IA, aux performances optimisées et avec plusieurs formats de sortie.