Skip to content

Feat/meeting replay - #10

Merged
ikusteu merged 2 commits into
mainfrom
feat/meeting-replay
Oct 30, 2026
Merged

ikusteu merged 2 commits into
mainfrom
feat/meeting-replay

Conversation

@ikusteu

@ikusteu ikusteu commented Oct 30, 2026

Copy link
Copy Markdown
Member

Reopened #6 (only against main)

silviot and others added 2 commits October 27, 2026 12:23
… panel

Cassini's recorder archives every meeting with one audio track per
participant. `python -m cassini_live.replay meeting.mkv` plays those tracks
in lockstep through the real transcribers, VAD gate and engine (Whistle or
Nemotron, sized as for a CPU quota) and writes a timeline of joins, finals
and partials stamped in meeting time. Speed 1 paces at real time, so
contention and latency are the call's; speed 0 waits for the engine, so the
text is complete and the clock is the speech.

`npm run replay -- meeting.replay.json` serves that timeline to the real
panel bundle on a Talk-shaped page under Nextcloud's CSP, with a transport
bar: play, pause, scrub to any moment, speed, and "view as" any
participant. The server owns the clock, answers the panel's own /history
poll with what existed at that moment, and the page feeds the panel each
speaker's in-progress partial. A seek remounts the panel, so catching up is
the late-joiner path.

The transcriber's one-second silence timeout becomes a module constant the
replay raises at speed 0, where a track stalls while the engine works on
another; production keeps 1.0 s.

Tests: a synthetic two-track mkv through the fake engine host (python), and
the viewer scrubbed through a hand-written timeline (Playwright). Verified
on the 2026-03-13 standup: two minutes of four tracks in ~30 s with either
engine.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The default model lookup used engine.asset.directory, the sherpa-onnx release
folder name. #7 drops it (downloads come from dist.gocassini.com as single
files), so replay would raise AttributeError after that merge. Look in the
app's own install path (<storage>/models/<engine id>), which the old lookup
never matched, then in the local/stt-eval reference copies, whose release names
now live in replay.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ikusteu
ikusteu merged commit 034fe95 into main Oct 30, 2026
20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants