Skip to content
All work

AI systems

Debrief

Meeting minutes from two tracks instead of diarization

Python 3.11+PyAudioWPatch (WASAPI loopback)faster-whisperAnthropic structured outputsPydantichttpxpytest
15 мс
track drift over 12 s
9.9×
faster than realtime
35
tests

Problem

The standard approach records a call as one mixed stream and then splits the voices by diarization. That step is probabilistic, and it fails exactly where the cost is highest — on interruptions and short replies, which is what commitments are made of.

System

The microphone and the system output are captured as two independent WASAPI streams into two files sharing one time origin, so the speaker follows from the track, not from voice similarity. The tradeoff is acoustic echo: with sound on speakers, the other party's words land on both tracks. The echo filter demands time overlap and textual similarity at once — overlap without similarity is an ordinary interruption, and losing it is not acceptable. Transcription runs locally, so recordings never leave the machine and an hour of talk costs nothing. The minutes are produced through structured outputs validated against a schema API-side, not by parsing markdown out of the reply.

Role

Solo build: capture architecture, track-merging core, extraction schema.

Outcome

Running it on real hardware exposed what the tests could not. WASAPI loopback goes silent literally: while nothing plays through the output device the stream yields no buffers at all, so the other party's track came out as a lone WAV header — a line spoken in the third minute would have landed at position 0, and the shared time axis existed only on paper. Gaps are now padded with silence against a monotonic clock: on a live recording the tracks drift 15 ms over 12 seconds. The same run showed the default device choice crashing out of the box — the GPU is visible through the driver but computes through cuBLAS, which installs separately, and the model constructor passes silently while the first computation fails. Devices are now tried in order, each warmed up on a second of silence. 35 tests, 9.9× realtime on 12 cores; a failed analysis no longer takes the recording down with it.