Quickstart: transcribe speech in realtime
Get an API key
Get an API key
Connect and stream
Connect and stream
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())You should see
You should see
{"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": []}Going further