- 2implementations held to byte-identical output
- 20 msaudio pacing the media SDK expects
- 30 minsoak with a forced mid-call reconnect
A media driver on Windows, the intelligence on my side
Helix answers Microsoft Teams calls with a voice engine on my own GPUs under Linux, and Teams hands raw call audio only to a Windows application built on Microsoft's real-time media SDK. I kept all intelligence on my side and made the Windows piece a media driver, joined to the engine by a WebSocket link carrying a binary media protocol I designed.
One socket per call, admitted by identity
Each call gets one authenticated, full-duplex secure WebSocket between the bridge and the engine, so a call's lifetime equals its socket's. On the Linux side an Axum endpoint admits a session only when its tenant, persona and identity fingerprint match what the engine expects.
It then presents the call as one more implementation of the engine's sealed audio source and sink, the interfaces the local microphone and speaker already use, so the conversation engine runs unchanged whether it is talking to a desk microphone or a Teams call. Audio and video travel as fixed binary frames tagged with their persona and session.
Two implementations, one set of bytes
I implemented the protocol in C# and in Rust against shared golden test vectors, so a one-byte change on either side fails a test before it reaches a call. On Windows, the SDK's receive callbacks copy their buffer and return at once, as its lifetime rules require, and a paced sender transmits at the SDK's expected rhythm only while the socket is up.
If the link drops, the bridge reconnects inside the same Teams call with fresh credentials and discards microphone audio captured during the gap, because late speech confuses a conversation more than a short silence does. The whole account is A self-hosted colleague in a Teams call. WebSocket is the standard transport; the media protocol, session admission and reconnect behaviour are mine.
I can design a real-time protocol across two languages, two clouds and a vendor SDK with strict rules, and prove it under soak and fault before I call it finished.