Voice Meeting Assistant

The problem

Live conversation can be a barrier for many people in our communities. When speaking is difficult, or someone needs more time to put their thoughts into words, a meeting can move on before they have a chance to contribute. People need a way to take part, express themselves in their own voice and stay in control of what they say.

The solution

I built a Mac app that lets users type and speak in their own cloned voice during meetings, with control over exactly when an answer is spoken. Users connect their ElevenLabs voice, and the app routes speech through Core Audio and BlackHole into the meeting microphone.

Sentence completion and answer drafting run locally on their Mac. Users can also save an approved audio take with an answer and reuse that exact recording.

How it works

The architecture, at a glance.

  1. Type or select

    Composer, local completion and saved answers

  2. Generate speech

    ElevenLabs voice or an approved saved take

  3. Core Audio

    PCM audio checks and a dedicated output path

  4. Meeting microphone

    BlackHole routes speech into the call

Qwen3-TTS and VoxCPM2 can also generate speech locally through the same audio path when their model files are installed.

When a user selects an ElevenLabs voice, submitted text goes to ElevenLabs. Unsent drafts, completion and context retrieval stay on their Mac. The app doesn’t capture other participants or record meetings.

Technology

Native app & audio
Swift, SwiftUI, Core Audio, AVAudioEngine and BlackHole for app-specific meeting audio.
Speech
ElevenLabs Multilingual v2 with streaming PCM; optional Qwen3-TTS and VoxCPM2 local engines.
Local intelligence
MLX Swift LM and Qwen3 for completion and grounded drafting. Keychain stores API credentials.

Worth mentioning

Keeping up while staying in control

A live conversation moves quickly, so finding the words and choosing when to speak both matter. Sentence completion and saved answers help users prepare a response. They can press Speak without waiting for completion, and drafting an answer never speaks it automatically. Escape stops queued and active speech, while approved audio takes let users reuse phrases they’ve already checked.

Recovering without repeating an answer

If speech generation or the audio device fails during a meeting, users need to recover without losing their answer or saying it twice. The app checks for silence and unusable audio, with timeouts and cancellation if something gets stuck. Failed text stays available for the user to retry. If playback has already started, the app won’t automatically repeat the answer.

Checking more than speed

I added timing measurements and benchmark scripts for the local speech engines, including waveform comparisons when testing inference optimizations. Those checks are separate from listening to voice quality and testing what other participants actually hear in a call.