Weights
HeuristicSynthesis 0.45 · speaker 0.25 · phase 0.20 · prosody 0.10. Uncalibrated, and stated as such. Calibrating them by logistic regression on a held-out set, and reporting Cllr, is on the measurement roadmap.
Technology
VoxShield Console runs one OS process, one CUDA context and one GPU worker. A four-second window of audio walks twelve stages and leaves behind a verdict, a prescribed action and an audit entry — then the audio is gone.
Product-level description. Constants, model names and licences on this page come from the Console repository's frozen constants and claims pack. Where something is heuristic, unvalidated or unbuilt, it is labelled on this page rather than smoothed over.
Detection pipeline
Select any stage for the detail. The order is not cosmetic — the gate before the score is the design.
Model stack
Every licence was read from source. Total new weights are about 177 MB, and all 15 model hashes are verified at load.
| Signal | Model | Licence | Weights | Device |
|---|---|---|---|---|
| Voice activity | Silero VAD v5 (ONNX) | MIT | 2.3 MB | CPU |
| Speaker identity | speechbrain/spkrec-ecapa-voxceleb | Apache-2.0 | 89.1 MB | GPU |
| Synthesis artefacts | AASIST (clovaai/aasist) | MIT | 1.28 MB | GPU |
| Language check | speechbrain language-id model — used only to route, never to claim coverage | Apache-2.0 | 86.4 MB | GPU |
| Phase (MGD) | librosa + numpy — excluded from fusion | ISC | 0 | CPU |
| Prosody (6 features) | librosa — excluded from fusion | ISC | 0 | CPU |
Phase and prosody are our own signals. They were built, tested, and left switched off because they performed no better than a coin toss — rather than quietly included to make the architecture diagram look fuller. 21 dependencies, all permissive licences.
Precondition gate
The gate is the reason this product is defensible. It decides whether the window can support a conclusion at all, and it runs first — because a score that exists is a score someone will eventually display.
| Reason code | Trigger |
|---|---|
| INSUFFICIENT_SPEECH | Under 2.5 s of voiced audio in the window |
| CHANNEL_DEGRADED | SNR below 10 dB, or clipping above 2% |
| NO_ENROLMENT | No voiceprint to compare the speaker against |
| ANALYSIS_TIMEOUT | Analysis exceeded 2 500 ms |
| SIGNAL_DISAGREEMENT | Signals disagree by more than 45 points |
| NO_VALIDATED_SIGNAL | No detector validated for the detected language |
Validation gate
A detector that has not been tested on the kind of audio in front of it is not evidence. So the system carries a short list of cases it has actually validated, and everything outside that list returns no score.
This is why the site claims no language coverage. The validated set is deliberately narrow, and widening it requires new measurement, not a configuration change. Until that measurement exists, those calls get a refusal rather than a number.
Risk fusion
When a signal is missing, VoxShield does not substitute a neutral value. It reports the interval the evidence actually supports.
# i = signals that completed, j = signals that are missing
low = 100 × Σ(w_i · s_i)
high = 100 × (Σ(w_i · s_i) + Σ w_j)
# A missing signal contributes 0 at the low end
# and its full weight at the high end.
# No signal completed ⇒ exactly [0, 100]
Synthesis 0.45 · speaker 0.25 · phase 0.20 · prosody 0.10. Uncalibrated, and stated as such. Calibrating them by logistic regression on a held-out set, and reporting Cllr, is on the measurement roadmap.
If the signals disagree by more than 45 points the fused number is not reported as a verdict at all — it returns SIGNAL_DISAGREEMENT.
Verdict system
is_fake is true,
false or null. A client that treats
null as false is a broken client.
No failure path produces SAFE. Too little speech, a degraded channel, a model throw, GPU out-of-memory, queue overflow or signal disagreement all land on LOW_CONFIDENCE with is_fake = null. A missing model file refuses to start the process. The rule is enforced in the database schema, in the gate and in the test suite.
Risk profiles
Four profiles turn the same verdict into four different actions.
| Profile | SUSPICIOUS | HIGH_RISK | LOW_CONFIDENCE |
|---|---|---|---|
| Routine enquiry | Log | Flag to agent | Log |
| Account change | Flag to agent | Hold + callback | Prompt secondary question |
| High-value transfer | Hold + callback | Block + escalate | Hold + callback |
| Privileged access | Block + escalate | Block + escalate | Block + escalate |
Audit chain
Each entry carries the hash of the one before it, starting from a genesis hash of 64 zeros. Verification does not just say “broken” — it names the sequence number of the first entry that does not line up.
Verdict, reason, profile, action.
SHA-256 over the payload plus the previous hash.
Written once; rows are never updated.
Names the first broken seq.
The audio window leaves memory.
Three corruption paths are covered by tests: a rewritten payload, a forged header and an excised row. Verification is exposed in the Console's Settings view, so it can be run in front of an evaluator rather than described to one.
Evidence
Nine benchmark harnesses, one reference machine, dates on everything.