Releases: bengizmo/voxint
Release list
Voxint v0.34.0
What's new in v0.34.0
Added
- Auto-enroll near-miss evidence (#434). Every auto-enrollment decision now persists per-label diagnostic data (similarity, margin, vote agreement, top candidate, roster size) in a new
auto_enroll_evidencetable. Previously this evidence was computed and discarded, making threshold tuning guesswork. - Speaker roster dedup CLI (#432).
voxint speakers dedupreports probable duplicate speakers using embedding cosine similarity and optionally merges safe pairs. Dry-run by default. - Post-batch reconcile CLI (#430).
voxint speakers reconcilere-derives speaker proposals for runs that were matched against a smaller roster than today. Reports a semantic before/after diff. Dry-run by default with explicit--apply. - Restart preflight checks (#422). Restarting a completed run now checks for adjudication work that would be invalidated. Segment-scope rulings block restart; label-scope rulings warn with a required acknowledgment checkbox.
- Feature flag dependency nesting (#406). Dependent flags are visually nested under prerequisites in Settings, disabled when prerequisites are off, and preserved on save.
- Operator feedback when invariant blocks a flag reset (#404). Plain-language notice instead of a silent redirect.
Fixed
- Watch-folder batch cap prevents model-service flooding (#418). Each sweep now submits at most
WATCH_FOLDER_BATCH_SIZEfiles (default 8). - Saturation errors no longer exhaust the retry budget (#418). 503s from model services are classified as saturation and excluded from
STAGE_MAX_ATTEMPTS. - Settings compat routes now reconcile switch state (#446). Five legacy POST routes that bypassed
_reconcile_switchesare fixed.
Install / upgrade
# Docker (recommended)
docker compose pull
# pip
pip install voxint==0.34.0Full changelog: https://github.com/bengizmo/voxint/blob/main/CHANGELOG.md
Voxint v0.33.0
What's new in v0.33.0
Added
- In-place voice embedding-space migration.
voxint speakers re-embeddiscovers the current embedding space, previews stale runs, replaces stored turn vectors and sourced enrollment centroids without re-transcription, and refreshes speaker matches.voxint doctornow warns about mixed or service-stale voice embedding spaces.
Fixed
- Cross-episode speaker matching no longer creates duplicate "Voice N" entries (#433). Auto-enroll's link-or-create decision was using grounding-tier cosine thresholds (>= 0.70), rejecting same-speaker matches in the empirical 0.60-0.70 variance band. Now uses standard thresholds with a singleton-roster guard.
- Auto-enrolled speaker centroids now grow over time (#431). When auto-enroll matched a label to an existing speaker, it recorded the decision but did not add a SpeakerEmbedding, leaving the centroid frozen at first enrollment. Matched labels now contribute embeddings.
- TitaNet ONNX embedding no longer crashes on diarization turns longer than about 120 s. ONNX Runtime failed with a BroadcastIterator::Init shape mismatch. Long turns are now embedded as capped sub-windows (#424).
- Timeline deep links now jump to the correct transcript row (#420).
- Timeline and transcript colours now agree (#420).
- Raw label badge restored on hydrated transcript rows (#420).
- Timeline lanes show the raw diarization label (#420).
Full changelog: https://github.com/bengizmo/voxint/blob/v0.33.0/CHANGELOG.md
Voxint v0.32.0
Voxint 0.32.0 ships the UX audit remediation epic (#369, seventeen slices), media library search and status filter (#380), a read-only viewer role (#363), the evidence pack and bundled quote export (#331, #281), and GPU resource awareness in the installer.
Images: ghcr.io/bengizmo/voxint:0.32.0 and the model-service images (CUDA, -cpu multi-arch, whisper -rocm), plus the optional voxint-llm and voxint-synthdetect images. Full changelog below.
Added
- Low-data rendering for project widgets (#385, UX audit S16). With the
one to ten recordings a new project actually has, the overview widgets
now pick a simpler shape instead of a near-empty chart: fewer than five
entities render as a ranked count list rather than same-length bars;
when there are fewer than three speakers or fewer than three
recordings, speaker coverage renders as a plain speaker list showing
each speaker's recording count and recording names; and recordings
that all fall on one day render a dated summary ("Trends appear once
recordings span more than one day") rather than a one-point trend
chart. The temporal payload carries a server-decideddisplay_mode,
so the page and the chart island share one threshold. The simpler
shapes hide nothing: every entity and speaker in them is listed and
linked, and truncated labels carry the full text as a tooltip. - Labelled navigation rail and one theme control (#384, UX audit S15).
The left rail now shows text labels next to its icons at desktop width
(wider than 1120px), collapses to the familiar icon-only rail with hover
tooltips between 800px and 1120px, and the narrow-screen disclosure
shows labels too instead of unlabelled icons. The theme switch
(System / Light / Dark) moves out of the top bar into the rail footer,
so it is in the same place on every page that has the rail, for
every user (the setup wizard has no rail, as before); the
Settings Appearance radios still mirror it. The Runs activity badge
stays attached to its icon at every width. - Media library search and status filter (#380). Server-side search
(case-insensitive substring over display name, source path, and folder
name) and a status filter (Needs review / Failed / Reviewed / All).
Search and filter compose with each other and with the existing sort
and view controls. An empty-result state with a Clear link replaces the
generic empty message when a filter is active. Row actions are now
state-dependent: Review (needs adjudication), Retry (failed), or Open
(everything else). The "File missing" chip is replaced with plain
language ("Original file not found") showing the expected path. - GPU resource awareness in the installer. VRAM-aware tier recommendation
with per-device compose targeting, interactive device selection,--gpu-check
diagnostics, and enhanced--hardware-dry-run. The installer now inventories
all NVIDIA and AMD GPUs, measures free VRAM, and recommends the compute tier
that fits. When a GPU is occupied (e.g. by a local LLM), the installer
explains why and defaults to CPU. - Runs canonical lifecycle surface (#381, part 1).
/runsbecomes the
canonical lifecycle view: four lifecycle tabs (Needs attention / Active /
Failed / All), title-first rows with the run ID demoted to a copyable
secondary, a collapsible filter bar (auto-opens when any filter is active,
power filters like transcript search and date range under "More filters"),
a one-line pipeline health summary linking to Settings Status, and
auxiliary jobs behind a closed disclosure. State-dependent row actions
(Review / Retry / View) and degraded-service banners carried over from
the Jobs page. - Grouped failures with bulk retry (#381, part 2). On the Failed tab,
runs with identical errors are grouped into a single row showing the
error label, count, and a "Retry all" button. The bulk retry endpoint
uses per-item CAS with savepoints for partial-failure safety, CSRF
protection, and a per-item result page. - Single-operator auto-claim (#374). When multi-user mode is off, the
editor and workbench auto-claim on mount, removing the manual "Claim for
editing" / "Claim for review" friction. The review queue hides the
"Claimed by" column. A non-rotatingrefreshendpoint replaces the
heartbeat's previous re-claim, so a stale tab receives 409 and drops to a
manual "Resume editing here" action with no two-tab heartbeat fight.
Visibility-aware: the heartbeat pauses while the tab is hidden and fires
an immediate refresh on re-visible. Multi-user behavior is unchanged. - Viewer role (#363). A new read-only
viewerrole: viewers can browse
transcripts, results, and exports but cannot submit media, adjudicate,
correct, annotate, or change any settings. Enforced server-side with a
blanket write gate on all mutation routes (console and API); the gate
allowlists only auth routes (login/logout). Template context exposes a
can_writeboolean for UI affordance hiding. CLIuser create --role
anduser set-roleacceptviewer. Migration 0057 widens the DB CHECK
constraint. Dark-shipped behind the existingconsole_users_enabledflag
(user management page only). - Evidence pack (#331, Phase 7 remainder). A printable page of a run's
highlights with their provenance (speakers, timing, tags, notes, source
text hash, clip references, pipeline model identity), linked from the
review transcript. Print or save it as a PDF from the browser; no PDF
library added. Stale highlights print with a visible warning instead of
blocking the document. - Bundled quote export (#281). One click downloads a highlight's Markdown
pull-quote, JSON provenance manifest, and audio clip (when one has been
extracted) as a single ZIP, per highlight or for every highlight matching
the current tag filter. The bundled files match the standalone exports
byte for byte (the manifest differs only in its export timestamp). No new
dependencies (stdlib zipfile). - Highlight tag rollup on Explore (#331, Phase 7 remainder). The Explore
page now shows how many highlights carry each tag, corpus-wide or narrowed
by the project filter. Computed live with one SQL query (no cache, no new
dependencies); archived tags and deleted highlights are excluded, and
highlights on runs still under review count from the moment they exist.
Changed
- Queue, speakers, explore polish (#383). Review queue rows show the
folder name instead of the raw file path. Confidence scores throughout
the review workbench are humanized to bands (likely / possible / low)
instead of raw decimals. Speakers page: unnamed voices are listed first
and expanded by default. Profile fields are editable inline (blank + Save
clears). Speaker insights poll automatically when computing (bounded,
with backoff). Explore empty state shows example searches and a
capability hint. /jobsnow redirects to the canonical/runssurface; old bookmarks and
links continue to work (#382)- Settings control model (#379). Every tri-state feature setting
(On / Off / Use installation setting) is now a toggle switch showing
the effective state. Overridden settings show a "Changed" badge and a
"Reset to default" affordance. Each settings tab has one Save button
instead of one per section. Feature dependencies are enforced by
disabling the dependent switch with an inline reason, not prose
notices. The LLM checkbox is restyled as a visual switch (no
inheritance; the underlying model is unchanged). The three persisted
states (on / off / inherit) are preserved on the wire; saving without
changes never converts an inherited flag to a pinned override (save
idempotency). - Settings IA: tabs (#378). The settings hub is split into tabbed
sub-pages: General (appearance, features, tutorial), Media (folders,
sources), and AI (LLM, translation, corrections, glossary, semantic
search). All five existing sub-pages (Status, Hardware, Database,
Plugins, Users) now share a single tab strip include instead of
duplicating it. Old fragment links like/settings#llmredirect to
the correct tab. All POST routes unchanged. The legacy flat page
(flag off) is unaffected. - Run detail restructure (#377). The run detail page (shared by
/runs
and/jobs) puts the summary card first (status, readable stage name,
error with recovery hint, and the primary action). The Manage card moves
up, right after notices. Technical details (source path, revision, pipeline
models, glossary, detected language, stage ledger) fold into a collapsed
section. Speaker timeline shows readable durations. "Restart from scratch"
becomes "Run again from the beginning". - Error normalization (#376). Raw pipeline error strings are replaced with
plain-language labels and recovery hints across all operator surfaces (home,
editor, run detail, jobs). The original error is preserved in a collapsible
details fold. The home Recent feed groups consecutive identical failures
into one row with a count. New patterns: GPU memory, GPU errors, deferred
stages, paused runs. - Editor content reorder (#375). The outline panel (topics and entities)
moves below the transcript and starts collapsed with a count badge, putting
the work surface first. Transcript rows show one speaker display name
instead of duplicating the raw diarization label and display name. The
export section collapses into a single "Download transcript" button with a
compact format picker (reviewed text default; other variants in a nested
disclosure). The breadcrumb shows run status instead of duplicating the
live progress counter. A new Run card shows status, error, and
Retry/Re-run actions directly on the editor page. - Type foundation (#373). Base font raised from 13px to 15px for reading
surfaces; grid-tables and HTML tables use a new dense token (13px) so they
keep t...
Voxint v0.31.0
Highlights
Media editor island (#157, Console 2.0 P3b)
In-browser transcript editor with memoized row rendering, editor-native claim lifecycle (claim, heartbeat, release), progressive-disclosure speaker rail, translate action, per-segment correction provenance, and accessibility hardening.
Corpus intelligence
- More like this passage (#357) — inline similar-passage search on Explore KWIC rows via MiniLM cosine scan
- Semantic meaning map (#357) — PCA scatter of corpus passage embeddings on Explore
- Quote board (#338) — save KWIC evidence to projects with notes, deletion, CSV export
- Temporal trends (#337) — interactive D3 term/entity frequency chart on project pages
- Speaker timeline (#337) — visual who-spoke-when lanes on run detail
- Corpus-wide explore (#331/#333/#334) — KWIC concordance, TF-IDF word cloud, distinctive terms
- Speaker insights (#335) — distinctive vocabulary, conversation partners, speaking pace
- Project overview (#336) — entity/topic rollup, coverage matrix, summary tiles
Fixes
- Reconciler claim race no longer stalls file operations (#346)
- Explore filters accept empty selection without 422 (#356)
- Narrow-screen command bar overlap resolved
- Term-stats advisory lock now varies per scope (#338)
- Project speaker counts no longer double-count re-runs (#336)
Install / upgrade
# Docker (recommended)
docker compose pull
docker compose up -d
# pip
pip install voxint==0.31.0Images: ghcr.io/bengizmo/voxint:0.31.0 (app, multi-arch) plus CUDA, CPU, and ROCm model-service images.
Voxint v0.30.0
What's new
Added
- Pause/resume and restart-from-scratch pipeline controls (#324). The run
detail page now has a Pause button for queued and running runs
(cooperative — the current stage finishes first, then no further stages
start until you resume), Resume and Cancel for paused runs, and
Restart from scratch in the Manage section for completed, failed, or
cancelled runs (re-queues from the first stage; prior results are preserved
in the stage ledger). NewPAUSEDstatus with amber pill; migration 0053.
Changed
- Decorative search chrome removed (#162). The inert "Search everything
⌘K" / "Find a person" / "Filter media" affordances in the topbar and on the
media and speakers pages are gone until search actually exists; the layout
seam and styles stay for the real implementation.
Fixed
- Settings status reports the two AI lanes separately and honestly (#316)
- Settings status knows how Voxint was installed (#317)
- Home "voices without a name" card dead-ended (#315)
- Topbar section label on review pages (#319)
- Singular/plural copy errors (#318)
- Console favicon (#320)
Install / upgrade
Docker (recommended):
# Fresh install
curl -fsSL https://raw.githubusercontent.com/bengizmo/voxint/v0.30.0/scripts/install.sh | bash
# Existing install
docker compose pull && docker compose up -dPyPI:
pip install voxint==0.30.0Images
All 10 images on GHCR (ghcr.io/bengizmo/voxint-*:0.30.0):
app (multi-arch), whisper/pyannote/titanet (CUDA + CPU multi-arch),
whisper-rocm, voxint-llm, voxint-synthdetect.
Full changelog: https://github.com/bengizmo/voxint/blob/v0.30.0/CHANGELOG.md
Voxint v0.29.0
Voxint v0.29.0 — 126 commits since v0.28.0.
Highlights
- Multi-user authentication (#9): opt-in local user table (Argon2id), DB-backed sessions, reviewer/admin roles, per-user attribution on decisions. CLI user management. Migration 0051.
- Speakers activation (#159): overview (aggregation, named/unnamed grouping, tier chips, verified badges) and per-speaker profile pages on by default. Rollback via
CONSOLE_SPEAKERS_ENABLED=false. - Synthetic-speech detection plugin (#145, epic #143): opt-in w2v2-AASIST classifier with Platt-calibrated risk scores. GPU inference service, console integration, manual scoring. Enable via Settings or
SYNTHDETECT_ENABLED=true. - Quote provenance manifest (#122): JSON sidecar with per-line speaker attribution, timecodes, clip integrity digest, model identity, and input-media SHA-256.
- Auto-enrollment (#275/#280): cross-run voice clustering with grounding-tier gates. Backfill CLI for existing deployments.
- Benchmark feature: 12-clip corpus,
voxint benchmark run/list/compare, DB-backed results (migration 0048). - Confidence policy API (#114): three-band confidence thresholds plus calibration tooling.
Security
- Open-redirect bypass hardened (#304):
_validate_next()now rejects backslash normalization, control-character injection, and scheme-bearing paths. 20 unit tests. - Admin gate on synthdetect mutations (#305): settings and score routes require
AdminDepin multi-user mode. 3 integration tests.
Console improvements
- Jobs page (#244): elapsed time for running runs, degraded pipeline cells, estimated wait time, plain-language failure reasons, GPU busy indicator.
- Speakers overview (#245): named/unnamed grouping, heard-name annotation, TO DO action buttons, "+ New speaker" button, search placeholder.
- Speaker detail (#246): "verified by you" chip, profile panel redesign, command bar actions, FOLDER column.
- Project detail (#247): rename, folder unlink, vocabulary chip, speaker links, add speaker/link folder links.
Other changes
- Translation integrity (ADR 0008): idempotency key, replay digest, immutability trigger on
run_translations. Migration 0047. - Synthdetect eval tooling extracted to private repo (zero runtime impact).
release.yml: newpublish-synthdetectjob for the plugin's GPU inference service image.
Upgrade notes
- New migrations: 0047 (translation integrity), 0048 (benchmark), 0049 (auto-enrollment), 0051 (multi-user auth). Run
alembic upgrade heador use the migrate entrypoint. AUTO_ENROLLdefaults totrue— new runs will auto-enroll unmatched speakers. SetAUTO_ENROLL=falseto disable.- Speakers overview is now on by default. Set
CONSOLE_SPEAKERS_ENABLED=falseto roll back. - Multi-user auth is opt-in (
VOXINT_MULTI_USER=true). The default single-operator HTTP Basic path is unchanged.
Images
All images at ghcr.io/bengizmo/voxint-*:0.29.0. Anonymous pull, no login required.
synthdetect-weights-v1
Standing model-weight release for the synthdetect service (w2v2-AASIST synthetic speech detection).
Assets
- finetuned_aasist.pth (1.2 GB): Fine-tuned AASIST backend checkpoint (XLS-R SSL keys + AASIST backend, seed 0, epoch 11, feature-cached training from DF init). sha256:
e178446b640b8e9f9cf6dd359428b2243f49e24e613e1ae952cd706216b8111e.
The XLS-R 300M base (xlsr2_300m.pt, ~3.6 GB) exceeds GitHub's 2 GiB release-asset limit and is fetched from its upstream source (https://dl.fbaipublicfiles.com/fairseq/wav2vec/xlsr2_300m.pt) at build time. sha256: b08927597f2c9eb2ebd7dcc3ac78ee4b5f6021cbac4b3a6c5a9deec445d80ed9.
Provenance
All sha256 digests are recorded in services/synthdetect/provenance.json. The Dockerfile verifies them at build time.
License
- AASIST backend: MIT (Tak et al., SSL_Anti-spoofing)
- XLS-R 300M: MIT (Babu et al., XLS-R)
Voxint v0.28.0
What's new
Added
- Media detail page (
GET /media/{id}/editor, #156). Editor backend contract with run selection, claim-token verification, transcript display with speaker palette and verified-progress counter - Token-sensitive path classifier (#156).
Cache-Control: no-storeextended to/media/{uuid}/editor*paths - Possible-duplicates reminder card (#181). Speakers overview shows a card when roster speakers share high cosine similarity
- ADR 0008: enrichment persistence simplification scope (H7)
Changed
- Idempotent insert helper (M10).
savepoint_adopt_or_conflict()extracted tovoxint.idempotency - Stage graph contract tests and runtime guard (H6). 12 contract tests lock pipeline stage invariants
- SubmissionResult (H5). Submit functions return a result with explicit
publish()instead of a barePipelineRun - Broker fault tolerance (M7). Post-finalize autogeneration uses
.apply_async(ignore_result=True), recovery sweep widened - Global HTML error renderer (H2). Content-negotiated error pages for browsers, JSON for API clients
- Console polish (#244, #248, #249). Jobs page TOOK column/subfolder/failure reason; settings status host-level hardware gauges, GPU acceleration in install summary, LLM description, Features tab, Check for updates button; home feed unresolved voice count; media overview review-state chips and selected-row tint
Removed
- Legacy folder columns dropped (#177). Migration 0046 removes
app_settings.media_folders/folder_domain_packs
Fixed
- Corrections editor (#176). No longer silently converts inherited (NULL) corrections to an explicit empty list
Install
pip install voxint==0.28.0Or with Docker:
docker pull ghcr.io/bengizmo/voxint:0.28.0Full changelog: https://github.com/bengizmo/voxint/blob/main/CHANGELOG.md
v0.27.0 — Ops Console R4/R5 visual refresh
Completes the Ops Console visual-refresh epic (#205, 10/10 items).
Changed
- R4: speakers overview and detail refresh (#213). Both
/speakersand/speakers/{id}rewritten with V3 primitives — grid-table roster, status chips, stat tiles, initials badges, TO DO strip for unverified voices. - R5: project detail refresh (#214).
/projects/{id}rewritten with V3 primitives — two-column layout, vocabulary chip pills, collapsible edit form, corrections editor island, sidebar speakers. - Error copy refactor (#232). Internal-vocabulary error strings rewritten for operators.
Install
pip install voxint==0.27.0Or pull the container images:
docker pull ghcr.io/bengizmo/voxint:0.27.0Full changelog: v0.26.0...v0.27.0
Voxint v0.26.0
The largest Voxint release yet: 272 commits since v0.24.0.
Highlights
Console 2.0 (#149) — the review console gains a full information architecture: Home dashboard, media library with journaled operations (upload, organize, trash/restore), projects and folder-scoped vocabulary, speakers overview and profiles, jobs area, and a settings hub with status/hardware/database/plugins sub-pages. Most new areas ship dark-shipped behind feature flags for opt-in discovery.
Ops Console visual refresh (#205) — new design system: dark-theme palette, IBM Plex typography, 52px icon rail, command-bar framework, semantic chips, grid tables, stat tiles. Applied to Home, Jobs, Media (R1-R3), and Settings Status (R6). Speakers and Projects refreshes (R4/R5) follow in v0.27.0.
Synthetic-speech detection eval harness (#144, M1 S1-S5) — maintainer-only scoring toolkit: pinned model registry, ASVspoof 2021 DF reproduction (2.87% EER, Gate-1 PASS), organic corpus tooling (prepare/degrade/freeze executors), and production windowing verdict.
Other — plugin framework substrate (#137/#138, dormant), audio-clip extraction (#88), navigable outline with click-to-seek (#87), transcript translation (#133), CI parallelization with per-worker DBs (#187), and the P2c media operations journal (ADR 0007).
Install / upgrade
Docker (recommended):
# Fresh install
curl -fsSL https://raw.githubusercontent.com/bengizmo/voxint/v0.26.0/scripts/install.sh | bash
# Existing install — pull new images and migrate
docker compose pull && docker compose run --rm app voxint migrate && docker compose up -d
PyPI:
pip install voxint==0.26.0
Full changelog: https://github.com/bengizmo/voxint/blob/v0.26.0/CHANGELOG.md#0260---2026-08-27