Capture at the source
A call has two sides, and your Mac can already hear both of them without anything joining the meeting. The far end is playing out of your speakers right now. Your own voice is going into the microphone. Both signals already live on the machine, which means the recorder never has to be in the room to get them.
To record both sides of a call on Mac, Savory reads your side from the microphone and the far side from the system audio output mix, the same stereo bus your speakers are fed from. On macOS it does this with a CoreAudio process-tap, a sanctioned way to observe the sound the Mac is already producing. The two streams are then merged onto a single clock and written as one chronology, so the transcript reads like a conversation instead of two monologues talking past each other.
Nothing dials into the call. Because the far side is read off your own output rather than off the meeting server, it does not matter which app is making the sound. Zoom, Meet, Teams, FaceTime, or a phone sitting on speaker next to the laptop all look the same to a process-tap. There is no integration list because there is nothing to integrate with. We argued the case for refusing the bot in a separate post; this one is about what you inherit the moment you do.
The merge is the quiet part that makes everything after it possible. Two independent capture streams would drift, so a sentence spoken at one instant could land in two different places and no amount of later cleanup could reconcile them. Because both streams are sampled against one clock and stitched into a single timeline, your side and the far side stay aligned to the frame. Every stage downstream, from echo cancellation to speaker labels, leans on that one honest chronology.
The bill comes due as echo
Here is what you inherit. The far side is coming out of your speakers, and your microphone is an open ear in the same room. So the microphone hears the other person too, a beat late and a little muddy, layered on top of your own voice.
To a naive recorder this is a disaster dressed as a feature. The far end now exists in two places at once: cleanly on the system channel, and again as a smeared ghost on the microphone channel. Transcribe the microphone as it stands and half of what the other person said comes back attributed to you, doubled and slightly wrong, in your own row of the transcript.
Headphones make the problem vanish, which is why most people never think about it. But plenty of calls happen on laptop speakers, at a kitchen table or a desk, and a notes app that only works with headphones is a notes app with an asterisk. The honest version has to handle the speaker case, and handling the speaker case means it has to cancel the echo before it ever reaches the transcript.
The ghost is not just noise, it is late. It arrives a beat behind your real words, so in a raw timeline it can smear across the boundary between one speaker and the next. That lateness is exactly why a blunt fix does not work. Muting the microphone whenever the speaker is loud would also clip your own voice the instant you and the far end talk over each other, which on a real call is constantly.
One canceller, mostly switched off
The echo is a real acoustic problem, so we solved it with a real acoustic tool. Savory vendors WebRTC's AEC3, the same echo canceller that runs inside the browser you take calls in. It is a genuine, well-worn library doing signal processing, not a crude threshold gate that mutes the microphone whenever the speaker gets loud.
What is unusual is how much of it we leave turned off. AEC3 arrives bundled with the rest of a voice-processing chain: noise suppression, automatic gain control, the works. Savory runs it in full non-mobile mode with only the echo canceller enabled, and deliberately disables noise suppression and automatic gain along with the rest.
That restraint is the whole point. Noise suppression would decide, on its own, which parts of the room are worth keeping and which to scrub away. Automatic gain would ride your volume up and down between sentences, hunting for a target loudness. Both of them rewrite the audio in ways a transcript then has to live with forever. We want exactly one transformation happening, echo removal, and everything else to pass through untouched so the words arrive the way they were actually said.
A call app and a notes app want different things from the same chain, which is why the defaults are wrong for us. A call app tunes the audio to sound smooth to a human ear on the other end, and it will happily reshape a voice to get there. A notes app wants the audio faithful to a recognizer, not flattering to a listener. Echo removal is the one piece both would agree on, so it is the one piece we keep.
Only the microphone gets rewritten
Echo cancellation needs a reference: a clean copy of the exact sound you are trying to remove. Savory already has one. The system channel, captured straight off the output mix, is the far end with no room and no echo folded into it. That is the reference, and it is sample-exact precisely because both streams ride the same clock rather than two clocks that slowly disagree.
So the canceller works in one direction only. In 10 millisecond blocks it rewrites the microphone frames, subtracting the far-end reference wherever the microphone re-heard it. The system channel is never altered. It stays the pristine far-end signal from the first frame to the last, which is exactly what you want, because it is also the thing every later stage trusts as ground truth.
The measured result is an echo return loss of around 20 decibels, meaning the leaked far-end voice on your microphone track drops by roughly two orders of magnitude. That is strong suppression, not a mathematical zero, and we would rather say so plainly than promise a silence no acoustic system actually delivers. In practice it is the difference between a clean speaker attribution and a transcript that spends the meeting arguing with itself.
Leaving the system channel untouched buys something beyond a clean reference. The far side is often more than one person, all of them arriving down that single output bus. Because the channel is never reshaped, the later separation stage still has real, unflattened audio to work with, and can tell those far-end voices apart instead of collapsing a whole conference room into one anonymous blur.
A second pass, in text
Cancellation happens in the audio, before a single word is recognized. But audio processing is never perfect, and a faint residue of the far end can still survive into the transcript as a duplicate row: the same sentence, once from the system channel and once from the microphone that half-heard it. So there is a second cleanup, and it runs in a completely different domain.
After transcription, a mic-bleed reconciler reads the text itself and drops the duplicate rows where the microphone re-captured the speaker output. It compares what landed on each channel and removes the echo of a line that already exists cleanly elsewhere in the record. Two nets, one acoustic and one textual, catch what a single net on its own would let through.
The gates on that reconciler are deliberately keep-biased. When it cannot be sure whether a line is a genuine interjection or an echo, it keeps the line. A transcript with a rare doubled sentence is a mild annoyance you can skim past; a transcript that silently deletes something you actually said is a quiet betrayal, and the two failures are not equal. So the tie always goes to keeping real speech, every time.
Doing the second pass in text, rather than piling more processing onto the audio, is a choice with a reason. Two lines can be acoustically different and still be the same words, and it is the words a reconciler can actually compare. Audio residue hides in the signal; a duplicated sentence hides in plain language. So each pass works where its evidence lives, and neither one has to guess at the other job.
Who said which half
Two clean sides is the setup. The payoff is knowing who is speaking. On macOS, Savory runs speaker separation, or diarization, on-device, telling voices apart within the shared audio without sending a second of it anywhere. From there it flows straight into on-device transcription, so the whole path from microphone to named line stays on your Mac.
By default the voices are anonymous. You get Speaker 1 and Speaker 2, not names, because the app has no business guessing identities it was never told. When you do want a name, one action turns Speaker 2 into a named person across the entire transcript, retroactively and everywhere at once. Real names come from that deliberate assignment, or from opt-in voiceprint enrollment, never from a silent assumption the software made on its own.
This is the part the echo work quietly pays for. Diarization can only ever be as good as the channels it reads, and if your voice track were still full of leaked far-end speech, every attribution downstream would inherit the smear. Clean the microphone first, and who-said-what stops being a guess and starts being a fact you can act on.
The single chronology from the start of all this is what makes the labels legible. Because both sides were merged onto one clock, the speaker labels sit in true order, so the transcript reads as an actual back-and-forth rather than two columns you have to interleave in your head. You can follow who answered whom, and where a question hung in the air before anyone picked it up.
Four ways to hear the far side
Capturing system audio is a privilege the operating system grants, not a given, so Savory keeps a ladder of methods and walks down it until one of them works. The first rung is the CoreAudio process-tap, which is the cleanest path and, importantly, needs no virtual audio device installed at all. Most people never leave the first rung, and never think about the rest.
If the process-tap is unavailable, capture falls to ScreenCaptureKit, then to a virtual audio device, and finally, if nothing else is possible, to microphone-only. Each step down trades a little fidelity for the recording still happening at all. Far-side capture also depends on the macOS audio-capture permission; if you decline it, the app degrades toward mic-only rather than pretending it still has both sides of the call.
That last fallback is the honest floor, and it is the same ladder the live recording feature stands on. When Savory can only hear the microphone, it records the microphone and tells you exactly that, rather than manufacturing a far-end track that was never there. A recorder that quietly loses half the conversation while claiming both is worse than one that admits, up front, that it has one side.
The reason the first rung matters so much is what it spares you. Needing no virtual audio device means nothing to install, no system extension to approve, no reboot, and nothing left behind to uninstall later. The cleanest capture path is also the one that asks the least of your machine, which is not a coincidence so much as the goal.
You can only record both sides of a call on Mac
Every mechanism in this post is macOS-only, and it is worth being blunt about that instead of blurring it. Both-sides capture, the AEC3 echo canceller, the mic-bleed reconciler, and on-device diarization all live on the Mac, on Apple silicon. They exist because the Mac exposes its output mix to a process-tap and hands an app a clock precise enough to line two streams up to the sample.
iOS does not offer any of that, so on iPhone and iPad Savory is mic-only. It records your side, the audio physically reaching the phone's microphone, with no system-audio capture, no echo cancellation, and no speaker separation. That is a real limit, not a soft-pedaled one, and we would rather you know it before the call than discover it after. If you are weighing tools against each other, our Savory versus Fireflies page lays out where the no-bot approach helps you and where it constrains you.
That split is the consequence of the whole design, not an accident of it. Once you decide the recorder will read the machine rather than join the meeting, you are bound to what each machine actually exposes. The Mac hands you both sides and a clock; the phone hands you a microphone. We would rather ship the honest version of each than paper over the gap with a claim the phone cannot back up. The reward for accepting that limit is capture you never have to second-guess.
Savory is in early access on Apple silicon Macs. If you take calls on laptop speakers, open it on your next one and read both sides afterward.