Skip to content

[Feature]: Add Whisper transcription progress reporting with real-time percentage updates via Tauri events #16

Description

@prince-pokharna

Summary

Knowte runs Whisper transcription locally using whisper.cpp, which for a 1-hour lecture with larger models (medium, large) can take several minutes. The current UI shows a generic loading/processing state with no indication of transcription progress — no percentage complete, no estimated time remaining, no indication of which stage (loading model, processing audio, finalising transcript) the application is in. For long audio files this creates a poor and anxious user experience.

Problem

  • The transcription process runs as an opaque background task with no progress feedback to the frontend.
  • whisper.cpp supports progress callbacks via its C API (whisper_full_params.progress_callback), but this is not currently wired to the Tauri event system.
  • Users processing long lectures have no way to distinguish between "still working" and "silently crashed".
  • On machines where the model needs to be loaded from disk for the first time, the startup latency can be 15–30 seconds before any audio is processed, with zero feedback.

Impact

  • Users cannot estimate how long to wait, leading to uncertainty and premature application restarts.
  • Silent failures (e.g., OOM during large model loading) look identical to normal processing.
  • The absence of progress feedback is a meaningful quality gap for a tool positioned against commercial transcription services.

Proposed Solution

  1. Wire Whisper's progress callback in Rust: When invoking whisper_full(), set the progress_callback in whisper_full_params to a closure that emits a Tauri event:
params.progress_callback = Some(|_ctx, _state, progress, _user_data| {
    // progress is 0..=100
    app_handle.emit_all("transcription:progress", progress).ok();
});
  1. Frontend listener: In the React component managing transcription state, listen for the transcription:progress event via appWindow.listen:
const unlisten = await appWindow.listen<number>('transcription:progress', (event) => {
  setTranscriptionProgress(event.payload);
});
  1. Staged progress UI: Show a progress bar with labelled stages:

    • 0–5%: Loading Whisper model
    • 5–95%: Transcribing audio
    • 95–100%: Post-processing and saving transcript
  2. Estimated time remaining: Calculate a simple ETA based on elapsed time and current percentage.

I am happy to implement this in both the Rust Tauri backend and the React frontend. Could you please assign this issue to me?

Labels: enhancement, UX, help wanted, GSSoC 2026

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions