Skip to content

Pre-Check

Pre-Check — situational speech profiling for speech-language pathologists The clinic is a non-representative speaking situation: people who stutter often speak very differently with a clinician than on a phone call or or

Core trick

Runs a patient voice interview over OpenAI Realtime with patient-paced turn-taking, then fuses CrisperWhisper word timestamps with LLM dysfluency classification.

Tags

Description

Pre-Check — situational speech profiling for speech-language pathologists The clinic is a non-representative speaking situation: people who stutter often speak very differently with a clinician than on a phone call or ordering food — so SLPs assess a sample that doesn't reflect the disorder. Worse, standard ASR can't even capture the data: it erases, smooths, or garbles stuttered speech (we tested it — sound repetitions come back as the wrong words entirely). Pre-Check runs a pre-visit session: a patient talks with a calm voice agent about their speech (the baseline sample), then takes a simulated phone call — ordering a pizza — that elicits real-situation speech. A voice interface built for this audience: tap-to-finish turns, no VAD cutoffs, it never hangs up on you. Recordings run through a two-engine pipeline: CrisperWhisper for verbatim words + timestamps (blocks detected from inter-word gaps, repetitions from tokens) fused with LLM-Dys for dysfluency type classification, anchored per turn. The SLP gets a one-page profile: how speech changed across situations, playable timestamped evidence for every detected event, and a side-by-side of what standard ASR heard vs. what was actually said.
KristiyanVachev/abridge-speech-therapy★ 00 forksTypeScriptCreated Jul 18, 2026 · last push Jul 19, 2026

README excerpt

# Pre-Check

Your clinic visit isn't where you stutter. Pre-Check shows your SLP how you actually speak — across real situations.

A patient completes a short voice conversation before their visit: a warm intake chat, then a simulated phone call (ordering a pizza from "Bella's Pizzeria"). The conversation flows naturally — no push-to-talk, no buttons — with turn-taking handled by OpenAI Realtime's **semantic VAD at its most patient setting** (`eagerness: "low"`), so the agent waits generously before responding. Each user turn is recorded and stored server-side, ready for later speech analysis. The clinician gets a Speech Profile (mocked in this build).

Built at the Abridge Hackathon.

## Run it

```bash
cp .env.example .env        # then put your OpenAI key in OPENAI_API_KEY
npm install
npm install --prefix client
npm run dev                 # starts Express (:8787) + Vite (:5173) together
```

Open http://localhost:5173 (if 5173 is busy, Vite picks the next port — watch the console).

### Routes

| Route | What it is |
|---|---|
| `/` | Minimal landing page |
| `/precheck` | The patient flow: mic permission → intake conversation → scenario card → incoming call → active call → warm close |
| `/slp` | Mocked clinician Speech Profile (static, fed by `fixtures/profile.json`) |

## Voice engine

**OpenAI Realtime API over WebRTC** — the server mints an ephemeral client secret per session (`POST /api/realtime/token`); the real API key never reaches the browser. Turn-taking uses t

Team