Conversation
Stabilize audio revision keys and skip redundant peak refetches so the editor stays in sync during playback and region edits. Co-authored-by: Cursor <cursoragent@cursor.com>
Correlation + speech-energy based resolver (pure stdlib, no numpy) that decides mono downmix vs single-channel selection for dual-channel source recordings, with reason codes for the decision and an escalation path for ambiguous cases. Wired into create_analysis_audio_variants so the resolved channel mode + reason codes are recorded in the variant recipe instead of always hardcoding mono_average.
Add plan_concat_layout / offset_vad_for_concat / remap_concat_regions_to_sources plus _run_multi_file_diarization to workers/dataset: concatenate multiple source recordings, run NeMo diarization once over the concatenated audio, then stitch and remap speaker regions back to per-source offsets. Dispatch multi-file runs to this path while leaving the single-file path untouched. Relax the backend's one-WAV diarization guard in dataset_runs.py so multi-speaker, multi-file projects can start a run instead of being rejected outright. Update the two affected tests: the route test now exercises a still-valid ValueError for 400-surfacing coverage, and the dataset_runs test asserts multi-file single_speaker=False now succeeds.
Retire the old Vite/React frontend (App.tsx, pages/, workspace/, pipeline/, reference/, qc/ and their tests) and scaffold a flat, single-app Next.js 16 project in its place: no monorepo, no [locale], no auth/Supabase/tRPC/Drizzle — just the app shell and a vendored copy of @midday/ui (src/components/ui/), aliased via tsconfig paths as @midday/ui/*. This commit is the app skeleton only: root layout/providers/page, Tailwind + PostCSS + Next config, and the vendored UI kit. The setup wizard and Lab workstation routes land in the following commits.
Add the (login-chain) route group and its steps: multi-file .wav ingest (login), model auto-resolve with skip-ahead on hardware block (login2), voice/speaker selection shown only when there is more than one speaker (login3), processing/transcription progress with live language-override confirmation (login4-5), and the final continue into the Lab (login6). wizard-api.ts covers the full lifecycle: project create, streamed multi-file upload, run preflight/create/start/poll, speaker listing and selection, and resolveWhisperModel's large-v3 -> base -> error fallback. No tuning knobs anywhere in this chain — channel/model/language are resolver decisions, and per-project overrides live downstream in the Lab.
Add the (workstation)/lab route: real backend-wired reads (fetchClipLabView) and writes (accept/reject/quarantine, transcript overrides, undo/redo audio edits) with optimistic-concurrency tokens and a typed error taxonomy (SpeechcraftApiError) for 404/409/422/400/500/503. Clip queue with search, status/tag filters, and source-order/QC sort; inspector rail, transcript panel, keyboard shortcuts bar, and a top-bar with the project picker, downstream re-run dialog (re-slice or re-transcribe with overrides), and diagnostics drawer (run log tail). speechcraft-api.ts / speechcraft-write-api.ts are the full client for this surface, including Dataset Health's committed QC thresholds: machineBucket is derived from GET /qc's finalized_thresholds (falling back to backend defaults) rather than a hardcoded gate, with a bucket filter (auto-kept / needs-review / auto-rejected) in the clip queue's filter popover. See the Dataset Health commit that follows for the threshold UI itself.
Format choice (LJSpeech / JSONL manifest / WAV+txt pairs), loudness normalization and include-rejected-clips toggles, styled to match midday's dialog conventions (constrained width, DialogHeader spacing, justified toggle rows, Cancel/Export footer with a spinner state). Export itself is still a local progress simulation — wiring the real backend export preview/run endpoints is a follow-up.
Two half-width, midday-styled histogram charts (Transcript match, Speaker
check) driven by the real per-clip transcript_match/speaker_check scores
from GET /api/dataset-runs/{id}/qc. Drag a handle directly in either graph
to move that gate's minimum threshold; bars recolor kept/rejected live using
midday's own --chart-bar-fill / --chart-bar-fill-secondary tokens, and the
drag math + the handle's on-screen position share one PLOT_MARGIN constant
with the chart's own margin so they can't drift apart.
Below the charts: two boundary tables ported from the legacy qc/qcLogic.ts
AND-gate math (qc-logic.ts, unit tested) — Riskiest kept (accepted clips
closest to failing) and Best rejected (rejected clips closest to passing),
each with its own sort. Exploration is free and client-side; an explicit
'Commit thresholds' action (confirmed, since it invalidates any existing
export) calls POST /qc/finalize so the committed verdict is what Clip Lab
and Export actually consume — see the Lab workstation commit for the read
side of that wiring.
demoEnabled()/withDemo() so every wizard step and the Lab can run against mock data with no backend, for UI review without a live FastAPI/ML stack. The demo threading itself (mock clips, amber DEMO indicators, skipped real API calls) already lives in the wizard and Lab commits, since those files were committed at their current, demo-aware state — this commit adds the one shared module all of that imports from.
- .gitignore: ignore frontend/.next, next-env.d.ts, out/, .turbo/, and *.tsbuildinfo; add common editor/OS noise (.idea, .vscode, *.swp, etc). - README/INSTALL/Makefile: point setup/dev/build/check commands at the new bun + Next.js frontend on :3002 (make dev-frontend, bun run dev/build), drop the retired frontend-legacy reference. - Remove repomix-qc.config.json (hardcoded paths into the deleted Vite app: vite.config.ts, tsconfig.app.json, etc — no longer valid) and synopsis.md (unreferenced standalone research doc).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.