The Problem Nobody Talks About

Over 2.5 million Americans — 50 million worldwide — live with expressive aphasia following stroke or traumatic brain injury. Their comprehension is fully intact. They know exactly what they want to say. They simply cannot produce the words.

Imagine trying to tell a nurse "my chest hurts" — and not being able to find the words. Not because you don't know them. Because the neural pathway that produces them was destroyed by a stroke at 3am on a Tuesday.

That is aphasia. And it affects more Americans than Parkinson's disease, muscular dystrophy, or cerebral palsy combined.

What Every Existing Tool Gets Wrong

We looked at the leading AAC (Augmentative and Alternative Communication) apps — TouchChat, Proloquo2Go, Snap Core First. Every single one asks the user to construct a sentence: drag words, arrange symbols, select tokens in order.

That is precisely the cognitive task aphasia makes impossible.

The tools designed to help people with aphasia require the one thing aphasia takes away.

The Inversion

Voca doesn't ask users to build sentences. It asks them to tap concepts — disconnected fragments of what they want to express — and reconstructs the full, natural sentence for them.

Chest Pain. That's it. One tap.

Voca sends that concept to Llama 3.3 70B via Groq, with a detailed persona profile describing how this specific user talks. The model reconstructs three complete sentence options, streamed progressively so the first option appears in under a second. The user taps Speak. ElevenLabs plays it back in a voice matched to their personality.

No typing. No sentence assembly. No friction.

What We Built

  • Concept-tap flow: 49 concepts across 9 categories — Emergency, Basics (Yes/No/Please/Thank You), People, Food, Places, Needs, Health, Emotions, Body
  • Real SSE streaming: Groq's stream=True with token-level line detection — no fake progress bars, genuine sub-1s first token
  • Dual persona system: Jake (casual, TBI recovery, Josh voice) and Maria (formal, stroke survivor, Rachel voice). Identical concept taps produce genuinely different sentences and genuinely different voices
  • Quick Emergency panel: Chest Pain, Can't Breathe, Call 911 — always visible, speaks instantly with no AI wait, uses a neutral clear voice regardless of active profile
  • No-repeat regeneration: rejected sentences are permanently excluded from all subsequent generations in the session
  • Saved phrases: profile-tagged, localStorage-persisted, with a caregiver pre-load workflow
  • Progressive Web App: installable on tablet, offline service worker for emergency phrases — because emergencies don't wait for WiFi
  • High-contrast mode: WCAG-friendly toggle for low-vision users

The Moment That Surprised Us

When we first got the profile system working — Jake saying "Chest is killing me. Call 911." and Maria saying "I am experiencing significant chest pain and require immediate medical attention." — from the exact same single tap — we realized this wasn't just a communication tool. It was giving people back a voice that sounds like them. Not a robotic readout. Not generic text-to-speech.

Their voice. Their personality. Their words.

That moment changed how we thought about what we were building.

Technical Challenges

Real streaming without faking it. Groq's streaming API sends tokens continuously — not sentences. We had to detect completed numbered lines (1. ... \n) from the raw token stream and emit each sentence the instant its newline arrived. No buffers, no artificial delays, no polling.

Profile switching without state flicker. When users tap "Try Maria's voice", we needed to switch the active profile AND immediately regenerate — without clearing the current results first (which would show a blank state). The solution: a isSwitchingProfile ref that gates the useEffect clear-on-switch behavior, combined with a profileOverride parameter to handleGenerate that uses the new profile before React state has settled. Clean, zero-flicker.

ElevenLabs availability caching. The TTS status check was blocking every Speak tap. We built a module-level cache that only caches true (available) — never false — so the app retries on failure without permanently falling back to Web Speech API after a transient error.

What We Learned

The hardest part of building accessibility tools isn't the technology. It's resisting the temptation to add complexity. Every feature we considered had to pass one question: does this reduce friction, or add it?

Aphasia users have enough friction. Voca's job is to get out of the way.

Built With

  • api
  • elevenlabs
  • fastapi
  • framer
  • groq
  • motion
  • pwa
  • python
  • react
  • render
  • sse
  • vercel
  • vite
  • workbox
Share this project:

Updates