Local Meeting Transcriber
unlistedby Zhiyu Xu
Transcribe meeting recordings locally with whisper.cpp and any OpenAI-compatible LLM (ollama, llama.cpp, vmlx-serve, LM Studio, or remote APIs). Generates structured notes with title, participants, action items, and decisions.
Local Meeting Transcriber
An Obsidian plugin that turns meeting recordings into structured notes β entirely on your machine. No cloud, no subscriptions.
Pipeline: Audio file β whisper.cpp (speech-to-text) β Any local or remote LLM (note generation) β Obsidian note
Features
- ποΈ Transcribe any audio file (m4a, mp3, wav, ogg, flac, mp4, webm, aac)
- π€ Compatible with any OpenAI-compatible LLM server β local or remote
- π Generates structured notes: title, participants, summary, discussion, action items, decisions
- π§ Fully configurable β system prompt, output folder, frontmatter, ffmpeg path
- β‘ Auto-start your local server from within Obsidian
Privacy and Security
- The plugin is desktop-only and uses local system binaries such as
whisper-cliandffmpeg. - It reads the audio file you choose and writes the generated note into your vault.
- It can connect to the Whisper health-check URL and the LLM API URL you configure.
- If you point the LLM URL at a remote service, your transcript and prompt data are sent to that service.
- It can run user-configured shell commands to start local servers, but only if you explicitly enter those commands in settings and trigger them manually or enable auto-start.
- The plugin itself does not require an account, does not include ads, and does not include telemetry.
Requirements
-
Obsidian desktop (macOS, Windows, Linux)
-
whisper.cpp for transcription:
brew install whisper-cpp # macOSBuild from source for other platforms.
-
A whisper GGML model (download from huggingface.co/ggerganov/whisper.cpp):
mkdir -p ~/.whisper-models curl -L https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin \ -o ~/.whisper-models/ggml-base.en.bin -
An OpenAI-compatible LLM server β pick one:
Backend Format Install ollama GGUF brew install ollamallama.cpp GGUF build from source vmlx-serve MLX (Apple Silicon) install vMLX.app mlx_lm.server MLX (Apple Silicon) pip install mlx-lmLM Studio GGUF + MLX download app OpenAI / Groq / Anthropic proxy β set API key in settings -
ffmpeg for m4a/mp4/webm conversion (most common meeting formats):
brew install ffmpeg # macOSLeave the ffmpeg path empty in settings to auto-detect.
Installation
From Obsidian Community Plugins (recommended)
Settings β Community plugins β Browse β search "Local Meeting Transcriber" β Install β Enable
Manual installation
- Download
main.js,manifest.json,styles.cssfrom the latest release - Place in
.obsidian/plugins/local-meeting-transcriber/inside your vault - Enable in Settings β Community plugins
Quick Start with ollama
- Install ollama:
brew install ollama - Pull a model:
ollama pull llama3 - Configure the plugin:
- whisper-cli path:
/opt/homebrew/bin/whisper-cli - Whisper model path:
~/.whisper-models/ggml-base.en.bin - LLM URL:
http://127.0.0.1:11434 - Model name:
llama3 - LLM start command:
ollama serve - Enable Auto-start LLM server
- whisper-cli path:
- Click the microphone icon in the ribbon β drop your audio file β Start pipeline
Configuration Reference
Speech-to-Text
| Setting | Default | Description |
|---|---|---|
| whisper-cli path | (auto-detect) | Path to whisper-cli. Auto-detects from /opt/homebrew/bin and /usr/local/bin |
| Whisper model path | β | Path to a .bin GGML model file |
| Default language | en | Language code or auto for auto-detection |
| Whisper server URL | http://127.0.0.1:8178 | Used for health checks only |
| Auto-start Whisper | off | Run the start command on plugin load |
| Whisper start command | β | e.g. whisper-server --model ~/.whisper-models/ggml-base.en.bin |
Audio Conversion
| Setting | Default | Description |
|---|---|---|
| ffmpeg path | (auto-detect) | Leave empty to auto-detect. Required for m4a, mp4, webm, aac |
LLM Server
| Setting | Default | Description |
|---|---|---|
| LLM URL | http://127.0.0.1:11434 | Base URL of any OpenAI-compatible server |
| Model name | β | Model ID (e.g. llama3, gpt-4o, mistral) |
| API key | β | Bearer token. Leave empty for local servers |
| Auto-start LLM | off | Run start command on plugin load |
| LLM start command | β | e.g. ollama serve or vmlx-serve serve /path/to/model --port 8000 |
Prompt
| Setting | Default | Description |
|---|---|---|
| System prompt | (built-in) | Editable. Must instruct the LLM to return JSON with the required fields |
| Speaker hint | β | Injected as context into every request |
Output
| Setting | Default | Description |
|---|---|---|
| Meetings folder | Meetings | Vault-relative folder where notes are saved |
| Include raw transcript | on | Append collapsible full transcript to the note |
Output Format
Each meeting note is saved as YYYY-MM-DD Title.md with:
---
tags:
- meeting
- [content tags from LLM]
created: 2026-04-20
type: meeting-note
note_type: general
participants:
- Alice
- Bob
duration_minutes: 45
audio_file: "recording.m4a"
audio_transcribed: true
---
# Quarterly Planning Session
> [!summary]
> Two-sentence executive summary.
## Discussion
### Topic One
Flowing narrativeβ¦
### Topic Two
β¦
## Action Items
- [ ] Task description [Alice] [by 2026-04-27]
## Decisions
- Decided to adopt new framework by Q3.
---
## Raw Transcript
<details>
<summary>Expand raw transcript</summary>
Full whisper outputβ¦
</details>
type: meeting-noteenables Dataview queries:FROM "Meetings" WHERE type = "meeting-note"- [ ]action items surface in the Tasks plugin<details>keeps the note clean while preserving the full searchable transcript
Troubleshooting
whisper-cli not found
β Run brew install whisper-cpp or set the path explicitly in settings.
ffmpeg not found
β Run brew install ffmpeg or set the ffmpeg path in settings.
LLM server offline β Start your server manually, or set a start command in settings and enable Auto-start.
"model name not configured" β Set the model name in Settings β LLM Server.
m4a transcription fails β Ensure ffmpeg is installed. The plugin auto-converts m4a to WAV before passing to whisper.
LLM returns malformed JSON β The plugin falls back gracefully β the raw response appears in the Discussion field. Try a larger/better model or adjust the system prompt.
Transcription takes too long
β Use a smaller whisper model (ggml-tiny.en or ggml-base.en). The medium and large models are much slower.
Development
git clone https://github.com/Zhiy-ox/Local_Voice_Transcriber.git
cd Local_Voice_Transcriber
npm install
npm run dev # watch mode
npm run build # production build
Copy main.js, manifest.json, styles.css to your vault's plugin folder to test.
License
MIT Β© Zhiyu Xu
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.