Skip to content

Silent failure when engine fails to load or transcription fails — no error shown to user #117

@rakendd

Description

@rakendd

Problem

When the Whisper engine fails to initialize or transcription fails, the app gives zero visual feedback to the user. This makes the app appear completely broken with no way to diagnose what went wrong.

Failure chain

1. Engine initialization failure is silent (TranscriptionService.swift:60-64)

} catch {
    await MainActor.run {
        self.isLoading = false
        print("Failed to load engine: \(error)")  // only printed to console
    }
}
  • currentEngine stays nil
  • isLoading is set to false
  • The record button appears enabled and clickable
  • User has no idea the engine never loaded

2. User can record without a loaded engine

Recording works independently of the transcription engine, so the user can click the record button, see it turn red, speak, and think everything is working.

3. Transcription failure is silent (ContentView.swift:237-240)

} catch {
    print("Error transcribing audio: \(error)")  // only printed to console
    try? FileManager.default.removeItem(at: tempURL)  // recording deleted
}

await MainActor.run {
    self.state = .idle  // silently resets to idle
    self.recordingDuration = 0
}
  • The error is only print()ed
  • The temp recording is deleted
  • State resets to idle — user sees nothing

User experience

  1. Open app → model fails to load (no indication)
  2. Click record → turns red, mic appears in menu bar (looks normal)
  3. Speak → app appears to be recording fine
  4. Click stop → app briefly processes, then goes back to idle
  5. No transcription, no error message, no recording saved, nothing

This is especially problematic with large models like large-v3-turbo (1.5GB) where initialization is more likely to fail or take a long time.

Suggested improvements

  1. Show an error state when engine fails to load — e.g., a red label or disabled button with tooltip explaining the model couldn't be loaded
  2. Disable the record button when currentEngine is nil (not just when isLoading)
  3. Show an error message when transcription fails — toast/alert instead of silently resetting to idle
  4. Don't delete the temp recording on failure — let the user retry

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions