Passer au contenu principal
@ai_kit/core inclut une transcription temps réel full-duplex : vous poussez des chunks audio au fil de l’eau (micro, flux live) sur une connexion WebSocket et recevez les deltas de transcription à mesure qu’ils arrivent. C’est compatible avec l’API realtime de Mistral (modèle Voxtral).
À ne pas confondre avec createTranscriptionStreamingModel (voir Transcription audio), qui streame la sortie d’un fichier complet déjà envoyé. Ici, c’est l’entrée qui est poussée en continu — idéal pour un micro.

Pourquoi un client WebSocket natif ?

Le SDK Vercel AI (ai) ne propose aucune primitive de transcription temps réel : experimental_transcribe / transcribe et l’interface TranscriptionModelV3 sont batch uniquement. @ai_kit/core fournit donc un petit client WebSocket direct — sans dépendance runtime supplémentaire (le WebSocket global de Node ≥ 22 envoie l’en-tête Authorization: Bearer via undici).

Deux primitives publiques

Format audio

Mistral attend du PCM brut pcm_s16le, 16 000 Hz, mono. Aucune conversion n’est embarquée. Pour convertir un fichier avec ffmpeg :
Une capture micro est en général déjà du PCM 16-bit mono — aucune conversion nécessaire.

Démarrage rapide — transcribeStream (haut niveau)

Idéal pour transcrire un fichier ou un flux que vous pouvez itérer. Vous passez un AsyncIterable<Uint8Array> de PCM et recevez les événements jusqu’à done.
transcribeStream ouvre la connexion, pompe l’audio en tâche de fond (puis envoie flush + end), et s’arrête automatiquement après l’événement done ou error.

Micro / source poussée — connect (bas niveau)

Quand l’audio arrive via des callbacks (micro, WebSocket entrant), ouvrez une session et poussez les chunks vous-même.

Méthodes de session

Événements normalisés

Les types d’événements inconnus sont remontés en { type: "unknown", raw } (jamais d’exception) pour la compatibilité ascendante.

Configuration

Options de connexion

Gestion des erreurs

  • Échec de connexion, timeout de handshake ou abort → lève une RealtimeTranscriptionError.
  • Un événement serveur error est remonté en { type: "error", error } ; transcribeStream s’arrête après l’avoir émis (en bas niveau, c’est l’appelant qui décide).