SpeakEasy
Unified TTS
speakeasy "Welcome to SpeakEasy! This unified text-to-speech service makes it easy to add voice to your applications" --provider openai --voice nova --rate 180npm install @arach/speakeasyA permanent place for every spoken update
SpeakEasy gives Codex and your command line one menu-bar player for autoplay, queues, scrubbing, playback speed, volume, and a word-synced transcript HUD.

Ready for your Mac and your agents
Native player
- • macOS 14.0 or later
- • Apple Silicon or Intel processor
- • Developer ID signed and Apple notarized
Codex plugin
- • Bundled SpeakEasy runtime
- • System voice works without an API key
- • OpenAI, ElevenLabs, Groq, and Gemini are optional
Start Speaking in Seconds
No complex setup, no boilerplate. Choose your style and start building.
import { say } from '@arach/speakeasy';
// Quick start - one line!
await say('Hello world!');
// With provider
await say('Hello from OpenAI!', 'openai');
await say('Hello from ElevenLabs!', 'elevenlabs');import { speak, SpeakEasy } from '@arach/speakeasy';
// Full featured with options
await speak('Priority message', {
provider: 'openai',
volume: 0.8,
priority: 'high'
});
// Custom instance
const speech = new SpeakEasy({
provider: 'elevenlabs',
volume: 0.6,
rate: 200
});
await speech.speak('Custom configuration');# Install globally
npm install -g @arach/speakeasy
# Quick setup - save your API key
speakeasy --set-key elevenlabs YOUR_API_KEY
# Set as default provider
speakeasy --set-default elevenlabs
# Start speaking!
speakeasy "Hello world"
# Or use system voice (no API key needed)
speakeasy "Hello world" --provider system// ~/.config/speakeasy/settings.json
{
"providers": {
"openai": {
"voice": "nova",
"apiKey": "sk-..."
},
"elevenlabs": {
"voiceId": "EXAVITQu4vr4xnSDxMaL",
"apiKey": "sk-..."
}
},
"defaults": {
"provider": "openai",
"volume": 0.7,
"rate": 180
}
}Get Started in 3 Steps
--provider system for built-in macOS voicesHave Claude speak to you
Never miss important notifications. Transform Claude Code's silent alerts into intelligent spoken updates.
Tool Permission Request
// ~/.claude/hooks/notification.ts
import { SpeakEasy } from '@arach/speakeasy';
const speakEasy = new SpeakEasy({
provider: 'groq',
cache: { enabled: true, ttl: '7d' },
fallbackOrder: ['groq', 'openai', 'system']
});
// Read notification from Claude Code
const notificationType = process.argv[2];
const payload = JSON.parse(await readStdin());
// Extract project context
const projectMatch = payload.transcript_path?.match(/\/([^\/]+)$/);
const projectName = projectMatch?.[1] || 'your project';
// Transform into natural speech
let spokenMessage = payload.message;
if (projectName !== 'your project') {
spokenMessage = `In ${projectName}, ${payload.message}`;
}
// Speak the notification
await speakEasy.speak(spokenMessage);
// Also copy to clipboard and log
await copyToClipboard(JSON.stringify(payload, null, 2));
logger.info('Notification processed', { type: notificationType, message: spokenMessage });Ready-to-deploy handlers
Claude HooksOfficial documentation
Built for Developers
Every feature is designed to make text-to-speech simple, reliable, and powerful for your applications.
Smart Caching
Automatic caching for API providers. Same text + voice = no API call, lower bills.
Global Config
Set defaults once in ~/.config/speakeasy/settings.json. Override per-call when needed.
TypeScript First
Full type safety, IntelliSense, and modern async/await patterns. Built for developer experience.
Fine-Grained Audio Volume
Precise volume control (0.0-1.0) without affecting your system. Isolated playback for every provider.
Multiple Providers
System voices, OpenAI, ElevenLabs, Groq, and Gemini. Smart fallbacks ensure your speech always works.
Zero Dependencies
Minimal footprint with smart fallbacks. Works offline with system voices, online with API providers.