Voice dictation for IntelliJ IDEA — press a shortcut, speak, and your words appear wherever the cursor is: code editor, AI Chat, Junie, commit message, any text field.
- Universal input — works in any text field: code editor, AI Chat / Junie, commit message, search boxes
- Three STT backends — switch between cloud and offline in settings:
- OpenAI Whisper (cloud) — high accuracy, supports any OpenAI-compatible endpoint (OpenAI, Groq, etc.)
- Whisper Local (offline) — runs a ggml Whisper model on-device via whisper.cpp JNI, no internet required
- Vosk (offline) — fully local, lightweight, no internet required, no data leaves your machine
- Auto-stop on silence — recording ends automatically after a configurable pause; no need to press the shortcut again
- Clipboard fallback — if no editor is focused when recording stops, the transcribed text is copied to clipboard
- Microphone button in AI Chat toolbar — one-click dictation directly from the AI Assistant / Junie input bar
- Configurable language — set a language hint or leave on
autofor automatic detection - Secure key storage — API key stored in IntelliJ's
PasswordSafe, never in plain text on disk
- Open Settings → Plugins → Marketplace
- Search for SpeakIDE
- Click Install and restart the IDE
Or install directly: plugins.jetbrains.com/plugin/31433-speakide
Requirements: JDK 21, IntelliJ IDEA 2024.2+
git clone https://github.com/Dragonav4/SpeakIDE.git
cd SpeakIDE
./gradlew runIde # launch a sandbox IDE with the plugin
./gradlew buildPlugin # build distributable .zip → build/distributions/Install the .zip via Settings → Plugins → ⚙ → Install Plugin from Disk.
- Open Settings → Tools → SpeakIDE
- Select Provider → OpenAI Whisper (Cloud)
- Paste your API key (stored securely)
- Set Base URL and Model Name:
| Provider | Base URL | Model |
|---|---|---|
| OpenAI | https://api.openai.com/v1 |
whisper-1 |
| Groq | https://api.groq.com/openai/v1 |
whisper-large-v3-turbo |
- Download a model from alphacephei.com/vosk/models
Recommended:vosk-model-small-en-us(~50 MB) orvosk-model-small-ru - Extract the archive
- Open Settings → Tools → SpeakIDE
- Select Provider → Vosk (Offline)
- Set Vosk model path to the extracted folder
- Download a ggml model from Hugging Face
Recommended:ggml-base.en.bin(~150 MB) orggml-small.binfor multilingual - Open Settings → Tools → SpeakIDE
- Select Provider → Whisper (Local)
- Set Whisper local model (.bin) to the downloaded
.binfile
Note for macOS Apple Silicon users: the bundled native library supports both arm64 and x86_64 — no extra steps needed.
Minimum audio length: Whisper Local requires at least ~1 second of speech to produce a result. Very short recordings (under 1 s) will return empty output.
| Action | How |
|---|---|
| Start / stop recording | Ctrl+Alt+/ (all platforms) |
| Start / stop from AI Chat | Click the 🎤 button in the AI Chat input toolbar |
| Auto-stop | Speak, then pause — recording stops after silence timeout |
| No editor focused | Transcribed text is copied to clipboard automatically |
The microphone icon in the toolbar turns red while recording is active.
Settings → Tools → SpeakIDE
| Setting | Description |
|---|---|
| Provider | OpenAI Whisper (Cloud), Vosk (Offline), or Whisper (Local) |
| Language | Language hint (auto, en, ru, de, …) — Vosk ignores this |
| API Key | Whisper cloud API key — stored in PasswordSafe |
| Base URL | Whisper-compatible endpoint URL |
| Model Name | Model identifier for the cloud API |
| Vosk model path | Path to the extracted Vosk model folder |
| Whisper local model (.bin) | Path to a ggml .bin model file |
| Enable silence detection | Auto-stop recording after a pause |
| Silence threshold (ms) | How long the pause must be before stopping (default 2000 ms) |
| Show recording overlay | Visual indicator while recording |
ToggleRecordingAction (~30 lines, delegates only)
│
▼
RecordingService (@Service APP — owns the state machine)
│
├── RecordingState (sealed class: Idle / Recording / Transcribing)
│
├── AudioSource (interface)
│ └── AudioCapture (TarsosDSP)
│ ├── MicPermissionProbe
│ └── SilenceTimeoutProcessor
│
├── PcmBuffer (ConcurrentLinkedQueue — thread-safe PCM accumulator)
│
├── SttProviderFactory
│ ├── OpenAiWhisperProvider ── shared HttpClient (lazy) ── Whisper API
│ ├── WhisperLocalProvider ── whisper.cpp JNI ── ggml model (offline)
│ │ └── AudioResampler (44 100 Hz → 16 kHz, TarsosDSP sinc)
│ └── VoskProvider ── Vosk JNI (native arm64 / x86_64)
│
├── TextDelivery (fun interface)
│ ├── CaretTextDelivery (WriteCommandAction on EDT)
│ └── ClipboardTextDelivery (fallback when no editor focused)
│
├── RecordingIndicator (interface)
│ └── RecordingOverlay (floating Swing window)
│
└── SpeakIdeNotifier (wraps NotificationGroupManager)
The AI Chat microphone button is a second registration of ToggleRecordingAction added to the AI Assistant toolbar — loaded only when the com.intellij.ml.llm plugin is present (optional dependency).
Pull requests are welcome. For major changes, open an issue first.
./gradlew test # run unit tests
./gradlew runIde # test in sandbox IDE