Skip to content
KekosoDownload

Mono, stereo, or two files: what actually survives when people talk over each other

By Andrey ChmerevI build Kekoso, which records calls as separate track files, so the conclusion happens to favour what I built — the measurements and the commands are here so you can check rather than trust. Synthesised voices on an M4 Max, 7 September 2026.

Two speakers overlapping on a timeline, with the mixed and stereo versions losing the second reply entirely while separate files keep both

The question behind mono vs stereo recording for calls is usually: if I put each person in their own channel, will the transcript be better? I measured it. The answer is that it changes nothing whatsoever — and that the real problem is somewhere else entirely.

The measurement

Two synthesised voices, one sentence each, 48 words between them. Three versions of the same exchange:

  • mono mix — both voices summed into one channel with ffmpeg’s amix, as a single microphone in the room would hear them
  • stereo — speaker A in the left channel, speaker B in the right, the layout most people mean by stereo recording for transcription
  • separate files — one file per speaker

Each version transcribed with Whisper large-v3-turbo, scored against the two sentences as written.

Version Overlap Words returned WER
Mono mix 2.5 s 48 0.0%
Stereo 2.5 s 48 0.0%
Mono mix 5.5 s 29 39.6%
Mono mix 7.0 s 29 39.6%
Stereo 7.0 s 29 39.6%
Separate files any 48 0.0%

Two findings, and the second is the one that matters.

Stereo does exactly nothing

The stereo file and the mono mix produced identical transcripts — not similar, identical, character for character, in both the easy case and the hard one.

The reason is upstream of the model. Whisper’s audio loader is documented as reading “an audio file and read as mono waveform”, and the ffmpeg invocation in whisper/audio.py passes -ac 1. Your careful channel separation is summed to a single waveform before the model sees a single sample of it.

So if you have been panning participants left and right in the hope that recognition will pick them apart: it cannot, and it never could.

What actually breaks: the reply that disappears

With a 2.5-second overlap — one person finishing a sentence as the other starts — everything is fine. Zero errors, both replies present.

Push the overlap to 5.5 seconds and the transcript becomes this:

So the migration finished about an hour ago and everything looks stable on the dashboard. I want to hold the rollout until we see a full day of traffic.

That is the whole output. The second speaker said “Wait, hold on. Before you decide that, remember the billing job runs tonight and it touches the same tables” — nineteen words, an objection that changes the decision — and none of it is there. Not misheard. Absent, with nothing in the text to mark the gap.

This is the failure mode worth internalising. A garbled word is visible; you notice it and check the audio. A missing objection reads as agreement. The transcript is fluent, complete-looking, and describes a meeting where nobody raised a concern.

Separate files, not separate channels

The fix is not a channel layout. It is capturing each side into its own file, so that neither speaker can mask the other in the first place.

On a Mac that means recording your microphone and the system audio as two independent tracks: your voice in one file, everyone else’s in another. Each is transcribed on its own, so an overlap that would have swallowed a reply in a mixed recording costs nothing — the two streams never met.

It also solves attribution without diarization. Each file is one speaker by construction, so “who said what” is a property of how the recording was made rather than a guess a model makes afterwards. That is worth knowing because local speech models generally do not diarize at all.

Kekoso writes its call recordings this way — one file per track rather than one file with two channels — which is why the recommendation here matches what I build. The honest limit of the approach is the same one diarization exists for: if two people share a single microphone in a room, there is only one stream and nothing to separate.

What to do about your own recordings

If your participants take turns, mono is fine. Zero measured cost. Do not spend effort on channel layouts for a conversation that is already sequential.

If you are choosing settings for a call recorder, look for separate audio tracks, not stereo. A stereo setting is decoration for transcription purposes. A “record tracks separately” setting is the whole difference between keeping an objection and losing it.

If you already have a mixed recording of a heated conversation, treat the transcript as incomplete. Not inaccurate — incomplete, in a way that reads as complete. Where the stakes are real, listen to the passages where people talked over each other rather than trusting what came out.


How the two-track recording works on a Mac, including why it needs no Screen Recording permission, is on the call recording page. The related failure — text invented where there was no audio at all — is measured in why Whisper says “Thank you” to an empty room, and the method used for the error rates above is in how to measure word error rate on your own audio.

Questions people ask

Is stereo better than mono for transcription?

No — it makes no difference at all. I put two speakers in separate stereo channels and transcribed the file, then mixed the same two speakers to mono and transcribed that. The output was identical, word for word, in both the easy case and the hard one. Speech models downmix to mono before they see anything.

Why does stereo not help speech recognition?

Because the channels are gone before recognition starts. Whisper's audio loader runs ffmpeg with -ac 1 and its own docstring says it reads the file as a mono waveform. Whatever separation you encoded into left and right is summed away in the first step.

What happens when two people talk at the same time on one recording?

One of them can vanish completely. With a 5.5-second overlap in a 12-second exchange, the transcript contained the first speaker's lines in full and no trace of the second — 19 of 48 words gone, with nothing in the text marking the loss. Not garbled: absent.

How do I record two sides of a call separately?

Capture the microphone and the system audio as two tracks written to two files, not as two channels of one file. On a Mac the system-audio side can come from a Core Audio process tap, which needs no screen recording permission. Each file then transcribes on its own and neither speaker can mask the other.

Do separate tracks give me speaker labels?

They give you something more reliable than diarization for the two-party case: each file is one speaker by construction, so the attribution is a property of the recording rather than a guess made afterwards. It does not help if two people share one microphone — that is what diarization is for, and local models generally do not do it.

Does mono recording lose anything if people take turns?

Nothing measurable. With a 2.5-second overlap at the end of a sentence, the mono mix scored a perfect zero errors against the reference, exactly like the stereo and separate-file versions. Mono is fine right up until people start talking over each other.