A local macOS voice layer for OpenAI Realtime, Codex CLI, CUA Driver, and live interview translation.
Codex Voice Bridge turns your Mac into a voice-controlled coding and productivity assistant. It can talk with you through OpenAI Realtime, ask Codex CLI to inspect local projects, control visible macOS apps through CUA Driver, and run a bidirectional interpreter mode for English interviews.
- Speaks and listens through OpenAI Realtime over WebRTC.
- Uses
gpt-realtime-2for a conversational assistant with reasoning and tool calls. - Uses
gpt-realtime-translatefor live speech translation. - Uses
gpt-realtime-whisperfor low-latency captions. - Stores your OpenAI API key in macOS Keychain instead of source files.
- Runs Codex CLI in read-only mode for local project inspection.
- Uses CUA Driver to open, focus, inspect, and operate macOS apps.
- Provides an
Interviewmode for English job interviews:- interviewer English -> Spanish audio/subtitles for you
- your Spanish mic -> English audio for the call
- macOS.
- Node.js 20 or newer.
- npm.
- An OpenAI API key with Realtime API access.
- Codex CLI installed and authenticated if you want local coding-agent actions.
- CUA Driver installed and granted Accessibility + Screen Recording if you want app control.
- Optional but recommended for interview mode: BlackHole 2ch or Loopback for virtual audio routing.
git clone https://github.com/mitre88/codex-voice-bridge.git
cd codex-voice-bridge
npm install
npm startOn first launch, paste your OpenAI API key into the app. The key is saved in macOS Keychain and the field disappears on future launches.
You can also provide the key through the environment:
export OPENAI_API_KEY="sk-proj-..."
npm startOptional environment variables:
export OPENAI_REALTIME_MODEL="gpt-realtime-2"
export OPENAI_REALTIME_TRANSLATE_MODEL="gpt-realtime-translate"
export OPENAI_REALTIME_TRANSCRIBE_MODEL="gpt-realtime-whisper"
export OPENAI_REALTIME_VOICE="marin"
export OPENAI_REALTIME_REASONING_EFFORT="low"
export OPENAI_REALTIME_TARGET_LANGUAGE="es"
export CODEX_VOICE_WORKDIR="/path/to/your/workspace"The main Samantha-style assistant mode. It uses gpt-realtime-2, speaks naturally, and can call local tools:
run_codex: ask Codex CLI to inspect, summarize, or plan from a local project.run_cua_driver: inspect and operate macOS apps through CUA Driver.open_app: visibly open or focus apps like Safari, Chrome, Finder, Xcode, Obsidian, or Terminal.type_text_in_front_app: type into the focused macOS app.press_key_in_front_app: press keys in the focused macOS app.
Codex is run in read-only mode by default.
Bidirectional live interpreter mode for English interviews.
Recommended setup:
- Use headphones.
- Install BlackHole 2ch or Loopback.
- In the app, choose
Interview. - Set
Your micto your real microphone. - Set
Their audiotoCapture meeting audioand choose the meeting window or screen when prompted. - Set
Spanish to meto your headphones/default output. - Set
English to calltoBlackHole 2ch. - In Zoom, Google Meet, Teams, or the interview app, select
BlackHole 2chas your microphone.
Without a virtual audio device, the English translation can still play through speakers, but the meeting will only hear it if your microphone picks up the speaker output.
One-way live translation using gpt-realtime-translate. Choose a target language and connect.
Low-latency speech-to-text captions using gpt-realtime-whisper.
Install and grant permissions for CUA Driver, then verify:
npm run smoke:cuaThe app expects the cua-driver command to be available in your PATH.
- Do not commit
.envfiles or real API keys. - API keys pasted into the app are stored in macOS Keychain under
codex-voice-bridge.openai-api-key. - Logs are written to
~/Library/Logs/codex-voice-bridge/bridge.log. - Tool calls are intentionally limited. Some CUA Driver tools are blocked for safety.
- Codex CLI runs with a read-only sandbox by default.
npm install
npm run check
npm run smoke:cua
npm startPull requests are welcome. Keep changes focused, avoid committing secrets, and include a short explanation of the user-facing behavior being changed.