HomeBlog → Who said what: separating speakers in a transcript

Who said what: separating speakers in a transcript

Published 2026-08-05 · 5 min read

This is the most common question about transcription and the one with the least satisfying answer: a single mixed recording comes back as one stream of text, without labels. The good news is that in most real situations you can get the split anyway — usually by changing how you record, not how you transcribe.

What the API does and does not do

Straight answer, so nothing is built on a wrong assumption: the transcription endpoint returns text and timed segments. It does not return speaker labels, and no parameter turns that on.

Diarisation — deciding how many people are speaking and which of them said each sentence — is a separate task from recognition. It is genuinely hard on overlapping speech, similar voices and noisy rooms, and models that do it are separate models.

So the practical question is not "how do I enable it" but "how do I arrange things so I do not need it".

Option 1: record each speaker separately

The best option by a wide margin, and the cheapest — it costs nothing but a decision made before recording.

Transcribe each file on its own and you get a perfect split. Interleave by timestamp to reconstruct the conversation:

rows = []
for name, path in [("Interviewer", "a.mp3"), ("Guest", "b.mp3")]:
    with open(path, "rb") as f:
        r = client.audio.transcriptions.create(
            model="whisper-1", file=f, response_format="verbose_json")
    rows += [(s.start, name, s.text.strip()) for s in r.segments]

for start, name, text in sorted(rows):
    print(f"[{int(start)//60:02d}:{int(start)%60:02d}] {name}: {text}")

Option 2: split the stereo channels

If the recording is stereo with one person per channel — common in telephony and in some recorders — the split already exists inside the file:

ffmpeg -i call.wav -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wav

Then transcribe the two files and interleave as above. Check first that the channels really are separated — run the file through a player and listen to each side. A stereo file with both voices in both channels gains nothing from this.

Option 3: label it afterwards

For a two-person conversation, turns alternate predictably and the roles are usually obvious from the content — one person asks, the other answers. Reading through an hour of transcript and adding names takes a few minutes.

A language model can draft the labelling from the text, but treat the result as a draft: it infers from wording, so it will confidently mislabel a passage where both people agree with each other. Spot-check against the timings before publishing anything.

Option 4: a separate diarisation model

If you genuinely need automatic labelling on mixed audio — a research corpus, a compliance archive, meetings you do not control — the path is a dedicated diarisation model that produces speaker turns with timings, which you then align with the transcript segments.

What this costs, realistically: another model to run and maintain, GPU time on top of transcription, and accuracy that degrades exactly where you need it most — overlapping speech and short interjections. It is a real project, not a parameter.

Before starting it, check whether options 1 to 3 cover your case. In practice they cover most of them.

Which option fits which situation

SituationBest approach
Interview you are arrangingTwo recorders, one per person
Sales or support callsPer-leg recording in the telephony platform
Zoom meeting you hostSeparate audio file per participant
Stereo recording, one voice per channelSplit the channels with ffmpeg
Two-person conversation, mixed fileLabel by hand after transcription
Large archive you do not controlDedicated diarisation model

One more thing worth checking before investing: how often does anyone actually use the speaker labels? For meeting notes and call quality checks the decisions matter far more than who voiced them, and a lot of diarisation work gets built for a requirement nobody had.

Try it on your own recordings. Sign-up takes a minute, and the free minutes are enough to judge the quality.

Get a free API key

Frequently asked questions

Can the API label speakers automatically?

No. It returns text and timed segments; speaker labels are a separate task and no parameter enables them. The practical answer is to record participants separately.

What is the easiest way to get the split?

Record each speaker to a separate file or channel. Transcribing them independently gives an exact split and costs nothing beyond arranging the recording.

How do I merge separate tracks back into a conversation?

Request verbose_json for each track, tag every segment with the speaker name, then sort all segments by start time.

Can a language model figure out who said what?

It can draft a labelling from the wording, but it infers rather than knows — it will mislabel passages where both people say similar things. Treat it as a draft and spot-check against the audio.

Is it worth running a separate diarisation model?

Only for archives you cannot re-record — a research corpus or compliance material. It means another model, more GPU time, and the weakest accuracy exactly on overlapping speech.

Related reading