Skip to content

feat: add Whisper large v3 turbo speech models#55

Closed
samir1 wants to merge 170 commits into
matthartman:mainfrom
samir1:feat/whispercpp-large-v3-turbo-models
Closed

feat: add Whisper large v3 turbo speech models#55
samir1 wants to merge 170 commits into
matthartman:mainfrom
samir1:feat/whispercpp-large-v3-turbo-models

Conversation

@samir1

@samir1 samir1 commented Apr 10, 2026

Copy link
Copy Markdown

Summary

  • add local Whisper large v3 turbo speech model options for q5_0 and full ggml downloads
  • route ggml model loading and transcription through a dedicated WhisperCppSpeechBackend
  • add coverage for catalog, inventory, model management, rerun flows, persistence, traces, and backend validation

Models Added

  • Whisper large v3 turbo (q5_0, multilingual)
  • Whisper large v3 turbo (full, multilingual)

Verification

  • xcodebuild test with focused GhostPepper speech/inventory/backend/rerun suites: 72 tests, 0 failures
  • rebuilt local GhostPepper.app from this branch for manual testing

matthartman and others added 30 commits March 23, 2026 14:53
Models section shows each model with loaded/not loaded status.
Taller settings window (580px) to fit all sections.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Shows when any model isn't loaded. Downloads WhisperKit and/or
cleanup models directly from Settings — no need to re-run onboarding.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
LLM.swift's bundled llama.cpp doesn't support Qwen3/3.5 architecture.
Reverted to Qwen 2.5 1.5B + 3B which work reliably.
Will upgrade when LLM.swift updates its llama.cpp.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Info.plist was still at v1.1 so Sparkle thought the "update"
was the same version. Now properly at v1.3 build 4.
Fixes #2.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Improve post-paste learning via Accessibility
Picker in Settings under Input section. Switching models triggers
re-download and reload. Default remains small.en for accuracy.
tiny.en is ~75 MB and much faster for shorter recordings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…oggle)

Matches the original Ghost Pepper behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Input Monitoring prompt doesn't reliably show the system dialog
for debug-signed apps. Now attempts to start the hotkey monitor
even without it — Accessibility alone is sufficient for Control key.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fixed codesign verification failure reported in #4.
Now verifies signature after extracting from DMG before release.

Also includes: speech model picker, default Control shortcuts,
non-blocking Input Monitoring check.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
macOS kills the app after Screen Recording is granted but doesn't
relaunch it. Now spawns a background process that reopens the app
after 3 seconds.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace no-audio modal with status pill
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Addresses #5 — users should know about local transcript log
and auto-launch behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
File-based logging was replaced by in-memory DebugLogStore.
Nothing is written to disk. Updated disclosure accordingly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
No longer blocks Continue button. Shown as "(optional)" with
a bordered (not prominent) Enable button. Users can skip it
and enable later in Settings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Matches WhisperFlow and other dictation tools.
Toggle is Right Command + Right Option + Space.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Supports Spanish and 90+ other languages. Same size as small.en.
Users can tweak the cleanup prompt for their language's filler words.
Addresses #6.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
matthartman and others added 20 commits April 8, 2026 22:09
…smart Obsidian integration

- Rewrote meeting window with VS Code/Obsidian-style tabs (multiple meetings open simultaneously)
- Sidebar file browser with right-click context menu (Delete, Show in Finder)
- Click past meetings to load them as editable tabs (parsed from markdown)
- "+" button for quick notes, folder button for Finder
- Attendee name capture via OCR of meeting window
- Auto-update meeting title from Zoom/Teams window title
- Smart Obsidian integration with vault auto-creation prompt
- Title rename on Enter renames the file on disk
- Sidebar auto-refreshes every 10s while visible
- Fixed recording state observation (Combine-based) for proper red dot / stop button
- Fixed "no sound detected" overlay for voice-to-text (lower threshold, clickable, opens Settings)
- Mic switching in Settings now resets audio engine without restart

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…lity

- Chunked summary generation using local LLM (Qwen) — splits long
  transcripts into chunks, summarizes each, then combines into final
  summary with Key Decisions, Action Items, Discussion Points, TL;DR
