
Conseils de précision Whisper : améliorer la qualité de transcription
Eric King
Author
Conseils de précision Whisper : améliorer la qualité de transcription
OpenAI Whisper est déjà l’un des modèles de reconnaissance vocale open source les plus précis, mais plusieurs stratégies permettent d’optimiser la qualité de transcription. Ce guide couvre des conseils pratiques, des exemples de code et des bonnes pratiques pour améliorer la précision de Whisper selon vos cas d’usage.
Ce guide s’adresse à :
- Les développeurs qui optimisent la précision de transcription Whisper
- Les créateurs de contenu qui transcrivent podcasts et vidéos
- Les chercheurs qui travaillent sur des données audio
- Toute personne cherchant des conseils de précision Whisper
Comprendre les facteurs de précision de Whisper
Avant les optimisations, il est utile de savoir ce qui influence la précision de Whisper :
- Qualité audio (le plus important)
- Taille du modèle
- Précision de la détection de langue
- Prétraitement audio
- Paramètres de configuration
- Durée audio et segmentation
Conseil 1 : Choisir la bonne taille de modèle
Whisper propose cinq tailles de modèle, chacune équilibre vitesse et précision différemment :
import whisper
# Model sizes from fastest to most accurate:
# tiny, base, small, medium, large
# For maximum accuracy, use medium or large
model = whisper.load_model("medium") # Best balance
# or
model = whisper.load_model("large") # Maximum accuracy
Guide de choix du modèle :
| Model | Accuracy | Speed | Use When |
|---|---|---|---|
| tiny | ⭐⭐ | ⭐⭐⭐⭐⭐ | Quick testing, simple audio |
| base | ⭐⭐⭐ | ⭐⭐⭐⭐ | General purpose, balanced |
| small | ⭐⭐⭐⭐ | ⭐⭐⭐ | Good accuracy, reasonable speed |
| medium | ⭐⭐⭐⭐⭐ | ⭐⭐ | High accuracy needed |
| large | ⭐⭐⭐⭐⭐⭐ | ⭐ | Best accuracy, noisy audio |
Exemple de code :
import whisper
def transcribe_with_optimal_model(audio_path, prioritize_accuracy=True):
"""
Select model based on accuracy vs speed priority.
Args:
audio_path: Path to audio file
prioritize_accuracy: True for accuracy, False for speed
"""
if prioritize_accuracy:
model_size = "medium" # or "large" for best accuracy
else:
model_size = "base" # or "small" for balanced
model = whisper.load_model(model_size)
result = model.transcribe(audio_path)
return result
# For critical transcriptions
result = transcribe_with_optimal_model("important_meeting.mp3", prioritize_accuracy=True)
À retenir : Utilisez les modèles
medium ou large lorsque la précision est critique. Le compromis sur la vitesse en vaut généralement la peine pour un contenu important.Conseil 2 : Indiquer la langue lorsqu’elle est connue
Whisper peut détecter la langue automatiquement, mais une spécification explicite améliore la précision :
import whisper
model = whisper.load_model("base")
# Auto-detect (less accurate)
result_auto = model.transcribe("audio.mp3")
# Specify language (more accurate)
result_en = model.transcribe("audio.mp3", language="en")
result_zh = model.transcribe("audio.mp3", language="zh")
result_es = model.transcribe("audio.mp3", language="es")
Pourquoi c’est utile :
- Moins d’erreurs de détection de langue
- Meilleure précision pour les locuteurs multilingues
- Traitement plus rapide (étape de détection sautée)
- Meilleure gestion des accents et dialectes
Exemple avec détection de langue :
import whisper
import langdetect
def transcribe_with_language_detection(audio_path, model_size="base"):
"""
Detect language first, then transcribe with explicit language.
"""
model = whisper.load_model(model_size)
# Quick language detection
result_quick = model.transcribe(audio_path, language=None)
detected_lang = result_quick["language"]
# Re-transcribe with detected language for better accuracy
result = model.transcribe(audio_path, language=detected_lang)
return result
result = transcribe_with_language_detection("audio.mp3")
Conseil 3 : Prétraiter l’audio avant transcription
Le prétraitement peut nettement améliorer la précision de Whisper :
import whisper
import numpy as np
from scipy.io import wavfile
from scipy import signal
def preprocess_audio(audio_path, output_path):
"""
Preprocess audio to improve transcription accuracy.
"""
# Read audio file
sample_rate, audio = wavfile.read(audio_path)
# Normalize audio (scale to [-1, 1])
if audio.dtype == np.int16:
audio = audio.astype(np.float32) / 32768.0
elif audio.dtype == np.int32:
audio = audio.astype(np.float32) / 2147483648.0
# Remove DC offset
audio = audio - np.mean(audio)
# Normalize volume
max_val = np.max(np.abs(audio))
if max_val > 0:
audio = audio / max_val * 0.95 # Leave headroom
# Resample to 16kHz (Whisper's optimal sample rate)
if sample_rate != 16000:
num_samples = int(len(audio) * 16000 / sample_rate)
audio = signal.resample(audio, num_samples)
sample_rate = 16000
# Save preprocessed audio
wavfile.write(output_path, sample_rate, (audio * 32767).astype(np.int16))
return output_path
# Usage
preprocessed = preprocess_audio("raw_audio.wav", "preprocessed.wav")
model = whisper.load_model("base")
result = model.transcribe(preprocessed)
Étapes de prétraitement :
- Normaliser les niveaux – volume homogène
- Supprimer l’offset DC – éliminer un biais constant
- Rééchantillonner à 16 kHz – fréquence optimale pour Whisper
- Supprimer le silence – se concentrer sur la parole
- Réduire le bruit – nettoyer l’arrière-plan
Conseil 4 : Utiliser la température pour de meilleurs résultats
Le paramètre
temperature de Whisper contrôle l’aléa. Des valeurs plus basses peuvent améliorer la précision :import whisper
model = whisper.load_model("base")
# Default temperature (0.0)
result_default = model.transcribe("audio.mp3")
# Lower temperature for more deterministic results
result_low_temp = model.transcribe(
"audio.mp3",
temperature=0.0, # Most deterministic
best_of=5, # Try multiple decodings, pick best
beam_size=5 # Beam search size
)
Réglages de température :
temperature=0.0: le plus déterministe, meilleur pour la précisiontemperature=0.2: légère aléa, bon équilibretemperature=0.6: défaut, équilibré- Valeurs plus élevées : plus créatif mais moins précis
Bonne pratique :
def transcribe_with_optimal_settings(audio_path, model_size="base"):
"""
Use optimal settings for maximum accuracy.
"""
model = whisper.load_model(model_size)
result = model.transcribe(
audio_path,
temperature=0.0, # Most deterministic
best_of=5, # Try 5 decodings, pick best
beam_size=5, # Beam search
patience=1.0, # Patience for beam search
condition_on_previous_text=True, # Use context
initial_prompt="This is a conversation about technology." # Context hint
)
return result
Conseil 5 : Fournir un prompt initial de contexte
Donner du contexte sur le contenu améliore la précision :
import whisper
model = whisper.load_model("base")
# Without context
result_basic = model.transcribe("meeting.mp3")
# With context (much better accuracy)
result_context = model.transcribe(
"meeting.mp3",
initial_prompt="This is a business meeting discussing project timelines and deliverables."
)
# For technical content
result_tech = model.transcribe(
"lecture.mp3",
initial_prompt="This is a computer science lecture about machine learning and neural networks."
)
Quand utiliser des prompts initiaux :
- Contenu technique : inclure des termes du domaine
- Noms et lieux : mentionner les noms propres importants
- Accents : décrire l’accent ou le dialecte
- Contexte : décrire le cadre ou le sujet
Exemple :
def transcribe_with_context(audio_path, context_description):
"""
Transcribe with context for better accuracy.
"""
model = whisper.load_model("medium")
result = model.transcribe(
audio_path,
initial_prompt=context_description,
language="en"
)
return result
# Example usage
result = transcribe_with_context(
"interview.mp3",
"This is an interview with Dr. Sarah Johnson about medical research. "
"The conversation includes technical medical terminology."
)
Conseil 6 : Gérer correctement les fichiers audio longs
Les fichiers très longs peuvent réduire la précision. Voici comment les traiter :
import whisper
from pydub import AudioSegment
import os
def transcribe_long_audio(audio_path, model_size="base", chunk_length_minutes=30):
"""
Transcribe long audio by splitting into optimal chunks.
"""
model = whisper.load_model(model_size)
# Load audio
audio = AudioSegment.from_file(audio_path)
chunk_length_ms = chunk_length_minutes * 60 * 1000
# Split into chunks
chunks = []
for i in range(0, len(audio), chunk_length_ms):
chunks.append(audio[i:i + chunk_length_ms])
# Transcribe each chunk
full_text = []
all_segments = []
for i, chunk in enumerate(chunks):
chunk_path = f"temp_chunk_{i}.wav"
chunk.export(chunk_path, format="wav")
print(f"Transcribing chunk {i+1}/{len(chunks)}")
result = model.transcribe(chunk_path)
# Adjust timestamps for chunk offset
offset = i * chunk_length_ms / 1000.0
for segment in result["segments"]:
segment["start"] += offset
segment["end"] += offset
all_segments.append(segment)
full_text.append(result["text"])
# Clean up
os.remove(chunk_path)
# Combine results
combined_result = {
"text": " ".join(full_text),
"segments": all_segments,
"language": result["language"]
}
return combined_result
# Usage
result = transcribe_long_audio("long_podcast.mp3", model_size="medium", chunk_length_minutes=30)
Bonnes pratiques pour l’audio long :
- Découper en morceaux de 20 à 30 minutes
- Utiliser la même taille de modèle pour tous les morceaux
- Conserver le contexte entre les morceaux
- Fusionner les segments avec des horodatages corrects
Conseil 7 : Optimiser pour l’audio bruité
Whisper gère bien le bruit, mais on peut faire mieux :
import whisper
import noisereduce as nr
import soundfile as sf
import numpy as np
def transcribe_noisy_audio(audio_path, model_size="medium"):
"""
Reduce noise before transcription for better accuracy.
"""
# Load audio
audio, sample_rate = sf.read(audio_path)
# Reduce noise
reduced_noise = nr.reduce_noise(
y=audio,
sr=sample_rate,
stationary=False, # For non-stationary noise
prop_decrease=0.8 # Reduce noise by 80%
)
# Save cleaned audio
cleaned_path = "cleaned_audio.wav"
sf.write(cleaned_path, reduced_noise, sample_rate)
# Transcribe with larger model (better for noisy audio)
model = whisper.load_model(model_size)
result = model.transcribe(cleaned_path)
# Clean up
os.remove(cleaned_path)
return result
# Usage
result = transcribe_noisy_audio("noisy_recording.mp3", model_size="medium")
Pour l’audio bruité :
- Utiliser les modèles
mediumoularge - Prétraiter avec réduction de bruit
- Augmenter le paramètre
best_of - Fournir du contexte sur les conditions de bruit
Conseil 8 : Utiliser les horodatages au mot pour plus de contrôle
Les horodatages au niveau du mot offrent un contrôle plus fin :
import whisper
model = whisper.load_model("base")
# Get word timestamps
result = model.transcribe(
"audio.mp3",
word_timestamps=True # Enable word-level timestamps
)
# Access word timestamps
for segment in result["segments"]:
print(f"Segment: {segment['text']}")
print(f"Start: {segment['start']:.2f}s, End: {segment['end']:.2f}s")
if "words" in segment:
for word in segment["words"]:
print(f" Word: {word['word']} ({word['start']:.2f}s - {word['end']:.2f}s)")
Cas d’usage :
- Sous-titres : synchronisation précise au mot près
- Correction d’erreurs : repérer les mots problématiques
- Recherche : trouver des mots dans la transcription
- Analyse de la parole : patterns de parole
Conseil 9 : Combiner plusieurs décodages
Le paramètre
best_of essaie plusieurs décodages et retient le meilleur :import whisper
model = whisper.load_model("base")
# Single decoding (default)
result_single = model.transcribe("audio.mp3")
# Multiple decodings, pick best (more accurate)
result_best = model.transcribe(
"audio.mp3",
best_of=5, # Try 5 decodings
temperature=(0.0, 0.2, 0.4, 0.6, 0.8) # Different temperatures
)
Compromis :
- Précision : plus élevée avec plusieurs décodages
- Vitesse : plus lente (×5 pour
best_of=5) - À utiliser quand : la précision est critique, la vitesse moins
Conseil 10 : Post-traiter les transcriptions
Le post-traitement peut corriger des erreurs fréquentes de Whisper :
import re
import whisper
def post_process_transcript(text):
"""
Fix common transcription errors.
"""
# Fix common contractions
text = re.sub(r"\b(\w+) '(\w+)\b", r"\1'\2", text) # Fix spacing in contractions
# Fix common homophones (add your own)
replacements = {
"there": "their", # Context-dependent
"its": "it's", # Context-dependent
# Add more based on your domain
}
# Capitalize sentences
sentences = re.split(r'([.!?]\s+)', text)
capitalized = []
for i, sentence in enumerate(sentences):
if sentence.strip():
capitalized.append(sentence[0].upper() + sentence[1:] if len(sentence) > 1 else sentence.upper())
else:
capitalized.append(sentence)
return "".join(capitalized)
# Usage
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
processed_text = post_process_transcript(result["text"])
Exemple complet : optimisation de précision prête pour la production
Exemple combinant plusieurs conseils de précision :
import whisper
import os
from pathlib import Path
def transcribe_with_maximum_accuracy(
audio_path,
model_size="medium",
language=None,
context_prompt=None,
output_format="txt"
):
"""
Transcribe audio with maximum accuracy using best practices.
Args:
audio_path: Path to audio file
model_size: Whisper model size (medium or large recommended)
language: Language code (None for auto-detect)
context_prompt: Initial prompt for context
output_format: Output format (txt, json, srt)
"""
# Load model (medium or large for best accuracy)
print(f"Loading Whisper model: {model_size}")
model = whisper.load_model(model_size)
# Prepare transcription parameters
transcribe_kwargs = {
"temperature": 0.0, # Most deterministic
"best_of": 5, # Try multiple decodings
"beam_size": 5, # Beam search
"patience": 1.0,
"condition_on_previous_text": True,
"word_timestamps": True, # Get word-level timestamps
}
# Add language if specified
if language:
transcribe_kwargs["language"] = language
# Add context prompt if provided
if context_prompt:
transcribe_kwargs["initial_prompt"] = context_prompt
# Transcribe
print(f"Transcribing: {audio_path}")
result = model.transcribe(audio_path, **transcribe_kwargs)
# Post-process
result["text"] = post_process_transcript(result["text"])
# Save result
base_name = Path(audio_path).stem
output_path = f"{base_name}_transcript.{output_format}"
if output_format == "txt":
with open(output_path, "w", encoding="utf-8") as f:
f.write(result["text"])
elif output_format == "json":
import json
with open(output_path, "w", encoding="utf-8") as f:
json.dump(result, f, indent=2, ensure_ascii=False)
print(f"✓ Transcription saved: {output_path}")
print(f" Language: {result['language']}")
print(f" Duration: {result['segments'][-1]['end']:.2f}s")
return result
# Example usage
result = transcribe_with_maximum_accuracy(
audio_path="important_meeting.mp3",
model_size="medium",
language="en",
context_prompt="This is a business meeting discussing quarterly results and project updates.",
output_format="txt"
)
Comparaison de précision : avant et après optimisation
Ce que vous pouvez attendre après optimisation :
| Optimization | Accuracy Improvement | Speed Impact |
|---|---|---|
| Model size (base → medium) | +15-20% | -50% |
| Language specification | +5-10% | +10% (faster) |
| Initial prompt | +5-15% | No impact |
| Temperature=0.0 | +2-5% | No impact |
| best_of=5 | +3-8% | -80% (5x slower) |
| Audio preprocessing | +10-20% | Minimal |
Les gains combinés peuvent augmenter la précision de 30 à 50 % par rapport aux réglages par défaut.
Synthèse des bonnes pratiques
Pour une précision maximale :
- ✅ Utiliser le modèle
mediumoularge - ✅ Spécifier explicitement la langue
- ✅ Fournir du contexte avec
initial_prompt - ✅ Utiliser
temperature=0.0pour des résultats déterministes - ✅ Activer
word_timestampspour une sortie détaillée - ✅ Prétraiter l’audio bruité
- ✅ Découper les fichiers longs en morceaux
- ✅ Utiliser
best_of=5pour le contenu critique
Pour un équilibre vitesse / précision :
- ✅ Utiliser le modèle
smalloubase - ✅ Laisser Whisper détecter la langue automatiquement
- ✅ Utiliser la température par défaut
- ✅ Ne pas utiliser
best_of - ✅ Traiter les fichiers avec un prétraitement minimal
Erreurs courantes à éviter
❌ Utiliser le modèle tiny pour un contenu important
Correction : Au minimum
base, de préférence small ou medium❌ Ne pas spécifier la langue
Correction : Toujours indiquer la langue lorsqu’elle est connue
❌ Ignorer le contexte
Correction : Utiliser
initial_prompt pour le contenu spécialisé❌ Utiliser les réglages par défaut sur de l’audio bruité
Correction : Utiliser des modèles plus grands et le prétraitement
❌ Traiter de très longs fichiers d’un seul bloc
Correction : Découper en morceaux de 20 à 30 minutes
Dépannage des problèmes de précision
Problème : Faible précision sur les termes techniques
Solution :
result = model.transcribe(
"technical_audio.mp3",
initial_prompt="This audio contains technical terminology related to machine learning, neural networks, and deep learning."
)
Problème : Mauvaise précision avec les accents
Solution :
# Use larger model
model = whisper.load_model("medium")
# Provide accent context
result = model.transcribe(
"accented_audio.mp3",
initial_prompt="This speaker has a British accent.",
language="en"
)
Problème : Erreurs sur les noms propres
Solution :
# Include names in initial prompt
result = model.transcribe(
"interview.mp3",
initial_prompt="This interview features Dr. Sarah Johnson and Professor Michael Chen discussing research."
)
Conclusion
Améliorer la précision de Whisper, c’est faire les bons choix :
- Choix du modèle :
mediumoulargepour le contenu critique - Configuration : température et décodage optimaux
- Contexte : informations spécifiques au domaine
- Prétraitement : nettoyer l’audio avant transcription
- Post-traitement : corriger automatiquement les erreurs fréquentes
Points clés :
- La taille du modèle a le plus grand impact sur la précision
- La spécification de la langue améliore nettement les résultats
- Les prompts de contexte aident pour le contenu spécialisé
- Plusieurs décodages (
best_of) augmentent la précision mais ralentissent le traitement - La qualité audio reste le facteur le plus important
En suivant ces conseils de précision Whisper, vous pouvez obtenir une qualité de transcription comparable ou supérieure aux services speech-to-text commerciaux, tout en gardant le contrôle total sur vos données et votre flux de travail.
Prêt à améliorer votre précision Whisper ? Commencez par un modèle plus grand et en indiquant la langue — vous verrez des gains immédiats !