Verba
The Developer's Dictation Extension
Voice dictation with AI-powered post-processing for VS Code.
Verba records speech via your microphone, transcribes it with Deepgram Nova-3, and post-processes the transcript with Claude — all directly inside VS Code. Filler words are removed, sentences are smoothed, and the result is inserted at your cursor position.
Features
- Dictation in Editor and Terminal --
Cmd+Shift+D (Mac) / Ctrl+Shift+D (Windows/Linux) starts and stops recording. Text is inserted contextually in the editor or terminal.
- Streaming Post-Processing -- Claude processes your transcript in real-time with a live character counter in the status bar. Cancel anytime by pressing the dictation shortcut again.
- Course Correction -- Self-corrections in speech are automatically detected and removed. Say "let's meet tomorrow, no wait, on Friday at ten" and only "let's meet on Friday at ten" is kept. Works in all modes.
- Voice Commands -- Speak formatting commands like "new paragraph", "comma", "bullet point" and they are converted to actual formatting. Works in any language.
- Glossary/Dictionary -- Define terms that must be preserved exactly during transcription and cleanup (e.g. "Visual Studio Code", "Kubernetes"). Global terms in settings, project-specific terms in
.verba-glossary.json.
- Prompt Templates -- Choose a template on first use; it is automatically reused for subsequent recordings. Switch anytime with
Cmd+Alt+T. 8 built-in templates: Freitext, Commit Message, JavaDoc, Markdown, E-Mail, and 3 context-aware templates (Code Comment, Explain Code, Claude Code Prompt). The template controls how Claude post-processes the transcript.
- Fully Configurable -- Templates are defined in
settings.json and freely extensible. Add custom templates with any prompt.
- Offline Transcription -- Transcribe locally with whisper.cpp for full privacy and zero API costs. Audio never leaves your machine. Install whisper-cpp, download a model, and switch the provider to
local.
- Bring Your Own Key -- Use your own OpenAI and Anthropic API keys. No subscription costs, full data control. Keys are stored securely in VS Code's SecretStorage.
Prerequisites
- ffmpeg must be installed (audio recording)
- Deepgram API Key (Nova-3 transcription) -- or whisper-cpp for offline transcription
- Anthropic API Key (Claude post-processing)
Installing ffmpeg
macOS:
brew install ffmpeg
Linux (Debian/Ubuntu):
sudo apt install ffmpeg
Linux (Fedora):
sudo dnf install ffmpeg
Windows:
Download from ffmpeg.org and add to PATH, or via Chocolatey:
choco install ffmpeg
| Platform |
Audio Backend |
Microphone Selection |
| macOS |
AVFoundation |
Configurable via verba.audioDevice or Quick Pick |
| Linux |
PulseAudio |
Configurable via verba.audioDevice or Quick Pick |
| Windows |
DirectShow |
Configurable via verba.audioDevice or Quick Pick |
On all platforms, you can select the microphone anytime with the command Verba: Select Audio Device or by setting verba.audioDevice in Settings. Without configuration, the system default microphone is used.
Linux: PulseAudio must be running (default on Ubuntu, Fedora, and most desktop distributions).
Windows: On first use, a Quick Pick dialog lets you select the microphone. Verba detects devices via ffmpeg (v7 and v8+ formats) with a PowerShell fallback.
Installation
Install from the VS Code Marketplace:
ext install talent-factory.verba
Or search for "Verba" in the VS Code Extensions sidebar.
Quick Start
Cmd+Shift+D -- on first use, a Quick Pick with template selection appears
- Choose a template (e.g., "Free Text") -- recording starts
- Speak
Cmd+Shift+D -- recording stops, text is transcribed and processed
- Result appears at your cursor position
From now on, your last template is reused automatically -- just press Cmd+Shift+D to start recording immediately. To switch templates, press Cmd+Alt+T (Mac) / Ctrl+Alt+T (Windows/Linux) or use the command Verba: Select Template. The status bar shows the active template.
On first use, you will be prompted for your API keys, which are stored securely.
Terminal Mode
When the integrated terminal is focused, dictated text is inserted there instead. With verba.terminal.executeCommand: true, the text is additionally submitted with Enter.
Claude Code Integration
Use the Claude Code Prompt template to dictate tasks for Claude Code. Verba transcribes your voice, enriches it with codebase context, and generates an optimized prompt — ready to confirm in your terminal.
Setup:
- Select the "Claude Code Prompt" template (
Cmd+Alt+T)
- Set up a context provider for codebase-aware prompts:
- Option A (recommended): Install grepai and run
grepai init in your project
- Option B: Run command
Verba: Index Project to build the OpenAI Embeddings index
- Ensure
verba.terminal.executeCommand is false (default) — text is pasted without submitting
Workflow:
1. Focus your terminal running Claude Code
2. Cmd+Shift+D → recording starts
3. Speak your task naturally, e.g.:
"I want the pipeline to support streaming so that transcribed
text appears incrementally during post-processing"
4. Cmd+Shift+D → recording stops
5. Verba:
a) Transcribes via Deepgram
b) Searches codebase context (pipeline.ts, cleanupService.ts, ...)
c) Claude generates an optimized prompt:
"Implement streaming support in the processing pipeline.
Modify CleanupService.process() in src/cleanupService.ts
to use Claude's streaming API. Add a callback parameter
so that insertText.ts can display text incrementally
as chunks arrive from the API."
6. Prompt appears in your terminal — review, edit if needed, press Enter
7. Claude Code executes the task
The template references files and symbols from your codebase via semantic search (grepai or OpenAI Embeddings). The specificity of the generated prompt depends on the context provider's search results -- for best results, mention the area of code you want to modify.
Configuration
Custom Templates
Define custom templates in settings.json:
{
"verba.templates": [
{
"name": "Free Text",
"prompt": "Clean up the transcript: remove filler words, smooth broken sentence starts, fix transcription errors. Keep the original language and meaning. Return only the cleaned text."
},
{
"name": "Code Review",
"prompt": "Convert this transcript into structured code review feedback with bullet points for issues found and suggestions. Keep the original language.",
"contextAware": true
}
]
}
Each template consists of name (displayed in Quick Pick), prompt (instruction sent to Claude for post-processing), and optionally contextAware (if true, enables semantic code search and includes relevant code snippets as context for Claude).
Settings
| Setting |
Type |
Default |
Description |
verba.audioDevice |
String |
"" |
Audio input device name. Leave empty for system default. |
verba.templates |
Array |
8 built-in templates |
Prompt templates for post-processing |
verba.terminal.executeCommand |
Boolean |
false |
Submit text in terminal with Enter |
verba.glossary |
Array |
[] |
Terms preserved during transcription and cleanup (recommended limit: ~80 terms) |
verba.transcription.provider |
String |
"deepgram" |
Transcription provider: deepgram (API) or local (whisper.cpp) |
verba.transcription.localModel |
String |
"base" |
Whisper model for local transcription: tiny, base, small, medium, large-v3-turbo |
verba.contextSearch.provider |
String |
"auto" |
Context search provider: auto uses grepai if available, otherwise OpenAI Embeddings |
verba.contextSearch.maxResults |
Number |
5 |
Number of context snippets per dictation (1--20) |
Architecture
Microphone --> ffmpeg (WAV) --> Deepgram API --> Claude API --> Editor/Terminal
\-> whisper.cpp CLI / (Template)
| Module |
Purpose |
recorder.ts |
ffmpeg child process for audio recording (macOS/Linux/Windows) |
transcriptionService.ts |
Transcription via Deepgram pre-recorded API or local whisper.cpp CLI (glossary hints) |
cleanupService.ts |
Anthropic Claude API integration (streaming, course correction, voice commands, glossary, text expansions) |
pipeline.ts |
Processing stage orchestration |
templatePicker.ts |
Quick Pick menu for template selection |
insertText.ts |
Text insertion into editor or terminal (multi-cursor, selection replacement) |
statusBarManager.ts |
Status bar display (Idle/Recording/Transcribing/Processing with character counter) |
costTracker.ts |
API usage cost tracking with persistence via globalState |
costOverviewPanel.ts |
WebView panel for cost overview (card layout, session/total toggle) |
wavDuration.ts |
WAV file duration calculation from PCM header (for Deepgram cost tracking) |
glossaryGenerator.ts |
Scans workspace for project-specific glossary terms (metadata, symbols, docs) |
historyManager.ts |
Dictation history with globalState persistence and full-text search |
historyCommands.ts |
Quick Pick UI for browsing, searching, and acting on history entries |
continuousRecorder.ts |
Deepgram WebSocket streaming, ffmpeg audio capture, EventEmitter |
Development
npm run compile # Compile TypeScript
npm run watch # Watch mode
npm run test:unit # Unit tests
npm run test # All tests (compile + unit + integration)
Contributing
Found a bug or have a feature request? Open an issue.
License
MIT