Transcrire un fichier audio : gpt-transcribe et Whisper
Sur cette page
Leçon réécrite le 3 novembre 2026. Elle enseignait
whisper-1, déprécié et arrêté le 26 février 2027. Le guide File transcription d’OpenAI recommande désormaisgpt-transcribe, qui ne fournit en revanche ni horodatages, ni sous-titres SRT ou VTT, ni réponseverbose_json: pour ces besoins,whisper-1reste le seul choix jusqu’à son arrêt. Le code lisait aussi les segments comme des dictionnaires (segment["start"]), ce qui lèveTypeErroravec le SDK Python : ce sont des objets (segment.start). Chaque appel a été vérifié avec le SDKopenai3.42.1. Sources : File transcription · Create transcription · GPT-Transcribe · Deprecations.
Transcrire un enregistrement
La transcription de fichier répond au cas le plus courant : vous avez un enregistrement terminé (une réunion, un podcast, un message vocal) et vous voulez son texte. Vous envoyez le fichier à l’endpoint /v1/audio/transcriptions, vous recevez la transcription. Pour un son qui arrive encore, d’un micro ou d’un appel, la bonne voie est la transcription en direct de l’API Realtime, vue plus loin dans ce cours.
Le fichier fait au plus 25 Mo, dans l’un des formats mp3, mp4, mpeg, mpga, m4a, wav ou webm.
Quel modèle en novembre 2026
| Modèle | Statut | À retenir |
|---|---|---|
gpt-transcribe | Recommandé | Contexte (prompt), mots-clés (keywords), langues attendues (languages), transcription en flux ; 0,0045 $ la minute |
whisper-1 | Déprécié, arrêt le 26 février 2027 | Seul modèle à fournir horodatages, verbose_json, SRT et VTT, et la traduction vers l’anglais |
gpt-4o-transcribe, gpt-4o-mini-transcribe | Dépréciés, arrêt le 26 février 2027 | Remplacés par gpt-transcribe |
gpt-4o-transcribe-diarize | Déprécié, arrêt le 26 février 2027 | Identification des locuteurs (diarized_json) |
Première transcription
from openai import OpenAI
client = OpenAI()
with open("enregistrement.mp3", "rb") as audio_file:
transcription = client.audio.transcriptions.create(
model="gpt-transcribe",
file=audio_file,
)
print(transcription.text)
Par défaut, la réponse est un objet JSON : transcription.text contient le texte, et transcription.languages les langues que le modèle a reconnues avec assez de certitude (une liste vide s’il n’a pu en identifier aucune).
Donner du contexte au modèle
Un enregistrement de réunion regorge de noms propres, de sigles et de termes maison que le modèle n’a aucune raison de connaître. gpt-transcribe accepte trois indices, à combiner :
with open("reunion.mp3", "rb") as audio_file:
transcription = client.audio.transcriptions.create(
model="gpt-transcribe",
file=audio_file,
prompt="Réunion de direction sur le projet Corsen AI et le contrat AC-42.",
keywords=["Corsen AI", "AC-42", "RGPD"],
languages=["fr", "en"],
)
print(transcription.text)
promptdécrit le contexte en une phrase, dans la langue de l’enregistrement. Ce n’est pas une consigne système : c’est un indice qui oriente la reconnaissance.keywordsliste les termes à reconnaître. Un mot-clé par entrée, sans<,>ni retour à la ligne : l’API rejette toute la requête si elle en trouve un.languagesdonne les langues attendues, en codes ISO 639-1 (fr,en,es…). Il remplace le paramètrelanguagedes anciens modèles : n’envoyez jamais les deux.
Suivre la transcription en direct
Sur un long fichier, il est inutile d’attendre la fin pour afficher le début. Avec stream=True, l’API renvoie des événements au fil du traitement, sans qu’il faille ouvrir une session Realtime :
with open("reunion.mp3", "rb") as audio_file:
stream = client.audio.transcriptions.create(
model="gpt-transcribe",
file=audio_file,
stream=True,
)
for event in stream:
if event.type == "transcript.text.delta":
print(event.delta, end="", flush=True)
elif event.type == "transcript.text.done":
print() # transcription complète dans event.text
Horodatages et sous-titres : whisper-1, jusqu’au 26 février 2027
Le guide d’OpenAI le dit explicitement : ses exemples d’horodatage au mot, de sous-titres et d’identification des locuteurs reposent sur des modèles dépréciés. Si vous en avez besoin, whisper-1 reste disponible jusqu’au 26 février 2027, et c’est le seul à accepter verbose_json et timestamp_granularities :
with open("reunion.mp3", "rb") as audio_file:
transcription = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
response_format="verbose_json",
timestamp_granularities=["segment"],
)
for segment in transcription.segments or []:
print(f"[{segment.start:.1f}s - {segment.end:.1f}s] {segment.text.strip()}")
Les segments sont des objets du SDK : on lit segment.start, et non segment["start"]. Avec timestamp_granularities=["word"], les horodatages au mot arrivent dans transcription.words, au prix d’un peu plus de latence. Le même modèle produit aussi des sous-titres prêts à l’emploi : avec response_format="srt" ou "vtt", le SDK renvoie directement le texte du fichier de sous-titres.
Le guide ne désigne pas encore de remplaçant pour ces fonctions. Si votre produit dépend des horodatages ou des sous-titres, prévoyez une solution avant le 26 février 2027.
Les fichiers longs
Au-delà de 25 Mo, compressez l’audio ou découpez-le. La documentation recommande de ne pas couper au milieu d’une phrase, ce qui fait perdre du contexte, et suggère la bibliothèque pydub pour le découpage (OpenAI ne garantit pas ce logiciel tiers). Passer la fin du morceau précédent dans prompt aide le modèle à garder la continuité, un usage du paramètre que cite le guide :
from pydub import AudioSegment
def transcrire_long(chemin: str, duree_ms: int = 10 * 60 * 1000) -> str:
"""Transcrit un enregistrement long par morceaux de 10 minutes."""
audio = AudioSegment.from_file(chemin)
textes: list[str] = []
for i, debut in enumerate(range(0, len(audio), duree_ms)):
morceau = f"morceau_{i}.mp3"
audio[debut:debut + duree_ms].export(morceau, format="mp3")
options = {"prompt": textes[-1][-500:]} if textes else {} # continuité
with open(morceau, "rb") as f:
resultat = client.audio.transcriptions.create(model="gpt-transcribe", file=f, **options)
textes.append(resultat.text)
return " ".join(textes)
Un découpage à durée fixe coupe parfois une phrase en deux : pour un rendu soigné, découpez plutôt sur les silences.
Points clés à retenir
gpt-transcribeest le modèle recommandé pour transcrire un fichier ;whisper-1et lesgpt-4o-*-transcribes’arrêtent le 26 février 2027prompt,keywordsetlanguages(et non pluslanguage) guident la reconnaissance des termes et des languesstream=Truerenvoie la transcription au fil de l’eau (transcript.text.delta), sans session Realtime- Horodatages,
verbose_json, SRT et VTT n’existent qu’avecwhisper-1, jusqu’à son arrêt ; les segments se lisent comme des objets (segment.start) - 25 Mo au plus par fichier : compressez ou découpez, de préférence sur les silences