Show HN: SayToggle – Local Speech-to-Text for Mac (Apple Silicon)

7 hours ago 1

Stop typing to ChatGPT and Claude. Start talking. SayToggle transforms your workflow with private voice input optimized for Apple Silicon — 2–4× faster than typing. Built for macOS with a global hotkey (⌥⌘C) and stunning vaporwave aesthetics.

  • Built for AI Workflows
  • 2-4x Faster than Typing
  • Privacy‑first (100% Local)
  • Apple Silicon (M1+)

Requirements: Apple Silicon (M1+), macOS 14+.

Settings Screens (tap to expand)

The AI Workflow Revolution

1

Think

Formulate your question or prompt

2

Spacebar or ⌥⌘C

In‑app toggle (Spacebar) or global hotkey

3

Speak

150-200 WPM voice input

4

Auto-paste

Instant clipboard to anywhere

5

Continue

Seamless AI conversation

Result: 2-4x faster AI interaction with beautiful, private processing

Transform Your AI Productivity

🤖 Built for AI Workflows

Designed from day one for ChatGPT, Claude, and AI conversations. Automatic clipboard copying, global hotkey (⌥⌘C), and multi-transcript concatenation for complex prompts.

⚡ 2-4x Faster Than Typing

Voice input at 150-200 WPM vs typical typing at 40-60 WPM. Saves 2+ hours per week for heavy AI users. ROI pays for itself in the first month.

🎨 Functional Art

The world's most beautiful speech-to-text app. Stunning vaporwave aesthetics with 8 gorgeous backgrounds and animated cellular automata. Daily tools should spark joy.

🔥 Seamless AI Integration

⌥⌘C from anywhere → Speak → Auto-paste to ChatGPT/Claude. No interruption to your flow state. Works in any app, no permissions needed.

🔒 Complete Privacy

Your voice never leaves your Mac. 100% local processing with Whisper.cpp and Metal acceleration. No cloud dependencies, no data collection, no subscriptions.

💬 Multi-Prompt Building

Select multiple transcript entries and automatically concatenate them for complex AI prompts. Perfect for building detailed instructions across multiple voice inputs.

⚡ Lightning Performance

15x faster than real-time on Apple Silicon. Sub-second transcription for instant AI input. 240+ chars/sec throughput means no waiting.

🛠️ Power User Features

Professional CLI, model management, benchmarking tools, and scriptable automation. Built by an AI user, for AI users who appreciate both beauty and power.

💎 Premium Experience

One-time purchase, no subscriptions. Professional aesthetics for work environments. The cost of 1.5 ChatGPT Plus months, but lifetime value.

Command Line Interface

$

saytoggle

╔═══════════════════════════════════════════════════════════╗

SayToggle — Whisper.cpp on Apple Silicon — Version 1.0.1 ║

╚═══════════════════════════════════════════════════════════╝

Hardware: GPU: Apple M1 Pro (Metal) | CPU: Apple M1 Pro (10 cores, arm64)

Input: :0 Model: small.en

Gain: +6 dB Rate: 16000 Hz mono


Press ENTER to START recording, then ENTER again to stop…

Recording… (press ENTER to stop)

Recording stopped.

✓ Copied transcript to clipboard.

┌─ Transcript ──────────────────────────────────────────────────────────────┐

│ Hello, this is a demonstration of SayToggle AI speech-to-text │

│ transcription running locally on my Mac with Metal acceleration. │

└──────────────────────────────────────────────────────────────────────────┘


$

saytoggle record -d 5

╔═══════════════════════════════════════════════════════════╗

SayToggle — Whisper.cpp on Apple Silicon — Version 1.0.1 ║

╚═══════════════════════════════════════════════════════════╝

Hardware: GPU: Apple M1 Pro (Metal) | CPU: Apple M1 Pro (10 cores, arm64)

Input: :0 Model: small.en

Gain: +6 dB Rate: 16000 Hz mono


Recording for 5 seconds...

Recording complete.

✓ Copied transcript to clipboard.

┌─ Transcript ──────────────────────────────────────────────────────────────┐

│ This is a timed recording that will automatically stop. │

└──────────────────────────────────────────────────────────────────────────┘

saytoggle

Main voice recording with toggle mode. Press ENTER to start/stop recording.

saytoggle validate

Validate environment, audio path, and bundled resources (JSON‑friendly).

saytoggle record -d 10

Record for specific duration (10 seconds) then auto-transcribe.

saytoggle config

Show current configuration: audio device, model, sample rate, gain settings.

saytoggle get-sound-cues

Show sound cue status. Use saytoggle set-sound-cues on|off to change.

saytoggle current-model

Display the currently active Whisper model (clean name for GUI parsing).

saytoggle verify-model --fast

Verify model integrity: file existence, size, magic bytes, fast hash check.

saytoggle bench-model --reps 3

Professional benchmark with beautiful progress bars, detailed metrics, and performance assessment.

saytoggle bench-model --json --quiet

Machine-readable JSON output for GUI consumption with progress events.

saytoggle activate-model medium.en-q5_0

Set active model (single source of truth stored in ~/.saytoggle/active_model.path).

saytoggle get-toggle-key

Display the current toggle key (space or enter).

saytoggle set-toggle-key space

Set the recording toggle to space (or use enter).

saytoggle transcribe-file audio.wav

Transcribe existing WAV file without recording new audio.

Performance Benchmarks

Optimized Performance

  • RTF: ~0.07x (small.en on M1 Pro) — Excellent
  • Throughput: ~260 chars/sec (small.en on M1 Pro)
  • Models: 465MB–1.4GB with quantized options
  • Default Model: small.en (465MB) for optimal speed/accuracy balance
  • Acceleration: Metal GPU (Apple Silicon) via Whisper.cpp

