Listnr: on-device meeting transcription in Swift, using WhisperKit and ScreenCaptureKit

Sharing a project in case the architecture is useful to anyone doing real-time audio in Swift.

Listnr captures the microphone via AVAudioEngine and system audio via ScreenCaptureKit as two independent lanes, runs each through its own VAD and its own WhisperKit pass, and applies SpeakerKit diarization to the system-audio lane to separate the remote participants. Nothing is mixed before inference, which is the central design constraint: a single mixed waveform destroys speaker attribution irrecoverably and pushes Whisper into hallucinating on overlapped speech.

It is structured as one SPM package, a ListnrCore library plus a thin executable target, with swift-argument-parser for the CLI. Distribution is a notarized pkg, a Homebrew tap, and a signed prebuilt binary, and packaging/README.md documents the release process, which took longer to get right than I expected and may save someone else the reading.

Requires Swift 5.9 and macOS 14 on Apple Silicon. MIT licensed. Feedback on the audio path and the concurrency model especially welcome.

listnr-session

1 Like

Nice!

You may be interested to know that there's actually an API on macOS which allows you to capture only system audio without screen capture: Capturing system audio with Core Audio taps | Apple Developer Documentation

This is nice because then the permission is scoped to system audio, rather than full screen-capture. Much like ScreenCaptureKit it lets you grab specific apps/processes, or everything.