Aller au contenu principal

L'API Whisper : transcription audio

L’API Whisper : transcription audio

Whisper est le modèle de reconnaissance vocale d’OpenAI. Contrairement à la Realtime API qui traite l’audio en streaming, l’API Whisper fonctionne en mode fichier : vous envoyez un fichier audio complet et recevez la transcription. C’est l’outil idéal pour transcrire des enregistrements, des podcasts, des réunions ou tout audio préenregistré.

Whisper dans l’écosystème OpenAI

Service Usage Mode
Whisper (API Audio) Transcription de fichiers audio Fichier complet → texte
Realtime API Conversation vocale temps réel Streaming bidirectionnel
TTS API Synthèse vocale Texte → audio

Première transcription

L’API Whisper est accessible via l’endpoint /v1/audio/transcriptions. Voici un appel simple avec le SDK Python :

from openai import OpenAI

client = OpenAI()

with open("enregistrement.mp3", "rb") as audio_file:
    transcription = client.audio.transcriptions.create(
        model="whisper-1",
        file=audio_file
    )

print(transcription.text)

C’est aussi simple que cela. Whisper détecte automatiquement la langue et produit une transcription de haute qualité.

Avec des options avancées

transcription = client.audio.transcriptions.create(
    model="whisper-1",
    file=audio_file,
    language="fr",              # Forcer la langue (code ISO 639-1)
    response_format="verbose_json",  # Format détaillé
    temperature=0.0,            # Déterministe
    prompt="Réunion de direction concernant le projet Corsen AI"
)

Le paramètre prompt est particulièrement utile : il guide Whisper sur le contexte (noms propres, termes techniques, style). Ce n’est pas un prompt système, mais un indice contextuel.

Formats de réponse

Whisper propose plusieurs formats de sortie :

# Texte brut (par défaut)
transcription = client.audio.transcriptions.create(
    model="whisper-1",
    file=audio_file,
    response_format="text"
)
# → "Bonjour, bienvenue dans notre réunion hebdomadaire."

# JSON simple
transcription = client.audio.transcriptions.create(
    model="whisper-1",
    file=audio_file,
    response_format="json"
)
# → {"text": "Bonjour, bienvenue dans notre réunion hebdomadaire."}

# JSON verbeux avec timestamps
transcription = client.audio.transcriptions.create(
    model="whisper-1",
    file=audio_file,
    response_format="verbose_json"
)
# → {"text": "...", "segments": [...], "language": "fr", "duration": 45.2}

Le format verbose_json

Le format verbeux est le plus riche. Il inclut des segments avec timestamps, ce qui permet le sous-titrage :

for segment in transcription.segments:
    start = segment["start"]
    end = segment["end"]
    text = segment["text"]
    print(f"[{start:.1f}s - {end:.1f}s] {text}")

# [0.0s - 3.2s]  Bonjour, bienvenue dans notre réunion hebdomadaire.
# [3.2s - 7.1s]  Aujourd'hui nous allons discuter des résultats du trimestre.

Formats SRT et VTT

Pour le sous-titrage, Whisper peut générer directement des fichiers de sous-titres :

# Format SRT (SubRip)
srt_output = client.audio.transcriptions.create(
    model="whisper-1",
    file=audio_file,
    response_format="srt"
)

# Format VTT (WebVTT)
vtt_output = client.audio.transcriptions.create(
    model="whisper-1",
    file=audio_file,
    response_format="vtt"
)

Transcription par segments

Pour les fichiers longs, il est recommandé de découper l’audio en segments. L’API a une limite de 25 Mo par fichier :

from pydub import AudioSegment

def split_audio(file_path, segment_length_ms=300000):
    """Découpe un fichier audio en segments de 5 minutes."""
    audio = AudioSegment.from_file(file_path)
    segments = []

    for i in range(0, len(audio), segment_length_ms):
        segment = audio[i:i + segment_length_ms]
        segment_path = f"/tmp/segment_{i // segment_length_ms}.mp3"
        segment.export(segment_path, format="mp3")
        segments.append(segment_path)

    return segments

def transcribe_long_audio(file_path):
    """Transcrit un fichier audio long en le découpant."""
    segments = split_audio(file_path)
    full_text = []

    for segment_path in segments:
        with open(segment_path, "rb") as f:
            result = client.audio.transcriptions.create(
                model="whisper-1",
                file=f,
                language="fr"
            )
            full_text.append(result.text)

    return " ".join(full_text)

Points clés à retenir

  • Whisper transcrit des fichiers audio complets (pas du streaming) avec détection automatique de la langue
  • Le paramètre prompt guide la transcription sur le vocabulaire et le contexte attendus
  • Le format verbose_json fournit des timestamps par segment pour le sous-titrage
  • Les formats srt et vtt génèrent directement des fichiers de sous-titres
  • Pour les fichiers longs, découpez l’audio en segments de 5 minutes (limite 25 Mo par requête)