Murmur
unlistedby kaurimark
Read your notes aloud with karaoke-style highlighting. Multiple TTS providers supported.
Murmur
A read-aloud plugin for Obsidian. Sends your note text to a TTS provider of your choice for high-quality text-to-speech, with karaoke-style highlighting that follows the spoken word in your editor.
Built because Speechify mangles markdown — tables, code, lists, callouts — and runs paragraphs together with no pauses. Murmur understands Obsidian's markdown shape and renders it for the ear.
Features
- Read whole note or just selected text
- Karaoke-style highlight tracking the spoken word in source mode and Live Preview
- Top-of-file player (or a draggable floating widget) with play/pause, segment skip, stop, and 0.75×–2× speed
- Two widget themes: a minimal inline chip, or a tape-deck with pixel-grid timer and rolling speed wheel
- Disk cache so re-reading a note is instant and free
- Pauses around headings, between paragraphs, between list items
- Strips Obsidian-specific syntax (wikilinks, embeds, callouts, highlights, comments, task checkboxes) so it sounds like prose, not code
Affiliate disclosure
Some links in this README and in Murmur's settings tab are referral links — if you sign up through them I receive a small commission, at no extra cost to you. Currently this applies only to ElevenLabs; the other providers (Inworld, Fish Audio, Cartesia, OpenAI) are linked through plain non-referral URLs.
Referral links are marked (referral) everywhere they appear. You can sign up directly at any provider's website without going through my links — whether you do or not has no effect on the plugin or your account.
Providers
Pick whichever fits your budget and quality bar. All keys are stored locally in your vault — Murmur never proxies through a server.
| Provider | Strengths | Karaoke precision | Approx. cost |
|---|---|---|---|
| ElevenLabs (referral) | Highest karaoke precision (true word-level timestamps from the API). Excellent voices. | Per-character | ~$0.05–0.10 / 1K chars |
| Inworld | Currently top of the Artificial Analysis Speech Arena. OpenAI-level pricing. | Synthesized from duration | ~$35 / 1M chars |
| Fish Audio | Fast, lots of community voices. | Synthesized from duration | Pay-as-you-go |
| Cartesia | Low latency, expressive voices. | Synthesized from duration | Pay-as-you-go |
| OpenAI | Cheapest, six built-in voices. | Synthesized from duration | ~$15 / 1M chars |
Karaoke highlighting works on every provider; ElevenLabs is the only one that returns true per-character alignment, so on the others Murmur synthesizes a uniform alignment from audio duration (still very usable, just slightly less precise on long words).
Install
From the community plugins browser (once approved)
- Settings → Community plugins → Browse
- Search for "Murmur"
- Install, then Enable
Manual install
- Clone this repo into your vault:
<vault>/.obsidian/plugins/murmur/ npm install && npm run build- In Obsidian: Settings → Community plugins → Reload, then enable "Murmur"
Setup
- Get an API key from your provider of choice (see the table above for links).
- In Obsidian, open Settings → Murmur and pick the provider.
- Paste the API key. Pick a voice and model (defaults are sensible).
- Optional: hit "Preview" in settings to taste the voice before committing.
- Optional: set a max cache size (default 500 MB), pick a widget theme, choose inline vs floating placement.
Use
- Click the audio-lines icon in the ribbon, or
- Run "Read note (or selection)" from the command palette (
Cmd+P), or - Assign a hotkey to that command in Settings → Hotkeys
If text is selected, it reads the selection. Otherwise it reads the whole note.
The widget appears at the top of the file (after frontmatter, if any) with playback controls — or as a draggable floating pane that stays visible everywhere, your choice.
Privacy
Murmur sends your note text — or just the selected portion — to whichever TTS provider you've configured, over HTTPS, in order to generate audio. Your API key is stored as plain text in <vault>/.obsidian/plugins/murmur/data.json. If your vault is shared or synced, treat that file as sensitive.
No analytics, no telemetry, no other network calls. The only outbound traffic is to the TTS provider you've selected.
Limitations
- Desktop only for now (
isDesktopOnly: true). Mobile audio streaming inside Obsidian's WebView is too fragile. - Reading view (pure preview) has no highlight or widget — those need a CodeMirror editor. Audio still plays.
- Tables and code blocks are announced ("Table with N rows, skipped") rather than read. Tunable in a future release.
- Highlight position is accurate within typical formatting but may drift on heavily-edited or non-standard markdown.
- Fish Audio bills API usage from a separate wallet from your Plus/Pro subscription — fund it at fish.audio/go-api or you'll get HTTP 402 errors. Murmur surfaces this in the error message.
Development
npm install
npm run build # production build
npm run dev # esbuild watch mode
Plugin entry: src/main.ts. Build output: main.js (committed at release tags only).
License
MIT — see LICENSE.
Support
If Murmur has been useful and you'd like to say thanks: buymeacoffee.com/kaurimarkkanen. Entirely optional, deeply appreciated.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.