Skip to content

Umbrella: ASR / transcription v2 follow-ups #176

Description

@utof

Umbrella: ASR / transcription v2 follow-ups

Tracking issue for items deferred from the transcription v1 slice. Each checkbox can be promoted to a standalone issue when prioritized.

What v1 ships

Cloud-only speech-to-text via OpenAI-compatible HTTP API (Groq, OpenAI, custom endpoints). Trigger surfaces: perima transcribe <file> CLI subcommand + sidebar Transcribe button on the file-detail panel. Storage: per-segment with timestamps and FTS5 (unicode61 remove_diacritics 2 tokenizer for multilingual). Concurrency: single worker, bounded queue (depth 32). API keys via OS keychain (keyring 3.x). ffmpeg via Tauri sidecar (desktop, Linux only) or which::which("ffmpeg") PATH discovery (CLI).

Spec: docs/superpowers/specs/2026-05-02-transcription-v1-design.md
Plan: docs/superpowers/plans/2026-05-02-transcription-v1.md

Roadmap

  • Local transcription adapter (priority/high — the very-very-very next slice). whisper-rs 0.16+whisper.cpp (GGML format) behind a local-stt Cargo feature. Owns V013 schema (transcription_job table + pending_batch_id column on transcript_segment), chunk-based audio extraction (AudioPipeline::extract_pcm_16k_mono), GPU feature-flag matrix (metal / cuda / vulkan / coreml), first-run model-download modal with confirmation, model selection UX (large-v3-turbo Q5_0 default), Windows whisper.cpp toolchain documentation, CI cache for whisper-rs-sys build artifacts.
  • Audio file extractor — already filed as Audio file support: no AudioExtractor registered; audio files scan but yield no metadata #175. Precondition for audio-only files (mp3, m4a, wav, flac, ogg, opus) being transcribable through the desktop UI (the sidebar Transcribe button reads MediaMetadata.mime_type). The CLI already supports audio-file transcription today (it dispatches by file path + mime-guess).
  • Transcript viewer in file-detail sidebar (read-only). v1 stores transcripts and surfaces job-state UX (start / cancel / queue) but does NOT render the transcript text. Reading happens via CLI (perima transcribe ... --output text) or raw SQL in v1. The viewer slice adds a <TranscriptViewer /> component (segments listed with timestamps; click-to-copy timestamp; collapsed/expanded modes), reading via a useTranscriptsByFileUuid(fileUuid) query (latest by completed_at DESC).
  • Per-file context-menu primitive (right-click dropdown). Horizontal UX capability — transcription is one consumer; delete / retag / re-extract metadata / open-in-default-app / copy-path / batch-select are others. needs-brainstorm. Adds right-click → Transcribe path.
  • Keyboard shortcut infrastructure. Horizontal UX. needs-brainstorm. Conventions to lock (single key vs chord; conflicts with Tauri global shortcuts; conflicts with browser/textarea defaults). Adds hotkey → Transcribe path.
  • Word-level timestamps. Feature flag word_timestamps (default off), sibling transcript_word table when enabled (~5–10× row count). OpenAI/Groq's verbose_json with timestamp_granularities = ["word"] returns word-level timing; whisper-rs supports word-level via set_token_timestamps(true).
  • CLI distribution (cargo-dist setup + bundled ffmpeg in release tarballs). Removes the "user must have ffmpeg on PATH" friction. priority/medium.
  • key_ref indirection for headless-Linux env:GROQ_API_KEY fallback. File when first user reports keyring unavailability (keyring 3.x falls back to keyutils, but some headless setups have neither). priority/low.
  • Re-transcription policy UI — explicit "re-transcribe with X" user action + multi-row diff/compare picker UX (sidebar shows "transcript 1 of 3 · switch") + delete-transcript Tauri command + delete-transcript CLI subcommand. Schema already supports multiple transcript rows per (file_uuid, backend); v1 surfaces only the latest. priority/low.
  • Unified search across search_index + transcript_search (or a separate "search transcripts" surface). needs-brainstorm. v1 ships transcripts queryable only via direct SQL or CLI output; the desktop SearchBar continues to hit search_index only.
  • Multi-worker transcription queue (parallel jobs with bounded concurrency cap). v1 = single worker; revisit when users demand throughput. priority/low.
  • OpenAI gpt-4o-transcribe-diarize model support. Requires diarized_json response_format (rejects verbose_json); separate response shape. Out of v1 scope; revisit when speaker diarization is in scope.
  • Streaming partial results (SSE-based progress for gpt-4o-transcribe). v1 uses heartbeat-driven progress only; SSE is a UX-polish item.
  • Transcripts-at-scale capacity docs (Capacity + scale constraints documentation #105 follow-up). Document expected segment-row counts and FTS5 index sizes per typical library scale.
  • macOS + Windows ffmpeg-sidecar bundling. v1 ships Linux-only sidecar packaging. macOS + Windows users build from source until this slice lands.
  • unic-langid-based BCP-47 validation for --language flag. Replace v1's regex-and-allowlist if it gets brittle. priority/low.
  • Workspace wildcard_enum_match_arm clippy lint enablement. Currently in restriction group, not enabled. Slice-of-its-own to enable workspace-wide and audit existing wildcard arms.

When promoted to a standalone issue, an item should reference this umbrella.

Metadata

Metadata

Assignees

No one assigned

    Labels

    metaIssue about the project process, not the code itselfpriority/highHigh-priority work — block other features until this lands

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions