Home → Blog → Who said what: separating speakers in a transcript
Who said what: separating speakers in a transcript
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.
- Video calls. Zoom can record each participant to a separate audio file. Teams and Meet do not, but the participants' own devices can.
- In-person interviews. Two phones, one near each person, started at the same time.
- Telephony. Most platforms can record the two legs of a call separately — this is a configuration option, not a limitation.
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
| Situation | Best approach |
|---|---|
| Interview you are arranging | Two recorders, one per person |
| Sales or support calls | Per-leg recording in the telephony platform |
| Zoom meeting you host | Separate audio file per participant |
| Stereo recording, one voice per channel | Split the channels with ffmpeg |
| Two-person conversation, mixed file | Label by hand after transcription |
| Large archive you do not control | Dedicated 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 keyFrequently 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
- How to transcribe an interview without retyping it by hand — Turning recorded interviews into usable text: how to record, what to do with two voices, timestamps for quotes, and how to check the result before publishing.
- How to transcribe meeting recordings and get usable notes — Turn Zoom, Teams and Google Meet recordings into searchable text and structured notes: where the file lives, how to transcribe it and how to extract decisions.
- How to transcribe a call recording to text — A step-by-step guide to turning phone call recordings into text through an API in minutes: Python and C# samples, response formats and the errors you will meet.