- Multilingual Transcription carries per-utterance timing, speaker labels, and optional emotion, accent, deepfake, and PII/PHI signals. Batch and streaming.
- English Fast Transcription is English-only and tuned for throughput and latency. Batch and streaming.
- Multilingual Fast Transcription returns a transcript in any supported language with no metadata. Batch only.
Every signal is off by default except speaker diarization, which defaults to
true on Multilingual Transcription and to false on English Fast Transcription.
Multilingual Transcription (batch)
Returnsapplication/json. text, duration_ms, and utterances are always present. text may be an empty string and utterances an empty array when no speech was recognized.
Language is detected per utterance, so a file where speakers switch languages reports each utterance in the language actually spoken.
Try it
Output
Response
Response
emotion, accent, and deepfake_score are null.
What you can configure
custom_terms travels only inside the JSON config field. There is no top-level form field for it.
Audio formats
Accepted extensions:.aac, .aiff, .flac, .mov, .mp3, .mp4, .ogg, .opus, .wav, .webm.
Maximum file size is 100 MB. Files above it are rejected with 413. Empty files are rejected with 400.
Multilingual Transcription (streaming)
Utterances arrive as JSON text messages while audio streams in.
Each
partial_utterance carries text, start_ms, speaker, emotion, accent, and deepfake_score. Any of those except text may be null before a value is available. Each partial replaces the previous one for the active utterance, and the finalized utterance supersedes all partials before it.
Send audio as binary WebSocket frames in any chunk size. Send an empty text frame ("") to end the stream.
Try it
Output
Messages received
Messages received
curl and websocat cannot close a stream cleanly. Use one of the clients above.
What you can configure
An optional JSON configuration can be sent as the first text frame, before any audio. Any field there overrides the matching query parameter, and it is the only way to pass
custom_terms on this endpoint. A binary first frame is treated as audio and the query-parameter defaults apply, so binary-first clients keep working unchanged.
Audio formats
Self-describing formats.wav, mp3, ogg, flac, webm, aac, aiff. Auto-detected from headers when audio_format is omitted. sample_rate and num_channels must not be sent for these.
Raw formats. s8, s16le, s16be, s24le, s24be, s32le, s32be, u8, u16le, u16be, u24le, u24be, u32le, u32be, f32le, f32be, f64le, f64be, mulaw, alaw. Headerless, so audio_format, sample_rate, and num_channels are all required.
sample_rate accepts 8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000.
English Fast Transcription (batch)
Returnsapplication/json. text and duration_ms are always present. Two independent opt-in flags each add one key: time_stamps adds words, and speaker_diarization adds utterances. An optional key is absent rather than null when its flag is off, so the response schema does not change shape as flags are toggled. When time_stamps=true and timings cannot be produced, words_unavailable is returned in place of words. Exactly one of the two is present on a time_stamps=true request.
With diarization enabled,
text becomes the time-ordered concatenation of the utterance texts.
Word timings come from aligning the finished transcript against the audio, so every entry in words matches a word in text. Every whitespace-separated token of text appears in words exactly once, in document order. A word whose characters fall outside the aligner’s vocabulary is still returned rather than dropped: timing reports partial when only a prefix of the word was measured, or estimated when the span was bracketed between its timed neighbors. On a partial word, end is extended in proportion to the untimed characters and clamped to the next word’s start, so treat it as approximate at the tail.
On the non-diarized path, word timings are produced up to a maximum audio length configured per deployment, 3600 seconds by default. Above that length the transcript is returned as normal and words_unavailable carries the audio_too_long_for_alignment reason together with the deployment’s max_audio_seconds. Setting speaker_diarization=true removes the limit, because that path aligns each speaker turn separately.
This model produces no emotion, accent, deepfake, PII/PHI, or custom vocabulary output.
Try it
Output
words covers every token of text.
Response
Response
4.51 seconds into the file, not 0.11 seconds into their turn.
With both flags off, the response is text and duration_ms only. The words and utterances keys are absent rather than empty.
What you can configure
The two flags are independent: enable either, both, or neither.
Audio formats
Accepted extensions include.mp3, .wav, .flac, .m4a, .mp4, .ogg, .opus, .webm, .aac, .aiff, and .mov, plus 85 others.
All 96 accepted extensions
All 96 accepted extensions
.3g2, .3ga, .3gp, .3gpp, .8svx, .aa3, .aac, .ac3, .act, .adts, .aif,
.aifc, .aiff, .alac, .amb, .amr, .ape, .asf, .at3, .au, .avi, .avr,
.awb, .bwf, .c2, .caf, .dss, .dts, .dtshd, .eac3, .ec3, .f4a, .f4b,
.flac, .flv, .gsm, .iff, .m2a, .m2ts, .m4a, .m4b, .m4r, .m4v, .mka,
.mkv, .mlp, .mmf, .mov, .mp+, .mp1, .mp2, .mp3, .mp4, .mpa, .mpc, .mpeg,
.mpg, .mpga, .mpp, .mts, .mxf, .nist, .oga, .ogg, .ogx, .oma, .omg,
.opus, .paf, .pvf, .qcp, .ra, .rf64, .rka, .rm, .rmvb, .sf, .shn, .snd,
.sph, .svx, .tak, .thd, .ts, .tta, .vob, .voc, .vqf, .w64, .wav,
.wave, .weba, .webm, .wma, .wmv, .wv413. Empty files are rejected with 400.
Behavior
time_stamps adds a forced-alignment pass over the audio. On short audio that pass overlaps transcription and is effectively free. Its cost grows faster than linearly with audio length, so on long recordings it can add substantial latency. Benchmark with the flag set to its production value, not with it off.
speaker_diarization transcribes each speaker turn separately rather than the file as a whole. It is slower than the default path, and the transcript it returns can differ from the same audio submitted without the flag. Do not treat a diarized text as byte-identical to an undiarized one.
With diarization enabled, quiet background speech on far-field or multi-party audio can surface as additional utterances. Overlapping speech is attributed to a single speaker per time span.
503 carries a second meaning on this endpoint: besides a temporary outage, it is returned when speaker_diarization is requested while diarization is disabled on the deployment serving the request. Retrying will not clear that case. Drop the flag, or ask about having diarization enabled.English Fast Transcription (streaming)
The lowest-latency option, and the one for cases where a person is waiting on the text.
Text in both message types is already auto-capitalized and auto-punctuated. Render
text directly.
Every connection ends with at least one final utterance. A stream containing no speech yields a single final with empty text.
Try it
Output
Messages received
Messages received
curl and websocat cannot close a stream cleanly. Use one of the clients above.
What you can configure
With
endpointing=false, the connection produces a single final utterance at end of stream covering the whole stream with start_ms=0, and each partial reflects the whole stream so far.
With endpointing=true, trailing silence closes the current utterance and starts a new one. The server emits one final utterance per speech segment, each with its own start_ms and duration_ms, and each partial reflects the current segment. The full transcript is the concatenation of the final texts. This is what makes the endpoint usable for live conversation.
Speaker labels
Withdiarize=true, each final utterance carries speaker, a zero-based index identifying who produced it. Partials never carry it. A label is assigned when an utterance is finalized and is never revised.
The index is stable for one connection and meaningless outside it: the same person on a new connection may get a different index, so it is not an identity to store or match across calls. speaker is null when diarization was requested but no speaker could be determined, which happens on very short segments and on a voice the model has not heard enough of yet. Absent is different again, and means diarize=true was not sent.
Three fields qualify the label, and two of them are the reason to read more than speaker alone:
speaker_purity below 1.0 means the utterance spans a speaker change. Segments are cut at pauses whether or not diarize is set, so a fast exchange with no pause between turns stays in one utterance and gets the label of whoever spoke most of it.
With diarize=true&endpointing=false there is only one final utterance for the whole stream, so one speaker cannot describe it. Read n_speakers there and treat speaker as indicative.
A diarized connection has a lower concurrency ceiling than plain transcription, so it can be refused with close code 1013 while a plain connection succeeds. Close code 1003 covers both an invalid diarize value and diarize=true on an instance where speaker labelling is not enabled.
Audio formats
audio_format is required on every connection, including containers. Omitting it closes the connection with 1003.
Container formats. Accepted values include mp3, wav, flac, m4a, mp4, ogg, opus, webm, aac, aiff, wma, amr, and au, plus 66 others. The header determines sample rate and channel count, and sample_rate and num_channels are ignored.
All 79 accepted container values
All 79 accepted container values
3g2, 3ga, 3gp, 3gpp, 8svx, aa3, aac, ac3, act, adts, aif, aifc, aiff,
amb, amr, asf, at3, au, avr, awb, bwf, c2, caf, dss, dts, dtshd,
eac3, ec3, f4a, f4b, flac, gsm, iff, m2a, m2ts, m4a, m4b, m4r, m4v,
mka, mkv, mlp, mp+, mp1, mp2, mp3, mp4, mpa, mpc, mpga, mpp, mts,
oga, ogg, ogx, oma, omg, opus, paf, pvf, qcp, ra, rf64, rm, rmvb,
snd, svx, thd, ts, tta, voc, vqf, w64, wav, wave, weba, webm, wma,
wmvmp4, m4a, m4b, m4r, m4v, 3gp, 3gpp, 3ga, 3g2, f4a, f4b) must be sent in a streamable layout. Anything else ends the connection with an audio-processing error.
Raw formats. s8, s16le, s16be, s24le, s24be, s32le, s32be, u8, u16le, u16be, u24le, u24be, u32le, u32be, f32le, f32be, f64le, f64be, mulaw, alaw, g722, vox. sample_rate and num_channels are both required. g722 and vox are mono-only: num_channels must be 1.
sample_rate accepts 8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000.
For the lowest end-to-end latency use audio_format=s16le&sample_rate=16000&num_channels=1, which bypasses the server’s audio decoder.
Sending container bytes while declaring a raw PCM format closes the connection with 4002.
Multilingual Fast Transcription (batch)
Returnsapplication/json. All three fields are always present.
For audio containing more than one language,
language reports the predominant one. The transcript still reflects each part in the language spoken there.
This model produces no diarization, utterance breakdown, or enrichment signals.
Try it
Output
Response
Response
What you can configure
Audio formats
Accepted extensions:.aac, .aiff, .flac, .mov, .mp3, .mp4, .ogg, .opus, .wav, .webm.
Maximum file size is 100 MB. Files above it are rejected with 413. Empty files are rejected with 400.
Error codes
This endpoint returns401 for a missing or invalid key, where the other transcription endpoints return 403. It also returns 502 when the request cannot be completed and 504 on timeout.
Multilingual Fast Transcription (streaming)
The streaming counterpart to Multilingual Fast Transcription. The spoken language is identified automatically, so no language is declared and there is no per-language endpoint. The 25 supported languages are Bulgarian, Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Maltese, Polish, Portuguese, Romanian, Russian, Slovak, Slovenian, Spanish, Swedish, Ukrainian.
Text is auto-capitalized and auto-punctuated in the language spoken. Render it directly.
Each
partial_utterance carries the complete transcript of its scope, not a delta. Replace the displayed text on every partial rather than appending.
What you can configure
Speaker labels
diarize=true behaves as it does on English Fast Transcription (streaming), with one difference that matters when sizing a conversation: four concurrent speakers are labeled here, not ten.
Labels appear on final utterances only, never on partials, and are never revised once assigned.
speaker is stable within one connection and meaningless outside it. speaker: null means diarization ran but could not assign that utterance, which is different from the field being absent.
With diarize=true and endpointing=false there is one whole-stream utterance, so read n_speakers and treat speaker as indicative.
Audio formats
audio_format is required on every connection, including containers.
Container formats. Accepted values include mp3, wav, flac, m4a, mp4, ogg, opus, webm, aac, aiff, wma, amr, and au, plus 66 others. The header determines sample rate and channel count, and sample_rate and num_channels are ignored.
All 79 accepted container values
All 79 accepted container values
3g2, 3ga, 3gp, 3gpp, 8svx, aa3, aac, ac3, act, adts, aif, aifc, aiff,
amb, amr, asf, at3, au, avr, awb, bwf, c2, caf, dss, dts, dtshd,
eac3, ec3, f4a, f4b, flac, gsm, iff, m2a, m2ts, m4a, m4b, m4r, m4v,
mka, mkv, mlp, mp+, mp1, mp2, mp3, mp4, mpa, mpc, mpga, mpp, mts,
oga, ogg, ogx, oma, omg, opus, paf, pvf, qcp, ra, rf64, rm, rmvb,
snd, svx, thd, ts, tta, voc, vqf, w64, wav, wave, weba, webm, wma,
wmvmp4, m4a, m4b, m4r, m4v, 3gp, 3gpp, 3ga, 3g2, f4a, f4b) must be sent in a streamable layout. Anything else ends the connection with an audio-processing error.
Raw formats. s8, s16le, s16be, s24le, s24be, s32le, s32be, u8, u16le, u16be, u24le, u24be, u32le, u32be, f32le, f32be, f64le, f64be, mulaw, alaw, g722, vox. sample_rate and num_channels are both required. g722 and vox are mono-only: num_channels must be 1.
sample_rate accepts 8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000.
Signals
Speaker diarization
speaker_diarization, boolean. Identifies distinct speakers and assigns each utterance a 1-indexed speaker. Numbers are consistent within one request: speaker 1 in one utterance is the same person as speaker 1 in another from the same audio. They are not consistent across separate requests or files.
Diarization is independent of language detection. In a multilingual conversation a speaker keeps one label across a language switch.
Emotion
emotion_signal, boolean. Classifies the emotional tone of each utterance from the voice signal, into emotion. Classification is acoustic, so two utterances with identical text can receive different labels if the delivery differs.
Neutral, Calm, Happy, Amused, Excited, Proud, Affectionate, Interested, Hopeful, Frustrated, Angry, Contemptuous, Concerned, Afraid, Sad, Ashamed, Bored, Tired, Surprised, Anxious, Stressed, Disgusted, Disappointed, Confused, Relieved, Confident.
For a whole-file label with no transcript, see Emotion Detection.
Accent
accent_signal, boolean. Classifies the regional or national accent of each utterance’s speaker, into accent. Results are typically stable for a speaker with a consistent accent, and vary more on short or acoustically difficult segments.
American, British, Australian, Southern, Indian, Irish, Scottish, Eastern_European, African, Asian, Latin_American, Middle_Eastern, Unknown.
For a whole-file label with no transcript, see Accent Detection.
Deepfake score
deepfake_signal, boolean. Scores each utterance for the likelihood it contains AI-generated speech, into deepfake_score.
This is one score per utterance. For frame-level verdicts across a whole file, explicit
no-content handling for silence, or verdicts on live audio without a transcript, see Deepfake Detection.
PII/PHI tagging
pii_phi_tagging, boolean. Wraps personally identifiable and personal health information in the transcript text with entity tags. Transcript content is preserved and only markup is added.
To also silence the corresponding audio ranges, use PII/PHI Redaction instead.
Language hint
language, ISO 639-1 code. By default the language is detected per utterance. Passing a code hints the expected language. BCP 47 region and script subtags such as en-US are accepted, but only the primary subtag is used. Case-insensitive.
Transport differs by endpoint, and getting it wrong produces a 400 or a silently ignored value:
An invalid code is rejected with
400 on batch endpoints, and closes streaming connections with 1003. English Fast Transcription accepts no language parameter in either mode.
Custom vocabulary
custom_terms, array. Biases transcription toward domain terms and names that would otherwise be mistranscribed. Each entry is a plain string or an object:
At most 1000 entries, and the term strings serialized together as JSON must total under 8000 characters. Blank terms and blank pronunciations are dropped.
The other transcription endpoints and both redaction endpoints do not accept custom vocabulary.