Rahul Rajeev16 downloadsFast, private local neural text-to-speech for English notes with live word tracking and MP3 audio export.
Local, private, neural text-to-speech for Obsidian notes.
Powered by Kokoro-82M & ONNX Runtime Web. Zero API keys, zero cloud latency, zero external servers.
[!NOTE] Language Support: let's hear it currently supports English notes only (with 28 distinct American and British voices). Other languages are not supported at this time.
0.75x - 2.0x), quick voice selector, and progress indicators. ┌────────────────────────┐
│ Obsidian Markdown │
│ Note │
└───────────┬────────────┘
│
▼
┌────────────────────────┐
│ Markdown Cleaner │
│ (src/engine/cleaner) │
└───────────┬────────────┘
│ Sentence Chunks & Ranges
▼
┌────────────────────────┐
│ TTS Engine │
│ (src/engine/ttsEngine) │
└─────┬────────────┬─────┘
│ │
Audio Buffering │ │ Word & Sentence
& Synthesis │ │ Timing Events
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ KokoroTTS (ONNX) │ │ Word Highlighter │
│ - WASM SIMD / WebGPU│ │(CSS Highlight API) │
│ - 24kHz PCM Output │ └─────────────────────┘
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ WebAudio Pipeline │
│ - AudioContext DAC │
│ - SourceNode Buffer │
│ - Floating Player UI│
└─────────────────────┘
src/engine/cleaner.ts (Markdown Parser & Boundary Chunker):
src/engine/ttsEngine.ts (Neural Synthesis & Streaming):
KokoroTTS.from_pretrained), memory-mapped WASM binaries, and voice embedding vectors.src/ui/highlighter.ts (Non-destructive Word Highlighter):
CSS.highlights (Highlight API) when supported.src/ui/player.ts & src/settings.ts (UI & User Configuration):
Because Obsidian runs inside an Electron environment with strict sandbox origin policies (app:// or file:// protocols):
.mjs). Directly importing file:// URLs in Electron workers is blocked by Chromium CORS/protocol policies.esbuild.config.mjs) intercept dynamic imports and convert local .mjs code into data:text/javascript;base64,... modules.TTSEngine.configureWasmPaths() loads the ONNX runtime .wasm binary into an in-memory Uint8Array buffer and passes it directly to ort.env.wasm.wasmBinary.AudioContext to a forced sample rate (which causes macOS CoreAudio buffer clicks and crackles), WebAudio runs at native hardware rate (44.1kHz/48kHz) and dynamically upsamples Kokoro's 24kHz PCM without audio artifacts.The repository includes a standalone headless simulation test runner: test-obsidian-simulator.mjs.
Plugin, SettingTab, Notice, addIcon, and DOM APIs without requiring manual desktop launch.AudioContext initialization, audio buffer construction, duration calculations, and verifies that synthesized samples contain 0 NaN values and valid dynamic amplitude.# Run automated simulation test suite
node test-obsidian-simulator.mjs
# 1. Clone repository
git clone https://github.com/drawablex86/lets-hear-it.git
cd lets-hear-it
# 2. Install dependencies
npm install
# 3. Build production bundle (outputs to root and v0/)
npm run build
v0/ directory into your Obsidian vault:
<VaultPath>/.obsidian/plugins/lets-hear-it/let's hear it: Read current note.In compliance with the Obsidian Developer Policies:
kokoro-v1.0.onnx, ~80MB) and voice embedding vectors are automatically fetched on first use from HuggingFace (https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX) and cached in the local IndexedDB/cache directory. Once cached, all synthesis runs 100% locally offline..obsidian/plugins/lets-hear-it/) using Node.js filesystem APIs solely to detect and load pre-bundled WebAssembly binaries (ort-*.wasm) into memory for zero-latency offline neural synthesis. It does not access, read, or write any files outside of its own installation folder and user-initiated note exports inside the vault.MIT License.