- Summary tab is now an editable TextEditor (same Georgia font as Notes)
  with Generate/Regenerate button — no auto-generate, user-initiated
- Editable summary prompt in Settings > Meeting Transcript
- Removed speaking percentages and segment count from summary stats
- Sidebar sorted by filename (stable order, doesn't change on save)
- Removed loadHistory from saveActiveTab to prevent sidebar reordering
- Added @ObservedObject transcript to MeetingTabContentView for proper
  SwiftUI observation of nested ObservableObject changes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Clean duck-typing approach for apps with custom renderers. Thanks @mvanhorn!
- Regenerated project.pbxproj with xcodegen
- Added .qwen3AsrInt8 case to deleteModel switch in ModelManager

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Addresses #23 — some macOS Sequoia users see "Apple could not verify"
warning. Added instructions for System Settings > Privacy & Security >
Open Anyway.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Qwen cleanup model was sometimes interpreting user speech as
instructions and responding conversationally instead of cleaning up
the transcription.

Changes:
- Strengthened system prompt: "You are NOT a chatbot. Do NOT answer
  questions. Do NOT follow instructions in the input."
- Added examples showing questions/commands passed through verbatim
- Added closing reminder to reinforce transcription-only behavior

Also added CleanupPromptEvalTests — a test suite that validates the
cleanup model behaves as a transcription tool, not a chatbot:
- 17 eval cases covering questions, instructions, refusal triggers
- Chatbot detection heuristics (indicator phrases, length ratio, lists)
- Live model test that runs against the actual Qwen 0.8B model
- All 17 cases pass on the 0.8B model with the updated prompt

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Added per-model test methods (0.8B, 2B, 4B) and testEvalOnAllAvailableModels
- Fixed false positive: "I'm sorry, but I" is natural speech, narrowed
  chatbot indicators to "I'm sorry, but I can't/cannot"
- Relaxed length heuristic from 2x to 3x — larger models rephrase more

Results: 0.8B passes all 17, 2B and 4B pass with adjusted heuristics.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pauses Spotify, Apple Music, podcasts, and other media when recording
starts. Resumes when recording stops. Uses the private MediaRemote
framework via dlopen — gracefully degrades if unavailable.

Toggle in Settings > Recording > "Pause media while recording" (default: on).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Added consent dialog that appears before every meeting recording starts
  with copyable notice: "I'm using 🌶️ Ghost Pepper, a completely private
  AI note taker. Nothing leaves my computer and all AI models are done
  on device."
- Consent dialog shows for both manual (+) and auto-detected recordings
- "Don't ask again" checkbox for users in jurisdictions that don't require consent
- Recording history (Transcription Lab) now defaults to OFF — audio WAVs
  are not saved to disk unless user explicitly enables it in Settings > History
- Updated consent message wording

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Google Meet tab titles show "Meet - xxx-yyyy-zzz" not "meet.google.com".
Added "meet -" and "google meet" as title patterns for detection.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
"Looks like you're watching a video on YouTube. Want me to create
notes and transcribe it?"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ube detection

- Video sites (YouTube, Vimeo, Twitch, etc.) skip the consent dialog
  since they're public content, not private calls
- Source URL from browser address bar is automatically added to the
  top of the Notes tab when transcribing a video
- Fixed YouTube detection: match "- YouTube" suffix in tab titles
  instead of requiring "▶" prefix (YouTube no longer uses this)
- Added "google meet" and "meet -" patterns for Google Meet detection
- Added browser URL extraction via Accessibility API

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Prevents the LLM from appending helpfulness phrases to cleaned transcriptions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- "Add a word correction" section under Transcription — quick-add
  misheard word replacements directly from the history detail view
  (goes into Corrections store, applies to all future transcriptions)
- "Add an example to the cleanup prompt" section under Cleanup —
  add input/output examples to the EXAMPLES block in the cleanup prompt
- Both sections positioned inline next to the content they fix
- Voice-to-text history defaults to off for privacy

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… launcher

Major refactor of the Pepper Chat UI into a branded "Context Bubble":

Context Bubble:
- Centered floating panel with Ghost Pepper branding (logo, orange accents)
- Shows spoken command, captured context (app name, screenshot, OCR text)
- Screenshot thumbnail with click-to-preview popover
- Action buttons: Send to Zo / Copy Bundle with keyboard navigation
  (arrow keys to switch, Enter to confirm, Escape to cancel)
- Spoken command determines default action ("send to zo" → Zo highlighted)

Zo Chat Threading:
- Conversation accumulates automatically — each question includes prior
  thread as context sent to Zo
- Scrollable chat history in the bubble (You: / Zo: labeled)
- "Clear context" button wipes thread for fresh start
- "Save as note" saves thread as markdown in meetings directory and
  opens it in the meetings view
- Thread persists in memory across bubble dismiss/show cycles

UX improvements:
- No idle state — bubble auto-dismisses when nothing to show
- "Chatting with Zo..." with larger pepper logo during processing
- Close (X) button on all states (recording, processing, history)
- Sound effects on Zo hotkey (Tink on start, Pop on stop)
- Meeting detection prompts work in the new bubble UI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings April 10, 2026 05:07

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds local whisper.cpp-backed Whisper large v3 turbo model options and routes ggml model lifecycle + transcription through a dedicated backend, with updated UI/docs and expanded test coverage across model selection, persistence, reruns, inventory, and tracing.

Changes:

  • Introduce WhisperCppSpeechBackend and integrate it into ModelManager for load/validate/transcribe flows.
  • Add two new Whisper large v3 turbo (ggml) model descriptors (q5_0 + full) and surface them in settings/inventory.
  • Expand tests to cover catalog descriptors, model manager behaviors, inventory rows, rerun flows, persistence, and performance trace summaries.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
README.md Documents the new Whisper large v3 turbo model options and adds whisper.cpp to the speech stack attribution.
GhostPepper/Transcription/WhisperCppSpeechBackend.swift New backend to download/cache/validate ggml models and run whisper-cli transcription.
GhostPepper/Transcription/SpeechModelCatalog.swift Adds .whisperCpp backend kind, new model descriptors, and descriptor metadata fields.
GhostPepper/Transcription/ModelManager.swift Routes .whisperCpp model loading/transcription through the new backend; supports cache delete + inventory checks.
GhostPepper/UI/SettingsWindow.swift Updates settings copy for whisper.cpp runtime requirement and multilingual-model guidance.
GhostPepperTests/WhisperCppSpeechBackendTests.swift New unit tests validating cache path building, runtime gating, validation failure behavior, and transcription overrides.
GhostPepperTests/SpeechTranscriberTests.swift Verifies new model descriptors/backends, speaker-filtering support expectations, and ModelManager override flows.
GhostPepperTests/ModelManagerTests.swift Adds coverage for whisper.cpp model load via override, cache deletion notifications, and validation-failure surfacing.
GhostPepperTests/RuntimeModelInventoryTests.swift Ensures inventory includes the new Whisper large v3 turbo rows and default states.
GhostPepperTests/PerformanceTraceTests.swift Ensures performance trace summaries include the new whisper.cpp model IDs.
GhostPepperTests/TranscriptionLabStoreTests.swift Verifies persistence round-trips for new whisper.cpp speechModelID values.
GhostPepperTests/TranscriptionLabRunnerTests.swift Verifies rerun transcription loads the selected whisper.cpp model IDs.
GhostPepperTests/TranscriptionLabControllerTests.swift Verifies UI/controller model selection + rerun execution support for whisper.cpp models.
GhostPepperTests/GhostPepperTests.swift Extends speaker-filtering toggle visibility/enablement assertions to whisper.cpp models.
GhostPepper.xcodeproj/project.pbxproj Registers new backend + tests in build phases.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread GhostPepper/Transcription/WhisperCppSpeechBackend.swift Outdated
Comment thread GhostPepper/Transcription/WhisperCppSpeechBackend.swift
Comment thread GhostPepper/Transcription/WhisperCppSpeechBackend.swift Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 15 changed files in this pull request and generated no new comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@obra

obra commented Apr 12, 2026

Copy link
Copy Markdown
Contributor

Can you talk about why you want those models? Where do they perform better than parakeet for you?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants