feat: custom vocabulary for names and jargon - #169
Merged
Conversation
Adds a Custom Vocabulary field in Settings > General where users list names, jargon, and proper nouns that get mis-transcribed. VocaMac encodes those terms as WhisperKit prompt tokens so transcription leans toward the right spelling (for example "Namrata" instead of "Normada"). WhisperKit only applies promptTokens when usePrefillPrompt is true, and that flag was previously set only when an explicit language was chosen. This turns it on whenever vocabulary is present, so terms are not ignored in auto-detect mode. Requested in #24.
Note that custom vocabulary works best when the terms match the dictation language and the Transcription Language setting, and that in Auto-detect the terms can influence which language is picked. Also drop the em dash and en dash from the token-budget hint.
Member
Author
|
/build |
|
⏳ PR Build started for Build signed & notarized DMG... this usually takes 10–20 minutes. |
|
✅ PR Build ready!
📥 Install
SHA-256 checksum
|
Swap the placeholder from "Namrata / Kubernetes / VocaMac" to a comma-separated set of terms Whisper commonly mis-transcribes (kubectl, PostgreSQL, nginx, Grafana), so the hint does not put someone's real name in the UI.
Member
Author
|
/build |
|
⏳ PR Build started for Build signed & notarized DMG... this usually takes 10–20 minutes. |
|
✅ PR Build ready!
📥 Install
SHA-256 checksum
|
This was referenced Jul 1, 2026
jatinkrmalik
added a commit
that referenced
this pull request
Jul 2, 2026
* docs(web): document v0.7.0 features on the website Adds website coverage for features shipped since v0.6.2 (audit found 4 of 5 uncovered; Homebrew was already fully covered, left untouched): - New feature pages: Custom Vocabulary (#169) and Usage Statistics (#148/#168/#170), each with a landing-page grid card. - Landing JSON-LD featureList: add custom vocabulary, local usage stats, and selectable audio input device (#156). - Hotkey presets + custom recording (#139): fix stale "key combination" copy in fully-configurable.md, document the Record/custom-key capture and add the Right Control preset in push-to-talk.md, and update the FAQ. - Audio input device (#156): expand fully-configurable.md (System Default, non-invasive pinning, auto-fallback on disconnect, Refresh Devices). - Screenshots gallery: add a Stats tab entry. Two screenshots still needed from a real capture (marked with SCREENSHOT PLACEHOLDER comments): settings-stats.png and settings-vocabulary.png. Verified with `hugo` (build succeeds; new pages render; JSON-LD valid). * polish(web): refine features grid, fix mobile hero overflow, SEO pass Features grid: - Switch from a fixed 4-col grid (which left 2 orphan cards hanging and, via grid-auto-rows:1fr, forced every row to the tallest card's height) to a centered flex-wrap layout: uniform card heights, the short last row centers, and 4/2/1 columns at desktop/tablet/mobile. - Apple-style polish: icon squircle tiles, tighter 1–2 line copy on every card, softer corners, refined heading type, gentler hover. Mobile hero: - The 380px mockup forced the hero column wider than small viewports, clipping the subtext/pills/buttons. Reset min-width and clip the decorative mockup so nothing overflows below ~420px. SEO: - og:type now "article" for content pages (was always "website"). - Enriched the home and features-list meta descriptions. - Verified across all 18 pages: unique titles, one <h1> each, descriptions present, all <img> have alt, sitemap includes the new pages. Screenshots: add settings-stats.png and settings-vocabulary.png (referenced by the new feature pages) and refresh settings-general.png.
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.
Requested in #24: a custom dictionary so names and jargon stop getting mangled by the model. Two users have now asked for it, and the common case is coworker or manager names ("Namrata" coming out as "Normada" or "Nam orda").
What this does
Adds a Custom Vocabulary text box in Settings > General. You type the terms that get mis-transcribed, one per line or comma-separated. VocaMac feeds them to WhisperKit as prompt context so it biases toward the right spelling.
How it works
The terms are parsed, framed as a "Glossary: ..." prompt, tokenized via
whisperKit.tokenizer, and passed toDecodingOptions.promptTokens. WhisperKit trims to its own token budget and strips special tokens, so there is nothing to manage on our side.One thing worth calling out for review: WhisperKit only applies
promptTokenswhenusePrefillPromptis true, and we were setting that flag only when the user picked an explicit language. So the vocabulary would have been silently dropped in auto-detect mode, which is the default. This PR forces the flag on whenever vocabulary is present.Why a text field and not a config file
VocaMac keeps its files out of Documents and the home folder to avoid macOS permission prompts (see the model-storage note in
WhisperService). A user-facing config file would bring that friction back, plus file watching and parse-error handling. A text field is discoverable and persists through@AppStoragelike the rest of the settings.Testing
Added unit tests for the term parsing (newline and comma split, trimming, dropping blanks). Build is green and all 34 tests pass.
Tested on local as well:
