Read Aloud — the mirror of dictation
Press a hotkey -> grab the currently selected text -> speak it aloud, using a local neural voice or a cloud provider. Parallel subsystem mirroring the existing STT stack (CloudProvider/registry, APIKeyManager/Keychain, HotkeyManager, SelectedTextService, SoundManager).
Decisions (locked)
- Local engine: sherpa-onnx + Kokoro-82M (Apache-2.0, whisper.cpp-style C lib, neural, offline).
- Cloud providers: Deepgram Aura-2 (default), Inworld TTS-1.5 Mini, ElevenLabs v3, Gemini 3.1 Flash TTS, OpenAI gpt-4o-mini-tts, Cartesia Sonic-3.5. (All verified current as of 2026-06.)
- Playback: one shared progressive-PCM pipeline (AVAudioEngine) + whole-file AVAudioPlayer fallback.
- Text capture: existing
SelectedTextService.fetchSelectedText() (AX read -> synthetic-copy fallback). One Accessibility grant already covers it.
Work breakdown
Foundation
Cloud providers
UI + release
Notes / corrections
- Chatterbox deferred to a later phase: it is 0.5B (not 350M), ~1–3 GB (not 700 MB), has no native Swift binding (sidecar/ONNX only), and watermarks output. Kokoro is the right first neural local engine.
- Release gating: notary issuer ID + Sparkle EdDSA key are open blockers per release-readiness notes.
Read Aloud — the mirror of dictation
Press a hotkey -> grab the currently selected text -> speak it aloud, using a local neural voice or a cloud provider. Parallel subsystem mirroring the existing STT stack (
CloudProvider/registry,APIKeyManager/Keychain,HotkeyManager,SelectedTextService,SoundManager).Decisions (locked)
SelectedTextService.fetchSelectedText()(AX read -> synthetic-copy fallback). One Accessibility grant already covers it.Work breakdown
Foundation
Cloud providers
UI + release
Notes / corrections