Read your Obsidian notes aloud using the native macOS text-to-speech system.
macOS only. This plugin uses the built-in
saycommand available on macOS. It does not work on Windows or Linux.
Tested on MacOS Tahoe 26 and later.
No internet connection required. No external API keys. No subscriptions. Apple TTS uses the voices already installed on your Mac — the same ones available in System Settings > Accessibility > Spoken Content.
main.js, manifest.json, and styles.css (if present) from the latest releaseapple-tts inside your vault's .obsidian/plugins/ directoryOpen the command palette (Cmd+P) and search for "Apple TTS":
| Command | Description |
|---|---|
| Read entire note | Reads the active note from start to finish |
| Read selected text | Reads only the currently highlighted text |
| Read from cursor position | Reads from your cursor to the end of the note |
| Stop speaking | Stops any active speech immediately |
Click the speaker icon in the left ribbon to toggle reading:
Assign your own keyboard shortcuts in Settings > Hotkeys — search for "Apple TTS" to find all four commands.
| Setting | Description | Default |
|---|---|---|
| Language filter | Filter the voice list by language code (e.g., en, fr, ja) |
(all voices) |
| Voice | Select from installed macOS voices | (System Default) |
| Speech rate | Playback speed from 0.5x (slow) to 3.0x (fast) | 1.0x |
Control which parts of your notes are read aloud. When a filter is on, that content type is skipped.
| Filter | What it controls | Default |
|---|---|---|
| Skip code blocks | Fenced code blocks (```) and inline code (`) |
On (skipped) |
| Skip math equations | LaTeX math ($...$ and $$...$$) |
On (skipped) |
| Skip tables | Markdown table content | Off (read aloud) |
| Skip link text | Text inside [links](url) |
Off (read aloud) |
| Skip images | Image alt text from  |
On (skipped) |
| Skip embeds | Obsidian embeds ![[filename]] |
On (skipped) |
| Skip callouts | Callout body content (> [!note]) |
Off (read aloud) |
| Skip HTML | Inline HTML tags | On (skipped) |
| Skip tags | Obsidian tags (#tag) |
On (skipped) |
macOS comes with a set of default voices, but you can install many more:
| Platform | Supported |
|---|---|
| macOS (desktop) | Yes |
| Windows | No |
| Linux | No |
| iOS / iPadOS | No |
| Android | No |
This plugin is marked as desktop only in its manifest and will only load on macOS. On other platforms, it displays a notice explaining the requirement.
Apple TTS uses the macOS say command under the hood. When you trigger a read command:
say process via stdinsay process speaks the text through your system audio outputStopping playback sends a termination signal to the running say process.
say command does not support pausing. Stop always means starting over from the beginning. This is a limitation of the underlying system command.say speaks in real-time without providing progress callbacks, there is no seek bar or time display.git clone https://github.com/ajsscott/obsidian-apple-tts.git
cd obsidian-apple-tts
npm install
npm run build
npm run dev
This starts esbuild in watch mode — it rebuilds main.js automatically when you save changes.
Symlink the plugin into your vault's plugin directory:
ln -s /path/to/obsidian-apple-tts /path/to/your-vault/.obsidian/plugins/apple-tts
Then toggle the plugin off and on in Obsidian's Community Plugins settings to reload it after changes.