Amir Tavakolian6 downloadsHigh-accuracy live voice dictation powered by Google Gemini AI directly at the cursor.
High-accuracy live voice dictation for Obsidian, powered by Google Gemini. Speak, and your words appear at the cursor. Or switch on Ask AI, ask a question out loud, and read the answer without leaving your note.
Most dictation tools make you wait until you stop talking, then dump a wall of text. Speakflow streams text into your note while you speak, exactly at your cursor, in the order you said it. It also knows the difference between speech and breathing, wind or a fan, so you don't get phantom "Hello" or "Thank you" sentences in your notes.
It was built with right-to-left and multilingual writers in mind. Persian, Arabic and mixed-language dictation work in their native scripts, and shortcuts use physical keys, so they keep working when you switch keyboard layouts.
Tick Ask AI under the record button and the panel turns into a voice assistant:
Details:
Works without an open note. Nothing is typed into your document in this mode.
Conversation memory. Follow-up questions keep context (the last 6 turns). A new Ask AI session starts a fresh conversation.
Answers in the language you spoke.
Standing instructions (⚙️ next to Ask AI): up to 2,000 characters of role and rules applied to every question, e.g. "You are a friendly English teacher. Answer in short sentences and gently correct my grammar." Saved automatically, with a one-click Clear.
📎 Note context. Choose what part of your note is sent along with the question:
| Option | What is sent |
|---|---|
| No context (default) | Nothing from your note |
| Selected text | Only the text you highlighted |
| Current section | The heading section under your cursor, including sub-headings |
| Whole note | The entire note (cut at ~100,000 characters, and you're told when that happens) |
| Selection, else whole note | Automatic: selection if there is one, otherwise the whole note |
A context chip above each question shows exactly what was sent (for example Section "Tasks" of "Meeting" · 214 words).
Note content is explicitly treated as reference data, never as instructions.
Copy the last answer with one click. A question is sent automatically after 5 minutes of recording.
Breathing into the mic, wind and fan noise are loud but are not speech, and models tend to invent a greeting for them. Speakflow filters them out before anything is sent:
"speechGate": false in the plugin's data.json to turn the gate off.Choose how often speech is cut and sent. Faster feels more live, slower gives Gemini more context.
| Mode | Segment length | Cuts at pauses of | Approx. requests/min while talking |
|---|---|---|---|
| Turbo (default) | 0.6 – 3.0 s | 0.2 s | 20 – 100 |
| Fast | 1.0 – 3.5 s | 0.3 s | 17 – 60 |
| Balanced | 2.0 – 5.5 s | 0.35 s | 11 – 30 |
| Accurate | 4.0 – 9.0 s | 0.4 s | 7 – 15 |
Free API keys have a per-minute request limit. If you see
429errors, pick a slower mode.
Set separate keys for Start, Pause/Resume and Stop, all captured by clicking a box and pressing the keys.
Ctrl+Alt+R.Ctrl+Alt: hold, then release.F9, Pause, ScrollLock or media keys.Ctrl+Shift / Alt+Shift (Windows uses them to switch keyboard language).<your-vault>/.obsidian/plugins/speakflow/.main.js, manifest.json and styles.css into it.There is no build step: the plugin is plain JavaScript.
| Setting | Description |
|---|---|
| Google Gemini API Key | Your key, with a show/hide toggle and a Check Key button |
| Speech Model | Models are fetched live for your key. Default: gemini-3.1-flash-lite. gemini-2.5-flash and gemini-2.5-flash-lite are the built-in alternatives |
| Live update speed | Turbo / Fast / Balanced / Accurate (with an in-app explanation) |
| Microphone | System default or any input device, with a refresh button |
| Shortcut Keys | Start, Pause/Resume, Stop |
| About Me | Author contact links |
Spoken language, Ask AI, standing instructions and note context are controlled directly from the floating panel.
All commands are available from the command palette and can be bound to hotkeys in Obsidian.
| Command | Action |
|---|---|
Speakflow: Toggle voice recording |
Start or stop |
Speakflow: Start voice recording |
Start |
Speakflow: Stop voice recording |
Stop |
Speakflow: Pause / resume voice recording |
Pause or resume |
Speakflow: Toggle dictation panel |
Show or hide the floating panel |
Speakflow: Save last recorded audio segment to vault (debug) |
Saves the last segment as gvd-debug-<timestamp>.wav in your vault root |
data.json inside your vault, in plain text. Don't sync or share that file publicly. data.json is already in this repo's .gitignore.Microphone ─► AudioContext (16 kHz mono) ─► block analysis
├─ adaptive noise floor (RMS)
└─ pitch detection (autocorrelation)
│
segment cut at natural pauses (per speed preset)
│
16-bit PCM WAV ─► Gemini streamGenerateContent (SSE)
│
parallel jobs, written strictly in speaking order ─► editor cursor
temperature: 0 and thinking minimized on Gemini 2.5/3 Flash models, since transcription doesn't benefit from it and thinking tokens would eat the output budget.[silence] or No speech are cleaned out before reaching your note.| Problem | What to do |
|---|---|
| "Please click inside a note in edit mode" | Click into a note in Live Preview/Source mode. Ask AI works without a note. |
| No text appears / "No sound is reaching the microphone" | Check your input device and volume. The level meter on the panel should move when you speak. |
| Records computer audio instead of my voice | Avoid Stereo Mix / loopback devices. Pick your real microphone in settings. |
429 rate-limit errors |
Choose a slower Live update speed, or use gemini-2.5-flash-lite. |
404 model not found |
Pick another model in settings and click Check Key again. |
401 / 403 errors |
Your API key is invalid or lacks access. Re-enter it and click Check Key. |
| Whispered speech is ignored | Set "speechGate": false in data.json. |
| Microphone permission denied | Allow microphone access for Obsidian in your OS privacy settings. |
| Want to hear what the mic captured? | Run the Save last recorded audio segment command and play the WAV. |
Debug logs in the developer console are prefixed with [GVD] / [Speakflow].
speakflow/
├── main.js # Entire plugin (plain JavaScript, no build step)
├── manifest.json # Obsidian plugin manifest
├── styles.css # Panel, modal and answer-box styling
└── .gitignore
Ideas, bug reports and pull requests are welcome. Please open an issue or reach out directly:
Built by Amir Tavakolian.