RU /EN
Start a project
← Selected projects
Case study

Dictum

A local voice AI utility for macOS: dictation, transcription, interviews and text processing, with no cloud requirement.

  • GigaAM v3 · MLX
  • Core Audio Process Taps
  • no diarization model
  • runs without the cloud

What it is

A voice utility for macOS. Dictation into any app, meeting transcription, an interview mode with speakers separated, and text processing by a model. Everything runs on the device; a cloud model is connected only if the user wants one.

Why it exists

Voice input and meeting transcription usually mean sending audio to someone else’s server. For work conversations that is not always acceptable, and the point is not paranoia — the contents of a meeting often simply should not leave the machine.

Local inference on Apple Silicon has been good enough for this for a while. What was missing was not the model but the product around it: hotkeys, inserting text into the active app, capturing meeting audio, and keeping a history.

What I did

ML. GigaAM v3 through my own MLX port for Russian speech recognition. A local Qwen for text processing. An OpenAI-compatible API as an option, not a requirement.

Systems work. Global hotkeys, inserting the result through the Accessibility API, system audio capture via Core Audio Process Taps and an Aggregate Device, IOProc and a realtime ring buffer, custom audio chunking, SQLite for history.

What’s technically interesting

The key decision in this project is not the model — it’s the audio capture architecture.

Interview mode needs to know which speaker said what. The standard route is a diarization model that splits a track by voice: another model in the bundle, another source of errors, and quality that depends on room acoustics.

But in a meeting the audio sources are already separated by the system:

  • the microphone is the user;
  • system audio is the other party.

Record them separately and speaker labels come out exact by construction. Dictum needs no diarization model.

This is the case where ML is better left out: the task is solved more reliably at the level of system APIs than by adding one more model.

The cost of that decision is not in ML but in Core Audio: process taps, an aggregate device, realtime IOProc callbacks, and a ring buffer that must never block the audio thread. Mistakes here are audible immediately.

What came out of it

Dictation into any app, meeting transcription with speakers separated, and text processing — on the device, with no mandatory cloud.

Release in preparation.