Speech timing/fluency and live gaze/movement analysis, with AI-assisted interpretation.
HealthJavaScript · CSSGitHub @QuadribakareOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Speech timing/fluency and live on-device gaze/movement pattern analysis, with AI-assisted educational interpretation.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A dark-themed web app with two tabs — Speech and Video — that measure behavioral patterns and explain the results with AI. Plain HTML, CSS and JavaScript on the front end, with small serverless functions on Vercel. No framework and no TypeScript.
For educational and research use only. It is not a diagnostic tool.Read the full README ↗A dark-themed web app with two tabs — Speech and Video — that measure behavioral patterns and explain the results with AI. Plain HTML, CSS and JavaScript on the front end, with small serverless functions on Vercel. No framework and no TypeScript.
Live app: autism-speech-pattern-analyzer.vercel.app
For educational and research use only. It is not a diagnostic tool.
flowchart LR
subgraph Browser["Browser (public/)"]
UI["index.html\ntab UI"]
Speech["app.js\nSpeech tab"]
Video["video.js\nVideo tab"]
MP["MediaPipe\nFaceLandmarker + HandLandmarker\n(WASM, on-device)"]
end
subgraph Vercel["Vercel serverless functions (api/)"]
T["transcribe.js"]
A["analyze.js"]
AV["analyze-video.js"]
end
Groq["Groq Whisper\nLarge V3"]
OR["OpenRouter\nLLM"]
UI --> Speech
UI --> Video
Speech -- "trimmed 16kHz mono WAV" --> T
T --> Groq
Groq -- "transcript + word timings" --> T
T --> Speech
Speech -- "speech metrics only" --> A
A --> OR
OR -- "interpretation text" --> A
A --> Speech
Video --> MP
MP -- "landmarks, in-browser only" --> Video
Video -- "gaze/head/movement metrics only\n(never video)" --> AV
AV --> OR
OR -- "interpretation text" --> AV
AV --> Video
API keys (GROQ_API_KEY, OPENROUTER_API_KEY) are read from environment variables on the server side only — the browser never sees them.
| Piece | Role |
|---|---|
public/index.html | Single page with two tabs (Speech, Video); tab switching is a tiny inline script |
public/app.js | Speech tab's logic |
public/video.js | Video tab's logic (its DOM ids are all prefixed v- so the two tabs' scripts never collide) |
api/transcribe.js | Sends the audio to Groq Whisper and returns word timings |
api/analyze.js | Builds the prompt from the measured speech metrics and calls OpenRouter |
api/analyze-video.js | Builds the prompt from the measured video metrics and calls OpenRouter |
The browser decodes the file, trims it to the first 120 seconds, and resamples it to 16 kHz mono WAV before upload. That keeps the request under Vercel's 4.5 MB body limit and replaces the librosa step from an earlier Python version.
sequenceDiagram
participant U as User
participant B as Browser (app.js)
participant T as api/transcribe.js
participant G as Groq Whisper
participant A as api/analyze.js
participant O as OpenRouter
U->>B: Upload/record audio
B->>B: Trim to 120s, resample to 16kHz mono WAV
B->>T: POST audio
T->>G: Transcribe (word timestamps)
G-->>T: Transcript + word timings
T-->>B: Word timings
B->>B: Compute response time, wpm,\nword durations, repeated phrases
B->>A: POST metrics only
A->>O: Prompt built from metrics
O-->>A: Educational interpretation
A-->>B: Interpretation text
B->>U: Timeline + transcript + interpretation
Runs a live webcam session and measures four things in real time, entirely on-device:
getUserMedia, records up to 60 seconds with MediaRecorder (for playback afterward), and samples the live feed at roughly 6–7 frames/second while it runsapi/analyze-video.js, which reports on exactly these four things in a short, direct, non-diagnostic explanationflowchart TD
Cam["getUserMedia webcam feed"] --> Sample["Sample ~6-7 fps"]
Sample --> FL["FaceLandmarker\n(gaze blendshapes, 468-pt mesh)"]
Sample --> HL["HandLandmarker\n(21-pt hand skeleton)"]
FL --> Gaze["Gaze metrics"]
FL --> Head["Head position metrics"]
HL --> Move["Arm/hand movement metrics"]
HL --> Squeeze["Hand-squeezing metrics"]
Gaze --> Metrics["Metrics only"]
Head --> Metrics
Move --> Metrics
Squeeze --> Metrics
Metrics --> AV["api/analyze-video.js"]
AV --> OR["OpenRouter"]
OR --> Result["Non-diagnostic explanation"]
Import this repository at vercel.com/new. No build settings are needed.
Add these environment variables under Project Settings, then redeploy:
| Name | Where to get it |
|---|---|
GROQ_API_KEY | https://console.groq.com/keys |
OPENROUTER_API_KEY | https://openrouter.ai/keys |
OPENROUTER_MODEL (optional) | Tried first if set; otherwise a built-in list of free models is tried in order |
npm i -g vercel
cp .env.example .env # then fill in your keys
vercel dev