Technology
The technology and models inside echo99
Native macOS recording and open AI models for transcription, speaker identification, and summaries—all on your Mac.
Native capture without a virtual audio driver
echo99 is a native Swift menu-bar app. It records the two sides of a call as two separate tracks, using only what macOS itself provides:
- System audio is captured with Core Audio process taps, the API Apple added in macOS 14.4. No BlackHole, no Loopback, no kernel extension, no virtual output device to reroute your sound through.
- Microphone audio is captured with AVAudioEngine, the standard macOS audio engine, with automatic recovery when you switch devices mid-call.
The tracks are written as plain WAV files and kept separate on purpose: your mic is always “Me”, and the system track carries everyone else. Keeping them apart is what makes accurate speaker labeling possible. More detail in how system-audio capture works.
The models, rated
Every model below is open, downloaded once from Hugging Face, and run on your Mac. You pick them in the app’s Config window: speech models in Config → Models, summary models in Config → LLM. Each model name links to the original model from its creators (NVIDIA, pyannote, Google, Qwen and others) on Hugging Face; echo99 runs Core ML and GGUF conversions of them.
The ratings compare the models within one table, not across tables. They summarize our own tests on our development Macs together with the published model cards. Use them as a guide to choosing; they are not a benchmark.
Speech-to-text after the call
When a recording stops, echo99 transcribes both tracks with NVIDIA’s open Parakeet models, converted to Core ML. This is the transcript that is saved.
| Model | Accuracy | Speed | Parameters | Best for |
|---|---|---|---|---|
| Parakeet TDT v3 Default | 0.6B | Everyday calls in any of 25 languages, with word-level timestamps.Bulgarian, Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Maltese, Polish, Portuguese, Romanian, Russian, Slovak, Slovenian, Spanish, Swedish, Ukrainian | ||
| Parakeet Ultra Optional | 0.6B | The most accurate choice for the same 25 languages: a further-trained v3 with a larger download. | ||
| Parakeet Unified Optional | 0.6B | English calls where accuracy matters most: it reads the audio in overlapping full-context windows. |
Live transcript preview
An optional preview window (Config → Experiments) shows what is being said while the call records. It is only a preview: the saved transcript always comes from the after-call model above, and the preview never affects the recording.
| Model | Accuracy | Speed | Parameters | Best for |
|---|---|---|---|---|
| Parakeet EOU 120M Default | 120M | English. Light enough for any Mac, Intel included, and it detects the end of each sentence on its own. | ||
| Parakeet Unified Streaming ExperimentalApple silicon only | 0.6B | English with punctuation, closest to the final transcript. Needs Silero VAD. | ||
| Nemotron 3.5 Multilingual ExperimentalApple silicon only | 0.6B | Calls in any of 28 languages; the language is detected automatically. Needs Silero VAD.Arabic, Bulgarian, Chinese (Mandarin), Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Hindi, Hungarian, Italian, Japanese, Korean, Norwegian (Bokmål), Polish, Portuguese, Romanian, Russian, Slovak, Spanish, Swedish, Turkish, Ukrainian, Vietnamese |
Speaker diarization
Diarization (telling the other voices apart) runs on the system track only; your microphone is always “Me”. In Config → Models the online diarizer is listed as speaker-diarization and the offline one as speaker-diarization (offline).
| Model | Accuracy | Speed | Speakers | Best for |
|---|---|---|---|---|
| Online diarizer Default | Automatic | Most calls. pyannote segmentation with WeSpeaker voice embeddings. It is fast, and speaker recognition uses the same model. | ||
| Offline diarizer Optional | Automatic, or set 1 to 4 | Calls with several people on the other side. Global clustering (VBx) on the pyannote community model looks at the whole recording at once; best when you tell it how many speakers there were. | ||
| Nemotron 3 Experimental | Up to 8 | Larger calls. NVIDIA's end-to-end diarizer counts speakers well, but can miss short stretches of speech. |
Summaries: a local language model
Summaries are written by a small open language model that runs on your Mac. On Apple silicon it runs on the GPU through Metal; on Intel Macs it runs on the CPU. Each model is a 4-bit quantized GGUF file:
| Model | Quality | Speed | Memory | Best for |
|---|---|---|---|---|
| Qwen3.5 2B Optional | About 2.5 GB | Older or busy Macs: the fastest and smallest. | ||
| Gemma 4 E2B Default | About 4.5 GB | Most people: balanced quality and speed. | ||
| Gemma 4 E4B Optional | About 8 GB | Better summaries when you can wait longer for them. | ||
| Gemma 4 12B Optional | About 12 GB | The best summaries, on a Mac with plenty of memory. |
Every model file is downloaded from Hugging Face at a pinned revision and checked against its known SHA-256 hash before it is installed. The model works with a 32,768-token context; a transcript too long to fit is reported instead of being summarized in part. See meeting summaries for how to use them.
Helper models
Three small models do supporting work. They have no rating because there is nothing to choose between.
| Model | What it does |
|---|---|
| Parakeet CTC 110M Optional | Custom vocabulary: boosts the names and jargon you tell echo99 to expect. |
| Silero VAD Optional | Finds silence: lets transcription skip long quiet stretches, and tells the experimental live models when a sentence has ended. |
| WeSpeaker v2 | Turns a voice into a voiceprint for speaker recognition. It ships inside the default online diarizer. |
Recognizing people across recordings
Diarization only separates voices within a single recording. Putting a name to a voice, and having echo99 recognize that person next time, is a second step, and it also runs on-device:
- A voiceprint is an embedding. Diarization already turns each far-end speaker into a compact numeric embedding, a vector that captures how a voice sounds. When you name someone, in the Recordings window or in Manage Voices, echo99 saves that embedding as their voiceprint in a gallery file on your disk.
- Matching is a distance comparison. On every later recording, echo99 compares each speaker’s embedding to the voiceprints in your gallery by cosine distance. If the nearest one falls within a confidence threshold (measured against a private test set and kept deliberately strict), that speaker is labeled with the person’s name; otherwise they stay “Them-N.”
- It never guesses, and never learns on its own. An uncertain match is left as “Them-N” rather than risk the wrong name, and an automatic match never writes back to the gallery; the gallery grows only when you name someone.
The matching is plain vector math and needs no network; the voiceprints always come from WeSpeaker v2, whichever diarizer you picked. Voiceprints are biometric data and stay on your Mac. Each voice you name also keeps a short voice sample from the call, which you can play in Manage Voices; samples are never exported. Recognition is on by default for new installs. You can turn it off in the welcome window or later in Config → Transcription. The speaker identification guide covers what that means for your privacy and control.
All inference on your Mac
Every speech model above runs through Core ML; on Apple silicon most of them are accelerated by the Apple Neural Engine, while the Nemotron 3 diarizer runs on the CPU. Models are downloaded once from Hugging Face; after that, recording, transcription, speaker labeling, and summaries all work with Wi-Fi off. Your audio and transcripts are never sent to a server. There is no server-side transcription or summarization at all.
The on-device speech runtime is FluidAudio, the open-source Swift SDK by Fluid Inference that brings these speech models to Core ML.
Try echo99 on your next call
Free download. No account. Recording and transcription stay on your Mac.
Free · macOS 14.4+ · Apple silicon & Intel · Notarized by Apple