voxsheild
Client for the VoxVerify voice-authenticity API — batch file analysis, the pre-action risk gate, and live-call scoring over a WebSocket.
The classes keep the service's name, because that is what they are a client of: the API
paths, the environment variables and the OpenAPI document all say VoxVerify. voxsheild
is what you install and import.
pip install voxsheild
Python 3.11 or newer, httpx and websockets>=14.0. The floor on websockets is real: the stream client passes additional_headers=, which 14.0 renamed from extra_headers.
Analyse a recording
from voxsheild import VoxVerify
with VoxVerify("http://127.0.0.1:8000", api_key=KEY) as vx:
verdict = vx.analyze("call.wav", segments=True)
print(verdict["verdict"], verdict["ai_score"]) # LIKELY_AI 0.91
Three verdicts, never two: LIKELY_HUMAN, LIKELY_AI, INCONCLUSIVE. The service
abstains rather than guessing when the fused score does not clear a validation-selected
threshold, or when the fusion weight behind it is split. Treat the estimate as evidence,
not proof — the absence of a synthesis cue is not evidence of human origin.
Score a live call
import asyncio
from voxsheild import LiveCall
async def main():
async with LiveCall("http://127.0.0.1:8000", api_key=KEY,
sample_rate=8000, codec="pcm_mulaw") as call:
asyncio.create_task(pump_audio(call)) # your RTP / device loop
async for event in call.events():
if event["type"] == "risk":
print(event["state"], event["confidence"])
print(await call.stop())
send() and events() are meant to run in different tasks: audio arrives continuously while events come back on their own schedule. Do not iterate events() from two tasks at once.
Frames are capped at 1,048,576 bytes, and both clients split at the cap rather than let an oversized frame close the socket and cost the call every window it had accumulated. The caps are generated from the document, so a deployment that tunes them does not need this package patched.
Auth
Keys are per-tenant and scoped, and the tenant comes off the key — no request body may
name one. 10 of the 18 documented operations require a scope; the batch
forensic routes are open by design. A 403 carrying scope means the key is real but
provisioned for a different surface, which is a different fix from a bad key.
Version
1.0.0, which is the API document's version rather than a number this package
maintains separately. The request methods are generated from that document; the
live-call client is hand-written, because OpenAPI 3.1 has no vocabulary for a socket.
Prototype for research and evaluation. Do not present any output of the service as proof of origin, and do not use it as the sole basis for an accusation.
Release files for voxsheild 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| voxsheild-1.0.0.tar.gz | 16.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| voxsheild-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.4 kB
Release files / voxsheild-1.0.0.tar.gz
| Download URL | voxsheild-1.0.0.tar.gz |
|---|---|
| Size | 16.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e5d41adef75d3d7f8558d976abf5b7d47c1ff2c7dcc5cea624b4e8456893aaec
|
|
BLAKE2b-256 checksum How to use checksums |
7b692c8ac52b86aa5447fb3f0c5d528ac8248df10f15381c49fded0431d22da3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Release files / voxsheild-1.0.0-py3-none-any.whl
| Download URL | voxsheild-1.0.0-py3-none-any.whl |
|---|---|
| Size | 17.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1be1f22938bf178bd570a5fa33a7080c369f413e228790a7a0fbe3fdeea4cfa6
|
|
BLAKE2b-256 checksum How to use checksums |
c97a474b9461f6d6622ae3d28a43ca49aa6ece20e5d8f79684ac580e1b64f07b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|