freezmo/package.json
Martin Dvorak 8c532ea6e6 Podcast speech: the highlight clock learns the engine's pace
"The tts dispatcher thing and the text highlight is completely out of sync on
desktop." Firefox + speech-dispatcher (like iOS) reports no onboundary events,
so the highlight rode a pure estimate - and a 130-word section drifts seconds
away from an engine that speaks at its own pace.

- On platforms without boundaries the system engine now speaks one sentence
  at a time, and every finished utterance re-anchors the clock: measured
  duration vs estimate, smoothed (half old, half new, clamped to 0.25-4x).
  Drift cannot accumulate past a sentence.
- The per-word estimate is punctuation-aware (full stop ~260ms, comma ~130ms).
- Once a boundary does arrive (Chrome), the rest of the section goes back to
  a single utterance with the exact clock - the accurate path is unchanged.
- When a boundary lands mid-section, the remainder is spoken as one utterance
  (it used to skip to the next section).

podcast-test's engine stub finishes utterances now and pins the whole thing:
one sentence first, the next following on its own, the highlight inside the
spoken text, a boundary collapsing the remainder, the highlight advancing.
53 checks. Version 0.7.10, SW v102.
2026-10-16 21:45:18 +00:00

44 lines
1.2 KiB
JSON

{
"name": "freezmo",
"version": "0.8.0",
"private": true,
"license": "GPL-3.0-only",
"scripts": {
"predev": "node scripts/copy-pdf-worker.mjs",
"dev": "next dev -H 0.0.0.0 -p 3207",
"prebuild": "node scripts/copy-pdf-worker.mjs",
"build": "next build",
"start": "next start -H 0.0.0.0 -p 3207",
"lint": "eslint",
"test:e2e": "node tests/run-all.mjs",
"version:bump": "node scripts/bump-version.mjs"
},
"dependencies": {
"canvas-confetti": "^1.9.4",
"framer-motion": "^12.23.24",
"jszip": "^3.10.2",
"katex": "^0.19.0",
"mammoth": "^1.13.0",
"next": "15.5.27",
"pdfjs-dist": "^6.4.299",
"react": "19.1.0",
"react-dom": "19.1.0",
"web-push": "^3.6.7",
"zod": "^4.1.13"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
"@tailwindcss/postcss": "^4",
"@types/canvas-confetti": "^1.9.0",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"@types/web-push": "^3.6.4",
"axe-core": "^4.14.0",
"eslint": "^9",
"eslint-config-next": "15.5.27",
"playwright-core": "^1.64.0",
"tailwindcss": "^4",
"typescript": "^5"
}
}