engenharick2 downloadsRecord voice notes as MP3 and insert the player right where you started recording: in a note, or inside an Excalidraw drawing.
Record a voice note and drop the MP3 player right where you started recording — in a Markdown note, or inside an Excalidraw drawing.
Assign a shortcut to VoiceComment: Start/stop recording (Settings → Hotkeys) — Alt+R is a good one — talk, then press it again. The plugin deliberately ships no default hotkey, so it never steals a key you already use. The recording is encoded to MP3 inside Obsidian (no ffmpeg, no Python, no cloud), saved into your vault, and the audio player is inserted automatically at the cursor — or as a playable element in the middle of your drawing.

The player VoiceComment inserts into an Excalidraw drawing: the file it just recorded, playable from the scene.
Neither Excalidraw nor its Obsidian plugin can record audio, and even embedding an existing audio file in a drawing is a manual workaround. Issue #2278 is still open, and the plugin's author suggests working around it by adding a card and dropping the audio link into it. VoiceComment does exactly that — automatically, with the recording included.
Alt+R) and it starts and stops from anywhere![[audio.mp3]] at the cursorSettings → Community plugins → Browse → search "VoiceComment".
Add Engenharick/voicecomment to BRAT.
Download main.js, manifest.json and styles.css from the latest release, put them in <vault>/.obsidian/plugins/voicecomment/, and enable the plugin in Settings → Community plugins.
| Where you record | What appears |
|---|---|
| Markdown note | ![[VoiceComment 2026-09-25 18.20.33.mp3]] at the cursor |
| Excalidraw drawing | a player element in the middle of the view, selected and ready to play |
Autoplay is disabled by the browser (see #1657), so you press play once.
Without the Excalidraw plugin there is nothing to draw into, so recording with a drawing open simply inserts the audio into that note instead. Nothing breaks — the file is always saved.
| Setting | Description |
|---|---|
| Recordings folder | Vault folder for the MP3s. Created automatically if missing. |
| File name prefix | Base name; the date and time are appended to it. |
| MP3 quality | 64 / 96 / 128 / 192 kb/s, mono. |
| Insert the recording | At the cursor (edit mode) or at the end of the note. |
| Microphone icon in the sidebar | Show or hide the ribbon icon. |
| Diagnostic log | Opens .obsidian/plugins/voicecomment/voicecomment.log. |
ScriptProcessor) feeds the MP3 encoder directly, so there is a single lossy generation. At the same time a MediaRecorder captures the same stream. If the WebAudio path delivers no samples — a suspended AudioContext is the classic cause, and the timer keeps running anyway, which is misleading — the compressed capture is decoded with decodeAudioData and re-encoded, so a recording is never lost.![[…]] is inserted at the cursor, or appended to the note.window.ExcalidrawAutomate.getAPI(view) returns an instance bound to the drawing's view; addEmbeddable(...) creates the audio element (transparent stroke and background, height measured from an offscreen <audio controls>), addElementsToView(false, true, true) persists it, and selecting it plus updateScene({ appState: { activeEmbeddable: … } }) is what makes the player render. ea.destroy() is always called.ExcalidrawAutomate API that makes the drawing part possible.LGPL-3.0 — see LICENSE.