From 4b1edb061778fd7735c179f23ef0fba9247672ca Mon Sep 17 00:00:00 2001 From: claude Date: Sun, 9 Aug 2026 00:46:51 +0400 Subject: [PATCH] Record which machine hears him now (V-486) Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_013ptwopxyo3Z2kwFckHkLvN --- CLAUDE.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index fc4fe84..80e5e59 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -47,6 +47,22 @@ free — `worldGap` in `cmd/mavend/worldmodel.go`, which the owner hears instead answer. A box with no `workstation` block behaves exactly as it did before the seam: naming a gap requires a gap. The offload table in `docs/offload.md` says which caller is which. +**Speech-to-text moved on 2026-08-09** (V-486). `sttSeam` in `cmd/mavend/voicewire.go` +builds an `stt.Pair` beside `modelSeam`, preferring CrisperWhisper 2.0 turbo on workpc +with mavsttd as the floor. It takes only the silent half of the rule. A worse +transcript is still a turn, so `stt.Pair` has no `TranscribeRemote`. The fallback is +never spoken. CW2 turbo scores **10.4% WER in Russian against 27.5%** for the `ggml-small.bin` +mavsttd loads, over 200 Golos clips +(`docs/evals/2026-08-09-crisperwhisper2-russian-wer.md`). It runs in Intended mode, not +Verbatim, though that corpus cannot separate the two. +**whisper.cpp cannot load CW2 at all.** It reads its language count off the vocabulary +size, and CW2's 51897 tokens shift seven special token ids. So it is not a second +endpoint on mavgpud. It is its own transformers service on port 8081. `stt.HTTPTranscriber` +posts raw PCM to it with a bearer token, because audio is the most sensitive thing that +crosses this seam. The switch is `workstation.stt` in +`deploy/mavend.json`, and deleting the block sends every utterance to mavsttd. +Text-to-speech has not moved and piper on homesrv is still the only synthesizer. + ## Build & test CGO daemons (`mavend`, `mavsttd`, `mavttsd`, `mavenclient`) need the vendored toolchain