尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Speech timing/fluency and live on-device gaze/movement pattern analysis, with AI-assisted educational interpretation.
翻譯準備中
取自儲存庫 README
正在載入完整 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.
For educational and research use only. It is not a diagnostic tool.檢視完整 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