Voxint
From sound to intelligence: end-to-end transcription, diarization, and speaker identity with human-grade quality gates.
Voxint turns any audio or video file into an enhanced, speaker-attributed transcript:
media file → preprocess → transcribe (Whisper) + diarize (pyannote) + embed (TitaNet)
→ LLM transcript enhancement → speaker matching → human adjudication
What makes it different is the orchestration "glue" most pipelines skip:
- Quality gates at every stage — non-speech/digital-silence triage before you burn GPU time, hallucination soft-tagging and stripping, chunk-completeness checks, outage-vs-data-defect taxonomy with explicit retry budgets.
- Durable state, not vibes — a compare-and-swap'd run/stage state machine in Postgres; a crash at any stage is recoverable, and human pauses are database state, never a held task.
- Speaker identity done honestly — pgvector cosine matching against a grown speaker roster, a strict named ≠ grounded invariant, and machine proposals kept separate from human rulings.
- A built-in adjudication web UI — review queue, guarded slot workbench, and an immutable decision ledger, served as Jinja + htmx from the same FastAPI app (no Node toolchain).
- Measurement harnesses — name-accuracy scoring (McNemar / bootstrap / Wilson) and a
golden-dataset agreement labeler, runnable as CLIs (worked example under
examples/).
The adjudication console
Machine proposals stay separate from human rulings: the review queue lists completed runs with voices still needing a ruling, and the slot workbench shows each voice's evidence — grounded cosine matches, unverified LLM-heard names, transcript previews — with assign / enroll / exclude / unknown actions. (Synthetic demo data pictured.)
Status
Pre-alpha. APIs, schema, and layout may change without notice through the 0.x series.
Quickstart
Requires Docker Engine with the Compose plugin ≥ 2.24 (docker compose version — the legacy v1 docker-compose binary cannot parse this stack).
git clone https://github.com/bengizmo/voxint.git && cd voxint
cp .env.example .env # then edit at least VOXINT_PASSWORD
mkdir -p media # media mount; pre-create so it isn't root-owned
docker compose pull # prebuilt release images from GHCR
docker compose up -d # Postgres+pgvector, Redis, migrate, API + review UI, worker, beat
curl http://127.0.0.1:8080/healthz # default port; matches API_PORT if you changed it
The default compose files run the pinned release images — even from a
main checkout (set VOXINT_IMAGE_TAG in .env to run a different
release). A one-shot migrate service brings the schema to head before the
API and worker start — it showing Exited (0) in docker compose ps -a is
success, not a crash. If a default port is already in use on your host,
override the published side in .env (POSTGRES_PORT, REDIS_PORT,
API_PORT). Details and day-2 operations:
docs/operations.md.
To run the GPU model services too (one NVIDIA GPU assumed), first set
HF_TOKEN in .env — the pyannote service's diarization weights are
HF-gated, so you need a Hugging Face token with access to the pyannote
models accepted (see services/pyannote/README.md); compose refuses the GPU
overlay without it. Then:
docker compose -f compose.yaml -f compose.gpu.yaml pull
docker compose -f compose.yaml -f compose.gpu.yaml up -d
Per-service details, env tunables, and image matrices:
services/*/README.md; wire contracts:
docs/gpu-contracts.md.
To run the source you checked out instead of the release images, layer the build overlays (exactly one service owns each build — see docs/operations.md):
docker compose -f compose.yaml -f compose.build.yaml build api
docker compose -f compose.yaml -f compose.build.yaml up -d
For development without Docker:
uv sync --extra dev
uv run pytest tests/unit
uv run uvicorn voxint.api.app:app --reload
Deployment model
Docker-compose-first on a single Linux machine with one NVIDIA GPU:
compose.yaml— Postgres (+pgvector), Redis, API (+ review UI), Celery workercompose.gpu.yaml— the GPU model services: faster-whisper, pyannote, TitaNet
Kubernetes is explicitly not required (a future optional enhancement).
Modularity
ASR, diarizer, embedder, and LLM providers sit behind typed protocols with versioned HTTP
contracts (/v1/transcribe, /v1/diarize, /v1/embed). The LLM enhancement stage speaks to any
OpenAI-compatible endpoint and is optional (LLM_ENABLED=false by default). Domain-specific
vocabulary and prompts load from a swappable domain pack (DOMAIN_PACK_PATH); a neutral
meeting/podcast pack ships as the default.
License
Apache-2.0. See LICENSE and NOTICE — model weights (e.g. pyannote's HF-gated checkpoints) are subject to their own terms and are downloaded with your credentials; Voxint never vendors them.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file voxint-0.1.0.tar.gz.
File metadata
- Download URL: voxint-0.1.0.tar.gz
- Upload date:
- Size: 624.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9351e68cedd7f90806bf405f7165ea1fae4a3004b2f9290e7917e098ea896023
|
|
| MD5 |
8007fa7476b8c172e22c58cfaf2976c1
|
|
| BLAKE2b-256 |
187b29a16c4a93a84ce1196249b8272bc804d762016e046576ae95f45b4594fb
|
File details
Details for the file voxint-0.1.0-py3-none-any.whl.
File metadata
- Download URL: voxint-0.1.0-py3-none-any.whl
- Upload date:
- Size: 122.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2212984192439c924f836923e9db4c8f0976f218e985d552b6f664a21349ef5d
|
|
| MD5 |
4cc16fafa913a6ef5874a9335ca1dfc9
|
|
| BLAKE2b-256 |
a829b5d56dc50ade6c363ac0404db106a16bc2cb97e524da264b443906b21502
|