Inspiration
A transcript can look polished and still be dangerously wrong. One missing negation or one incorrect number can reverse the meaning of a quote, while a single confidence score gives a journalist or researcher little help deciding where to listen again. I wanted a local workflow that treats model disagreement as a review signal—not as truth—and that makes uncertainty visible before text is reused.
What it does
AudioTranscription Studio is a Windows desktop app for local audio and video transcription. For an opt-in dual-engine run, it compares NVIDIA Canary and faster-whisper and ranks up to 12 consequential disagreement windows in three deliberately narrow categories: missing coverage, numbers, and negation. The user hears a bounded clip from the exact normalized audio used by ASR, then accepts Canary, accepts Whisper, writes a correction, or marks the passage uncertain.
Studio blocks its reviewed-quote copy action while a candidate is open. Copied
text is explicitly qualified; finalization freezes the bounded review and its
lineage in an immutable local JSON receipt. Temporary review audio can be
deleted later through a separate confirmed action. With post-processing set to
none, this proof loop stays local and no LLM decides what the audio says.
The readiness, model-catalog, and calibration views explain whether the currently integrated local recipe fits the machine without silently changing settings or pretending planned runtimes already work.
How we built it
The pre-existing foundation was a self-contained Tauri/React Windows shell with a Python/Flask service in Ubuntu WSL, local Canary/faster-whisper ASR, pyannote diarization, and optional CLI post-processing.
During Build Week I meaningfully extended it with durable submissions and
recovery, a stronger Library and quality safeguards, lifecycle and accessibility
hardening, Proof-Carrying Quotes, dedicated runtime isolation,
backend-independent hardware readiness, a versioned local model catalog, and a
content-free calibration benchmark. Timestamped development history and the
principal Codex task provide the eligibility record. Publication-safe
verification evidence is recorded in docs/submission/VALIDATION.md.
Codex was the primary engineering workspace for the extension. It helped turn the broad product vision into a narrow testable wedge, adversarially review truth language and security boundaries, coordinate Python/Flask, React/TypeScript, and Rust/Tauri changes, build contract and race-condition tests, diagnose a frontend hydration race, and keep specifications, verification evidence, and limitations synchronized with the code.
The principal Codex task ran on GPT-5.6 (gpt-5.6-sol) with the ultra
reasoning level.
Codex was used for development—not to adjudicate audio at runtime. I retained the core product decisions: disagreement is only a signal, zero candidates is not proof, open quotes stay blocked, and finalization remains separate from media deletion.
Challenges
The hardest part was preserving meaning without manufacturing certainty. Canary and Whisper expose different timestamp structures, so candidate generation had to be deterministic, bounded, and symmetric without choosing a winner. The review state also had to survive restarts, reject stale edits, produce byte-stable receipts, and fail closed when evidence changed.
Local privacy introduced its own engineering work: authenticated clip access, fixed allowlisted artifact names, hash and inode checks, crash-recoverable proxy cleanup, and no source paths in durable state. Hardware fit also had to be reported honestly: static thresholds are estimates, calibration verifies only one exact runtime/model binding, and planned recipes remain disabled.
Accomplishments that we're proud of
Proof-Carrying Quotes is implemented across backend and desktop. In a recorded RTX 3090 rehearsal, a wholly synthetic 46-second French sample produced real pyannote diarization plus Canary and faster-whisper artifacts. Studio surfaced 10 review signals; all 10 received explicit human decisions before qualified copy, finalization at revision 11, and local receipt inspection. The separate cleanup confirmation was exercised and cancelled, leaving the synthetic review audio intact. The cold run took 9 minutes 15 seconds, including model loading.
The recorded development tree passed 703 backend tests plus 54 DrvFS proof/artifact tests, 101 frontend tests with typecheck and a production build, and 92 Rust tests with one live-environment test ignored. The sanitized judging snapshot independently passed its GitHub workflow: Python source and installer checks, backend provider/proof/calibration subsets, the complete frontend gate, Rust formatting/tests/lints, and a no-bundle Tauri release build.
What we learned
Two ASR engines are most useful as a way to prioritize human attention, not as a voting system. Agreement is not proof, and an LLM cannot establish what an audio clip says. “Local-first” is also a lifecycle promise, not merely a model choice: authentication, bounded media access, provenance, restart recovery, and truthful cleanup matter as much as inference. Hardware adaptation needs evidence, visible unknowns, and explicit user choice rather than an automatic preset.
What's next
Next I will finish the runtime layer behind the readiness UI: managed model downloads, native Windows and CPU/low-memory recipes, and an offline distribution path. For the review loop, the next steps are rights-cleared evaluation media, broader but still explainable signals such as names and lexical differences, full-transcript evidence navigation, richer accessibility validation, and optional local-LLM workflows kept separate from audio-grounded human decisions.
Log in or sign up for Devpost to join the conversation.