Guide de démarrage : transcrire la parole en temps réel
Diffusez de l'audio en direct vers l'API de transcription en temps réel et obtenez une transcription à faible latence. Pour la transcription hors ligne de fichiers préenregistrés, consultez Transcrire un fichier audio.
Obtenir la clé API
Vous avez d'abord besoin d'une clé API Mistral. Si vous n'en avez pas, rendez-vous sur Studio. Accédez à la section Clés API et créez une nouvelle clé API.
Stockez votre clé API dans la variable d'environnement MISTRAL_API_KEY :
export MISTRAL_API_KEY="your-api-key"Installer le SDK
Le client de transcription en temps réel nécessite l'extra realtime.
pip install "mistralai[realtime]"Connecter et diffuser
L'API temps réel utilise une connexion WebSocket. Le SDK ouvre la connexion, envoie des fragments audio en streaming au serveur et produit les événements de transcription à mesure qu'ils arrivent. L'exemple ci-dessous lit un fichier WAV par fragments de 100 ms et les envoie au rythme du temps réel pour simuler un micro en direct. Pour une entrée micro réelle, remplacez read_chunks par votre source audio.
import asyncio
import os
import wave
from mistralai.client import Mistral
from mistralai.client.models import (
AudioFormat,
RealtimeTranscriptionError,
TranscriptionStreamDone,
TranscriptionStreamTextDelta,
)
AUDIO_FILE = "support_call.wav" # 16-bit mono PCM WAV
async def read_chunks(path):
with wave.open(path, "rb") as wav:
while chunk := wav.readframes(wav.getframerate() // 10):
yield chunk
await asyncio.sleep(0.1) # send 100 ms of audio every 100 ms, like a live source
async def main():
with wave.open(AUDIO_FILE, "rb") as wav:
sample_rate = wav.getframerate()
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
async for event in client.audio.realtime.transcribe_stream(
read_chunks(AUDIO_FILE),
model="voxtral-mini-transcribe-realtime-3",
audio_format=AudioFormat(encoding="pcm_s16le", sample_rate=sample_rate),
):
if isinstance(event, TranscriptionStreamTextDelta):
print(event.text, end="", flush=True)
elif isinstance(event, TranscriptionStreamDone):
print(f"\n\nFinal transcript: {event.text}")
elif isinstance(event, RealtimeTranscriptionError):
print(f"\nError: {event.error.message}")
asyncio.run(main())Ce que vous devriez voir
{"type": "session.created", "session": {"request_id": "ws-01a11613-b3a1-76af-bdfa-cb3c9984cc42", "model": "voxtral-mini-transcribe-realtime-3", "audio_format": {"encoding": "pcm_s16le", "sample_rate": 16000}, "target_streaming_delay_ms": null, "diarize": false, "context_bias": [], "language": null, "speaker_references": null, "turn_detection": null}}
{"type": "session.updated", "session": {"request_id": "ws-01a11613-b3a1-76af-bdfa-cb3c9984cc42", "model": "voxtral-mini-transcribe-realtime-3", "audio_format": {"encoding": "pcm_s16le", "sample_rate": 24000}, "target_streaming_delay_ms": null, "diarize": false, "context_bias": [], "language": null, "speaker_references": null, "turn_detection": null}}
{"type": "transcription.text.delta", "text": "Thanks"}
{"type": "transcription.text.delta", "text": " for"}
{"type": "transcription.text.delta", "text": " calling"}
{"type": "transcription.text.delta", "text": " Harm"}
{"type": "transcription.done", "model": "voxtral-mini-transcribe-realtime-3", "text": "Thanks for calling Harmattan Support. This is Jane. How can I help you today? [...]", "language": null, "segments": []}