Skip to content

Releases: bengizmo/voxint

Voxint v0.34.0

Choose a tag to compare

@bengizmo bengizmo released this 04 Sep 20:06
a9f0913

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_evidence table. Previously this evidence was computed and discarded, making threshold tuning guesswork.
  • Speaker roster dedup CLI (#432). voxint speakers dedup reports probable duplicate speakers using embedding cosine similarity and optionally merges safe pairs. Dry-run by default.
  • Post-batch reconcile CLI (#430). voxint speakers reconcile re-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_SIZE files (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_switches are fixed.

Install / upgrade

# Docker (recommended)
docker compose pull

# pip
pip install voxint==0.34.0

Full changelog: https://github.com/bengizmo/voxint/blob/main/CHANGELOG.md

Voxint v0.33.0

Choose a tag to compare

@bengizmo bengizmo released this 03 Sep 07:55
80da9e9

What's new in v0.33.0

Added

  • In-place voice embedding-space migration. voxint speakers re-embed discovers the current embedding space, previews stale runs, replaces stored turn vectors and sourced enrollment centroids without re-transcription, and refreshes speaker matches. voxint doctor now 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

Choose a tag to compare

@bengizmo bengizmo released this 02 Sep 05:55
555b9ed

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-decided display_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). /runs becomes 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-rotating refresh endpoint 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 viewer role: 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_write boolean for UI affordance hiding. CLI user create --role
    and user set-role accept viewer. Migration 0057 widens the DB CHECK
    constraint. Dark-shipped behind the existing console_users_enabled flag
    (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.
  • /jobs now redirects to the canonical /runs surface; 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#llm redirect 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...
Read more

Voxint v0.31.0

Choose a tag to compare

@bengizmo bengizmo released this 31 Aug 02:57
b236e4f

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.0

Images: ghcr.io/bengizmo/voxint:0.31.0 (app, multi-arch) plus CUDA, CPU, and ROCm model-service images.

Voxint v0.30.0

Choose a tag to compare

@bengizmo bengizmo released this 30 Aug 12:19
56ef41a

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). New PAUSED status 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 -d

PyPI:

pip install voxint==0.30.0

Images

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

Choose a tag to compare

@bengizmo bengizmo released this 30 Aug 00:49
ae087fe

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 AdminDep in 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: new publish-synthdetect job 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 head or use the migrate entrypoint.
  • AUTO_ENROLL defaults to true — new runs will auto-enroll unmatched speakers. Set AUTO_ENROLL=false to disable.
  • Speakers overview is now on by default. Set CONSOLE_SPEAKERS_ENABLED=false to 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

Choose a tag to compare

@bengizmo bengizmo released this 29 Aug 23:11
b0b77f4

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

Choose a tag to compare

@bengizmo bengizmo released this 28 Aug 10:33

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-store extended 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 to voxint.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 bare PipelineRun
  • 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.0

Or with Docker:

docker pull ghcr.io/bengizmo/voxint:0.28.0

Full changelog: https://github.com/bengizmo/voxint/blob/main/CHANGELOG.md

v0.27.0 — Ops Console R4/R5 visual refresh

Choose a tag to compare

@bengizmo bengizmo released this 27 Aug 16:47
7064eec

Completes the Ops Console visual-refresh epic (#205, 10/10 items).

Changed

  • R4: speakers overview and detail refresh (#213). Both /speakers and /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.0

Or pull the container images:

docker pull ghcr.io/bengizmo/voxint:0.27.0

Full changelog: v0.26.0...v0.27.0

Voxint v0.26.0

Choose a tag to compare

@bengizmo bengizmo released this 27 Aug 14:34
a44eb5f

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