The short answer
Use Codex’s notify command for “done” and hooks for “needs you”.
Codex has two places to attach a voice. The notify setting in ~/.codex/config.toml runs a command with a JSON argument when a turn completes (agent-turn-complete, including last-assistant-message). Hooks in ~/.codex/hooks.json cover more events, including Stop and PermissionRequest. A ten-line script that passes the message to macOS say gives you spoken “done” notices for free.
If you want more than that: agent-notify adds banners with optional speech, Voxlert has an LLM write each line and speak it in a game-character voice, codex-voice-reply speaks a short decision-first reply, and Heard summarizes Codex and Claude Code sessions together.
All options
Five ways to hear Codex.
From each project’s README. Checked October 6, 2026.
| Option | What you hear | Needs | Platforms | Price and license |
|---|---|---|---|---|
| notify + sayconfig.toml | The end of the turn, read aloud | A small script | macOS | Free |
| agent-notifypaultendo | A banner, with optional say speech | Homebrew | macOS, Linux, WSL | Free, AGPL-3.0 |
| Voxlertnpx voxlert | An LLM-written line in a game-character voice | An LLM API key and a local TTS model | macOS, Windows, Linux | Free, MIT, plus LLM usage |
| codex-voice-replyskill | A quick acknowledgement, then a short reply when the model marks one | Edge TTS (online) | Windows tested; macOS, Linux untested | Free, Apache-2.0 |
| Heardvoice layer | What changed and what needs you, across Codex and Claude Code | The Heard app or open-source engine | macOS 14+ | Free engine; app from $15/mo |
A notify script that speaks the end of each turn.
Codex appends one JSON argument to the notify command. This script reads it, keeps the first 300 characters of the last message and speaks them without blocking Codex. Save it, make it executable and point notify at its absolute path.
Because notify only fires on agent-turn-complete, it will not tell you Codex is waiting for approval. Attach a command to the PermissionRequest hook for that.
#!/usr/bin/env python3
import json, subprocess, sys
event = json.loads(sys.argv[1])
if event.get("type") == "agent-turn-complete":
text = (event.get("last-assistant-message") or "Codex finished.")[:300]
subprocess.Popen(["say", text])
notify = ["python3", "/Users/you/.codex/speak.py"]
agent-notify: banners first, speech optional.
agent-notify supports Codex CLI, Claude Code and Gemini CLI. On macOS it posts banners through terminal-notifier or osascript, can speak with say, plays sounds, shows the git branch and focuses the right window on click. It installs from its own Homebrew tap and runs agent-notify --setup to wire the hooks. A different, MCP-based agent-notify speaks Codex updates with local Coqui voices and an overlay, aimed at Linux.
brew tap paultendo/agent-notify https://github.com/paultendo/agent-notify
brew install agent-notify
agent-notify --setup
Voxlert: an LLM writes the line, a character voice says it.
Voxlert works with Claude Code, Cursor, Codex, pi and OpenClaw. For each event, an LLM (through OpenRouter, OpenAI, Gemini or Anthropic) writes a short phrase, and a local TTS model speaks it in a voice like the StarCraft Adjutant or SHODAN. Speech needs Qwen3-TTS on Apple Silicon or an NVIDIA GPU with 16 GB of memory, or Chatterbox on a GPU; without one it falls back to text notifications. Set up with npx voxlert --onboard.
It is the most fun option here. Pick it if personality matters to you and your machine can run the voice model.
npx voxlert --onboard
codex-voice-reply: a spoken acknowledgement and a short answer.
codex-voice-reply is a skill for Codex and Claude Code, in English and Chinese. It speaks a cached acknowledgement when you submit a prompt, then a decision-first reply only when the model emits a voice marker; otherwise it stays quiet. Speech uses Edge TTS, Microsoft’s online service. It is tested on Windows, and its README marks macOS and Linux as supported but untested.
Heard: one voice for Codex and Claude Code.
Heard’s Codex adapter writes hooks to ~/.codex/hooks.json and also follows Codex desktop app sessions, so the CLI and the app are both covered. Progress, questions, failures and results become one or two spoken sentences, and when Claude Code is running too, both share one queue with the project name up front. On Power you can answer the session that just spoke by holding right ⌘.
With the open-source engine it is heard install codex; with the Mac app, turn Codex on in Settings and trust the Heard hooks once in Codex.
heard install codex
Questions
Frequently asked questions
Does OpenAI Codex have spoken notifications built in?
No. Codex gives you the notify command and hooks; what they run is up to you. Point them at say, a notification tool or a voice layer.
Why does my Codex notify script not fire when Codex needs approval?
notify only runs on agent-turn-complete. Use the PermissionRequest event in Codex hooks for approvals.
Which Codex voice tools work without a cloud service?
A notify script with macOS say is fully local. Voxlert speaks with a local model but uses a cloud LLM to write each line. codex-voice-reply uses Edge TTS, which is online. Heard’s open-source engine can run on local Kokoro with no keys.
Can one tool speak for both Codex and Claude Code?
Yes. agent-notify, Voxlert, codex-voice-reply and Heard all support both. Heard puts them in one spoken queue and names the project on each update.
Ready when your agents are
Hear the work without watching every screen.
Start with the full Heard Power experience for 14 days. No card required. The open source engine remains free.
Download Heard for Mac macOS 14 or later · Claude Code and Codex supported