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.
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