Audio intelligence is speech-to-text with speakers, word timing and acoustics built in. One pass returns the transcript, anonymous speaker labels, segment and word timestamps, per-word confidence, and an audibility reading for every region — there is no separate diarization stage to pay for, no forced-alignment service to bolt on, and no chunk-and-normalize pipeline to maintain. The model handles up to ~90 minutes in a single pass; the serving hardware sets the practical ceiling per deployment — on the current production GPU that is roughly 20 minutes per file (the model’s full context needs a larger card). Split longer recordings at silence boundaries before uploading.

When to use it

Meetings and interviews

More than one voice, and you need to know which is which.

Call review

Both sides of a call, with the timings to jump a player to any line.

Field and shoot audio

The audibility read tells you which takes are usable before anyone tries to edit them.

One voice only?

Plain transcription is cheaper and returns the same words.

Getting a diarized transcript

It rides the same endpoint as plain transcription. Pick a model that reports supports_diarization from GET /v1/audio/models and ask for verbose_json:

Word-level output

words is a flat, OpenAI-shaped array — each entry carries segment_id and speaker so you can regroup it into turns without a second pass. Word timing is on by default. Send timestamp_granularities[]=segment to skip the alignment pass — worth a few seconds of GPU on a long file.
confidence is acoustic support, not probability-of-correctness. Word timing and confidence come from force-aligning the finished transcript back to the audio, so the number says how well the audio matches the word where it was placed — it is not the recognizer’s own belief. The two come apart on hard audio: on a brown-noise-mixed clip the model transcribed every word correctly while this score collapsed. Read it as “the audio is difficult here, give it a listen”, not “this word is probably wrong”.Measured on our clip set (149 words): ECE 0.145, Brier 0.097. Measure it on your own material before gating on it — python -m evals.stt.word_confidence clip.wav prints a reliability table plus ECE, Brier and AUROC.

Audibility: on-mic dialogue vs background talk

Faint off-mic speech — crew direction bleeding into a take, a question from behind the camera — sits 30 dB or more under the dialogue. Whole-file loudness normalization does not recover it, because integrated loudness is dominated by the loud material. This service normalizes adaptively in short frames instead, which does recover it: a −35 dB utterance transcribes word-perfect with the correct speaker. That leaves a problem: after normalization every level looks the same, and the transcript cannot tell you which lines were actually on mic. So the level is measured on the pre-normalization signal, alongside the file’s own noise floor: In the example above the presenter reads 41.4 dB SNR (on_mic) and the off-camera request reads 3.3 dB (faint) — both fully transcribed, and distinguishable afterwards.

Silence, pace and language

Speaker labels (S01, S02, …) are consistent within one file but anonymous — they identify voices, not people, and reset between files. Two things also happen service-side before decoding: adaptive loudness normalization (above), and a voice-activity gate that answers silent uploads (b-roll, room tone) immediately with "text": "", empty segments, and "no_speech": true — without occupying the GPU.

Sound-event timeline

Alongside the transcript, the whole file is swept with an AudioSet tagger and returned as scene — what sound occurs when, for the entire duration, not one dominant label per asset.
Events overlap on purpose. Dialogue over a music bed in a room with traffic outside is three simultaneous answers, and a timeline that reports one winner per moment throws two of them away — we measured a speech clip mixed with broadband noise coming back 100% ambience, the speech erased. So each bucket gets its own run of events, and music + speech covering the same seconds is the normal case, not a conflict. Resolution is 2 s, and each slot is classified with a full 10 s of surrounding context. There is no duration cap — the sweep runs over the whole file.

Streaming progress

Long recordings decode for minutes. With stream=true the response is SSE: standard transcript.text.delta / transcript.text.done events, interleaved with a transcript.segment event per finished diarized segment. Each segment’s end timestamp tells you how far into the audio the model has gotten, so a progress bar is end / duration.
Streamed segments carry speaker, pace and audibility as they land. Words need the finished transcript to align against, so they arrive once at the end: the final transcript.text.done event carries the complete verbose_json payload in a verbose field, words included, so a streaming client never needs a second request for the authoritative result.

Limits

Going further

Speech to text

Plain batch transcription without speaker labels.