feat(record): say what a meeting is being heard in, and let it be changed mid-meeting - #12
Merged
Merged
Conversation
…nged mid-meeting A default is right most of the time and wrong exactly when it matters. The call that turned out to be in English, the standup that switched — and until now the only way to correct it was to stop, open settings and start again, which costs the part of the meeting where somebody noticed. So `model_swap` finally does what its comment has promised since it was written. It carries an optional language as well as an optional model, both meaning "leave this as it is", and the daemon rebuilds the decoder under the running session: the file, the timing, the audio archive and everything already transcribed continue. A swap that fails leaves the old pipeline running, because losing a meeting is the worst possible answer to "change the language". Until today it answered `cannot load: this binary was built without recognition support` — in a build with recognition support. The interface gains a line while recording, on every screen, because a recording survives navigation: *"Đang nghe bằng Tiếng Việt · gipformer-65m"*, with a change control beside it. It reads `/status`, not the browser's own preference: a session that named no language resolves to the daemon's setting, and a banner reading `localStorage` would announce "detecting automatically" while the daemon confidently decoded Vietnamese. `SessionStatus::Recording` carries the language for exactly that reason. Multilingual meetings are now a choice rather than a side effect. "Nhiều ngôn ngữ (tự động)" is offered whether or not a multilingual model is installed — that is something a user knows before they own the model for it — and choosing it downloads what it needs, like choosing a language does. Two defects fell out of driving it: * **Installing a second speech model broke recording.** With nothing named in the settings the resolver only handled "exactly one", so adding a model for another language made every recording fail with `session needs a live model`. It now ranks the installed models for the language, which is the same answer the picker gives; with no language at all it prefers a multilingual model, because one that only speaks Vietnamese is the wrong guess for a meeting nobody described. * **The app claimed to be recording when the daemon had refused.** A non-transient error now stops the microphone and clears the recording state, with the daemon's own words in the banner. Before, the timer ran and the button stayed red while nothing was being written. `full-flow.mjs` asserts the change end to end: `(model's own) → vi, segments 3 → 3, still recording`.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A default is right most of the time and wrong exactly when it matters — the call that turned out
to be in English, the standup that switched. Until now the only correction was: stop, open settings,
start again. That costs the part of the meeting where somebody noticed.
model_swapnow does what its comment always promisedThe decoder is rebuilt under the running session — file, timing, audio archive and everything
already transcribed continue. A failed swap leaves the old pipeline running, because losing a
meeting is the worst possible answer to "change the language". Until today the command answered
cannot load: this binary was built without recognition support, in a build that had it.The interface says what it is hearing
"Đang nghe bằng Tiếng Việt · gipformer-65m" — on every screen, because a recording survives
navigation, with Đổi beside it. It reads
/status, never the browser's own preference: asession that named no language resolves to the daemon's setting, and a banner reading
localStoragewould announce "detecting automatically" while the daemon confidently decodedVietnamese.
SessionStatus::Recordingcarries the language for exactly that reason.Multilingual is now a choice
"Nhiều ngôn ngữ (tự động)" appears whether or not a multilingual model is installed — that is
something a user knows before they own the model — and choosing it downloads what it needs.
Two defects driving it exposed
session needs a live model. It now ranks installed models for the language; with no language, it prefers a multilingual oneVerified
full-flow.mjsasserts it end to end:language mid-meeting: (model's own) → vi, segments 3 → 3, still recording. Plus 1289 Rust tests (3 new), 297 web tests, 15/15 browser suites, clippy-D warnings, fmt, tsc, eslint.🤖 Generated with Claude Code