Professional Benchmarking

GUI: Dedicated Benchmarks tab with visual progress tracking and detailed results

CLI: saytoggle bench-model --reps 3 with beautiful tables and performance assessments

Comprehensive metrics: RTF, throughput, efficiency ratings, with intelligent performance recommendations.

$

saytoggle bench-model --reps 3

Generating 10.0s test audio at 16000Hz...

✓ Generated test audio: /tmp/tmpkcbcby8p.wav


Benchmarking Model: small.en

Model Size: 465.0 MB

Audio Duration: 10.0s

Repetitions: 3 (1 warmup + 2 measured)


Warmup 1: 0.71s

Run 1: 0.70s (RTF: 0.070)

Run 2: 0.69s (RTF: 0.069)

Measured run 2/2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:02


Benchmark Results: small.en

┏━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

┃ Metric ┃ Value ┃ Description ┃

┡━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩

│ RTF │ 0.070 │ Real-Time Factor (lower is better) │

│ Throughput │ 216 chars/s │ Estimated character output rate │

│ Decode Time │ 0.70s │ Average processing time (10.0s audio) │

│ Efficiency │ Excellent │ Overall performance rating │

└─────────────┴─────────────┴───────────────────────────────────────┘


Excellent performance! Transcription is much faster than real-time.


Benchmark completed successfully!

Professional Benchmarking: Progress bars, comprehensive metrics, and intelligent performance assessments. Use --json for machine-readable output.

Support & Documentation

📧 Get Help

Have questions or need assistance?

Email: [email protected]

We typically respond within 24 hours.

💚 30-Day Money-Back Guarantee

If SayToggle doesn't work as described on your Mac, we'll refund you. No questions asked.

📚 Common Issues

  • Installation: Drag to Applications folder, grant microphone permission when prompted
  • Global hotkey: ⌥⌘C works without extra permissions (uses Carbon API)
  • "No speech detected": Check System Settings → Sound → Input device
  • Updates: We'll email you when new versions are available

See Full FAQ →

Frequently Asked Questions

How does SayToggle improve my AI workflow?

SayToggle was built specifically for AI users. Voice input (150-200 WPM) is 2-4x faster than typing (40-60 WPM). The ⌥⌘C global hotkey works from any app, auto-copies to clipboard, and integrates seamlessly with ChatGPT, Claude, and other AI tools. Heavy AI users save 2+ hours per week.

Which Macs are supported?

Apple Silicon (M1 or newer) required. macOS 14+ for the app (optimized for macOS 15+). Not compatible with Intel-based Macs.

Which model should I use?

The default small.en model (included) provides excellent speed/accuracy balance with 260+ chars/sec on M1 Pro. For even larger models, medium.en-q5_0 runs at ~130 chars/sec.

How do I benchmark performance?

GUI: Open SayToggle → Benchmarks tab → select model → "Run Benchmark". CLI: saytoggle bench-model --reps 3 for beautiful tables.

Why does the app ask for permissions?

Only microphone permission is needed for transcription. The global hotkey (⌥⌘C) works without any additional permissions using Apple's Carbon API.

Where are transcripts saved?

Transcripts are automatically copied to clipboard and shown in the GUI history pane. You can multi-select and concatenate entries.

"No speech detected" — how do I fix it?

Check System Settings → Sound → Input device. Move closer to microphone. Verify microphone permissions for Terminal/app.

Why is SayToggle better than other speech-to-text apps?

SayToggle is the only speech-to-text app designed specifically for AI interaction. While others focus on dictation or note-taking, SayToggle optimizes the entire AI workflow: instant hotkey access (⌥⌘C), automatic clipboard copying, multi-prompt building, and stunning vaporwave aesthetics that make daily AI interaction a joy.

Does it work offline?

Yes. All transcription runs locally on your Mac using Whisper.cpp with Metal acceleration. No cloud dependencies, complete privacy. Perfect for sensitive AI conversations.

How do I get SayToggle?

Direct: Buy securely with Gumroad for $19 (one-time purchase) and receive an instant download link via email. No subscriptions, no license keys needed, 100% local processing.

What is the license?

Personal Use License: One-time $19 purchase grants you the right to use SayToggle. Redistribution or reselling is not permitted. See the in‑app license viewer and LICENSE file for details.

How do I switch models?

GUI: Models tab → download/verify → "Activate". CLI: saytoggle activate-model medium.en-q5_0 (stored in ~/.saytoggle/active_model.path)

Can I use languages other than English?

English models (.en) are optimized by default for best performance. Broader language support with multilingual models is available but not the primary focus.

How do I report an issue?

Include your Mac model/chip (M1/M2/M3/M4), macOS version, selected model, and specific error messages when reporting issues.

What's the difference between GUI and CLI?

GUI offers visual model management, history, and animations. CLI provides scriptable access, global aliases, and integration with other tools. Both share the same model configuration.

How does model verification work?

Verification checks file existence, size ranges, GGML/GGUF magic bytes, and optionally full SHA256 hash + Whisper.cpp load test for integrity.

What are the visual background options?

Choose from 8 beautiful static backgrounds: Starfield (default), Vaporwave Gradient, Crystal Lattice, Neon City, Synthwave Grid, Neon Waves, Neon Hexagons, and Circuit Board. Plus animated Turmite colony cellular automata.

Does the global hotkey really work without permissions?

Yes! ⌥⌘C uses Apple's Carbon RegisterEventHotkey API, which works system‑wide without requiring Input Monitoring or Accessibility permissions. It's the same API used by many Mac apps.

Read Entire Article