speaker: do not ship three methods that cannot work
The package comment, the embedder log and the startup line all said enrolment was live and only recognition was blocked. Enroll embeds every sample before it stores anything, so with no model on the box it fails on the first sample with ErrDisabled and nothing is ever stored. List then returns an empty list forever and Forget has nothing to delete. The shipped state was three methods, all no-ops, announced as a working half. SpeakerConfig.Recognizes was written as the gate for this and never called, so a block with enabled and no model_path wired everything and skipped the one warning the operator needed. It is the gate now, and that config shape logs why it stayed off. Three smaller repairs. ErrDisabled had no case in speakerErr and reached the surface as an opaque core failure, when it means the same thing ErrUnknownMethod does. Forget read the row first and answered ErrNotFound on a second call, so the layer documented as the one that must always work reintroduced a failure for a voiceprint that was already gone. And a row with unparsable metadata listed as a plausible profile named after its own id with 0 samples, which is what a real minimal enrolment looks like; it is reported as damaged now. Found in review of #74.
This commit is contained in:
@@ -31,6 +31,14 @@
|
||||
// There are also no enrolment samples. So Recognizer runs against Disabled and
|
||||
// every Identify answers ErrDisabled until a model lands.
|
||||
//
|
||||
// "Recognition is blocked but enrolment works" is not true and this package
|
||||
// used to imply it. Enroll embeds every sample before it stores anything
|
||||
// (enroll.go, "Embed first, store second"), so with no model it fails on the
|
||||
// first sample with ErrDisabled and nothing is ever stored. List then returns
|
||||
// an empty list forever and Forget has nothing to delete. Without an embedder
|
||||
// all three operations are no-ops, and mavend does not wire the wire methods
|
||||
// at all in that state.
|
||||
//
|
||||
// The MFCC + GMM "simplest floor" in the plan document is refused rather than
|
||||
// deferred. A hand-rolled spectral distance would identify people confidently
|
||||
// and wrongly, and its output would be written into facts as "Ками said this".
|
||||
@@ -46,11 +54,15 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/kami/maven/internal/audio"
|
||||
"github.com/kami/maven/internal/memory"
|
||||
)
|
||||
|
||||
// Prefix — the id prefix speaker profiles carry in the shared vector table.
|
||||
// It is what ByPrefix enumerates and what keeps voiceprints out of note recall.
|
||||
const Prefix = "speaker:"
|
||||
// It is what ByPrefix enumerates, and what every Store implementation filters
|
||||
// out of Search so note recall cannot rank a voiceprint. The constant lives in
|
||||
// internal/memory because the store layer has to know it and cannot import this
|
||||
// package.
|
||||
const Prefix = memory.NonRecallPrefix
|
||||
|
||||
// DefaultThreshold — cosine similarity a match must beat to be a match.
|
||||
//
|
||||
@@ -133,6 +145,12 @@ type Profile struct {
|
||||
Samples int `json:"samples"`
|
||||
Dim int `json:"dim"`
|
||||
|
||||
// Damaged marks a row whose stored metadata did not read back cleanly —
|
||||
// an unparsable sample count or timestamp, or a missing name. The
|
||||
// voiceprint is still usable, but the row should be listed as damaged
|
||||
// rather than as a plausible profile enrolled from nothing.
|
||||
Damaged bool `json:"damaged,omitempty"`
|
||||
|
||||
// Vec is the voiceprint. Not serialised to any surface: a listing tells him
|
||||
// who is enrolled, it does not hand out the biometric itself.
|
||||
Vec []float32 `json:"-"`
|
||||
|
||||
Reference in New Issue
Block a user