Problem
Nemotron load, warm-up, and chunk decode run through the main page path. That competes with UI rendering, timers, transcript DOM work, and notes scheduling. Whisper already uses a worker-backed executor pattern.
Evidence
index.html:3674-3693 imports nemotron-engine.js, constructs NemotronEngine, and awaits load() from the main app path.
index.html:3720-3723 feeds captured samples directly to the engine from the capture callback.
nemotron-engine.js:168-205 loads model bytes, builds ORT sessions, and warms up the engine.
nemotron-engine.js:286-302 drains and decodes chunks via engine.transcribeChunk.
whisper-engine.js:122-135 shows the existing worker executor pattern.
Acceptance criteria
- Move Nemotron model load/create/feed/finalize/stats execution behind a dedicated worker protocol.
- Keep main-thread API compatibility for
startNemotron(), pause/resume, stop/finalize, status, text events, and stats.
- Use transferables or batching so audio-post overhead does not erase the benefit.
- Preserve transcript ordering and finalization guarantees.
- Validate with real audio and PerfMonitor before/after evidence.
Problem
Nemotron load, warm-up, and chunk decode run through the main page path. That competes with UI rendering, timers, transcript DOM work, and notes scheduling. Whisper already uses a worker-backed executor pattern.
Evidence
index.html:3674-3693importsnemotron-engine.js, constructsNemotronEngine, and awaitsload()from the main app path.index.html:3720-3723feeds captured samples directly to the engine from the capture callback.nemotron-engine.js:168-205loads model bytes, builds ORT sessions, and warms up the engine.nemotron-engine.js:286-302drains and decodes chunks viaengine.transcribeChunk.whisper-engine.js:122-135shows the existing worker executor pattern.Acceptance criteria
startNemotron(), pause/resume, stop/finalize, status, text events, and stats.