AI-Powered Voice Notes for Obsidian
Transform your voice into perfectly formatted, context-aware notes with automatic transcription in 100+ languages, intelligent linking, and RAG-enhanced refinement.
- High-Quality Audio Capture: Professional-grade recording with automatic silence detection
- Visual Feedback: Real-time waveform visualization during recording
- Flexible Controls: Pause, resume, and stop with keyboard shortcuts
- Audio Management: Browse, playback, and re-process saved recordings
- 100+ Languages Supported: Automatic language detection across all major languages
- Automatic Translation: Optional translation to English for multilingual workflows
- Flexible Backend: Choose between cloud-based OpenAI API or local whisper.cpp for offline transcription
- Zero Configuration: No language selection needed—just speak naturally
- High Accuracy: Powered by OpenAI's Whisper (cloud or local)
- Flexible Backend: Choose between OpenAI GPT-4 or local LLMs (Ollama, llama.cpp, LM Studio)
- Intelligent Enhancement: Automatically improves clarity and readability
- Context-Aware: Considers vault content when refining transcriptions
- Configurable: Choose refinement strength and style
- Preserves Intent: Maintains your original meaning while improving structure
- 100% Offline Option: Use local whisper.cpp + local Ollama for completely offline workflow
- Automatic Note Detection: Finds and links mentions of existing notes
- Intelligent Matching: Fuzzy matching handles variations and plurals
- Zero Friction: Links added automatically during refinement
- Vault Integration: Seamlessly connects voice notes to your knowledge base
- Semantic Search: Vector-based retrieval of relevant vault content
- Dynamic Context: Automatically includes related notes during refinement
- Configurable Retrieval: Adjust chunk size, overlap, and top-K results
- Efficient Caching: Fast lookups with automatic embedding generation
- External Context: Connect to MCP servers for additional knowledge sources
- Flexible Integration: Support for multiple concurrent MCP connections
- Stdio Transport: Compatible with standard MCP server implementations
- Optional Enhancement: Graceful degradation if unavailable
- Insert Anywhere: Current note, new note, or specific location
- Smart Defaults: Configurable default save behavior
- Metadata Preservation: Keep audio files linked to transcriptions
- Organized Storage: Automatic organization in configurable folders
- Download the latest release from GitHub Releases
- Extract the files to your Obsidian vault's plugin folder:
VaultFolder/.obsidian/plugins/zeddal/ - Enable the plugin in Obsidian Settings → Community Plugins
- Configure your OpenAI API key (see Configuration below)
Once approved by Obsidian:
- Open Settings → Community Plugins
- Search for "Zeddal"
- Click Install → Enable
- Configure your OpenAI API key
- Open Settings → Zeddal
- Enter your OpenAI API key
- (Optional) Customize models and settings
- Click the microphone icon in the ribbon (left sidebar)
- Allow microphone access when prompted
- Speak naturally in any supported language
- Click "Stop Recording" when finished
- Review the transcription and refinement
- Choose where to save your note
-
Install whisper.cpp:
# macOS (Homebrew) brew install whisper-cpp # Or build from source git clone https://github.com/ggerganov/whisper.cpp cd whisper.cpp make
-
Download a GGML model:
# Download base English model (~150MB) bash models/download-ggml-model.sh base.en # Or download larger model for better accuracy bash models/download-ggml-model.sh medium.en
-
Configure in Zeddal Settings:
- Settings → Zeddal → Whisper Backend Configuration
- Transcription Backend: Select "Local whisper.cpp (offline)"
- Whisper.cpp Binary Path:
/usr/local/bin/whisper(or your build path) - Whisper Model Path:
/path/to/ggml-base.en.bin - Click "Test Configuration" to verify setup
Benefits of Local Whisper:
- ✅ No API costs for transcription
- ✅ Works completely offline
- ✅ Faster for small recordings
- ✅ Private - audio never leaves your computer
⚠️ Requires initial setup and model download⚠️ GPT-4 refinement still requires internet (optional - can use local LLM)
100% Offline Workflow: Combine local whisper.cpp + local Ollama for completely free, private transcription and refinement!
-
Install Ollama:
# macOS brew install ollama # Linux curl -fsSL https://ollama.com/install.sh | sh # Or visit https://ollama.com for other platforms
-
Pull a model:
# Fast, high quality (recommended) ollama pull llama3.2 # Your custom model ollama pull gpt-oss:20b # Other good options ollama pull mistral # 7B balanced model ollama pull qwen2.5:14b # Excellent for notes
-
Verify Ollama is running:
ollama list # Shows installed models -
Configure in Zeddal Settings:
- Settings → Zeddal → Local LLM Configuration
- Enable Local LLM: Toggle ON
- LLM Provider: Select "Ollama (Recommended)"
- API Base URL:
http://localhost:11434(default) - Model Name:
gpt-oss:20b(or your preferred model) - Click "Test Connection" to verify
Benefits of Local LLM:
- ✅ Zero API costs for refinement
- ✅ Works completely offline
- ✅ Private - text never leaves your computer
- ✅ Use larger models (20B+) without cost concerns
- ✅ Pairs with local whisper for 100% offline workflow
⚠️ Slower than GPT-4 (depends on hardware)⚠️ Quality varies by model size
Recommended Models for Notes:
- llama3.2 (3B) - Fast, good quality
- gpt-oss:20b - Your current model, high quality
- mistral (7B) - Balanced speed/quality
- qwen2.5:14b - Excellent for structured notes
Supported Providers:
- Ollama (http://localhost:11434) ← Recommended
- llama.cpp server
- LM Studio
- OpenAI-compatible APIs
- Settings → Zeddal → RAG Settings
- Enable "Use RAG Context"
- Adjust retrieval parameters if needed
- Your vault content will now inform AI refinements
- Settings → Zeddal → MCP Settings
- Enable "Use MCP Context"
- Add server configurations:
{ "id": "my-server", "name": "My Knowledge Base", "enabled": true, "command": "node", "args": ["/path/to/server.js"], "env": {} }
| Setting | Description | Default |
|---|---|---|
| OpenAI API Key | Your OpenAI API key (required for cloud services) | - |
| GPT Model | Model for refinement | gpt-4-turbo |
| Whisper Model | Transcription model (cloud only) | whisper-1 |
| Embedding Model | For RAG context | text-embedding-3-small |
| Setting | Description | Default |
|---|---|---|
| Transcription Backend | Cloud (OpenAI API) or Local (whisper.cpp) | openai |
| Whisper.cpp Binary Path | Path to whisper.cpp executable | /usr/local/bin/whisper |
| Whisper Model Path | Path to GGML model file | - |
| Whisper Language | Language code or auto for detection |
auto |
| Setting | Description | Default |
|---|---|---|
| Enable Local LLM | Use local LLM instead of OpenAI for refinement | false |
| LLM Provider | Provider type (Ollama, llama.cpp, LM Studio, etc.) | ollama |
| API Base URL | Base URL for local LLM | http://localhost:11434 |
| Model Name | Model to use for refinement | llama3.2 |
| API Key | Optional API key (not needed for Ollama/llama.cpp) | - |
| Setting | Description | Default |
|---|---|---|
| Silence Threshold | RMS level for silence detection | 0.01 |
| Silence Duration | Auto-pause delay (ms) | 1500 |
| Recordings Path | Audio file storage location | Voice Notes/Recordings |
| Setting | Description | Default |
|---|---|---|
| Default Save Location | Where to insert notes | ask |
| Voice Notes Folder | Default folder for new notes | Voice Notes |
| Auto Refine | Enable AI refinement | true |
| Auto Context Links | Enable automatic linking | true |
| Setting | Description | Default |
|---|---|---|
| Enable RAG | Use vault context | true |
| Top K Results | Number of chunks to retrieve | 3 |
| Chunk Size | Tokens per chunk | 500 |
| Chunk Overlap | Token overlap | 50 |
| Setting | Description | Default |
|---|---|---|
| Enable MCP | Connect to MCP servers | false |
| MCP Servers | Server configurations | [] |
Zeddal supports 100+ languages with automatic detection:
Afrikaans • Arabic • Armenian • Azerbaijani • Belarusian • Bosnian • Bulgarian • Catalan • Chinese • Croatian • Czech • Danish • Dutch • English • Estonian • Finnish • French • Galician • German • Greek • Hebrew • Hindi • Hungarian • Icelandic • Indonesian • Italian • Japanese • Kannada • Kazakh • Korean • Latvian • Lithuanian • Macedonian • Malay • Marathi • Maori • Nepali • Norwegian • Persian • Polish • Portuguese • Romanian • Russian • Serbian • Slovak • Slovenian • Spanish • Swahili • Swedish • Tagalog • Tamil • Thai • Turkish • Ukrainian • Urdu • Vietnamese • Welsh
Plus 50+ additional languages and dialects including Assamese, Bengali, Gujarati, Hausa, Javanese, Khmer, Lao, Malayalam, Maltese, Mongolian, Myanmar, Pashto, Punjabi, Sanskrit, Shona, Sindhi, Sinhala, Somali, Sundanese, Tajik, Telugu, Turkmen, Uzbek, Yoruba, and more.
Translation: Optionally translate any language to English during refinement.
| Action | Default Shortcut |
|---|---|
| Start Recording | Click ribbon icon |
| Stop Recording | Click "Stop" button |
| Cancel Recording | Click "Cancel" button |
Custom shortcuts can be configured in Obsidian Settings → Hotkeys
Solution: Add your OpenAI API key in Settings → Zeddal → OpenAI API Key
Get your key at: https://platform.openai.com/api-keys
Solution: Check browser/system permissions for microphone access
- Obsidian Settings → About → Check console for errors
- System Settings → Privacy & Security → Microphone
- Try restarting Obsidian
Possible causes:
- Invalid API key
- Network connectivity issues
- Audio file too short (< 0.1 seconds)
- Audio quality too low
Solutions:
- Verify API key is correct
- Check internet connection
- Ensure adequate recording length
- Test microphone in other applications
Solution: Ensure embeddings are enabled and vault has indexable content
- Settings → Zeddal → Enable RAG
- Wait for initial vault indexing
- Check console for embedding errors
Solution: Verify MCP server configuration
- Check server command and args are correct
- Ensure server executable is accessible
- Review console for connection errors
- Test server independently
Solutions:
- Switch to local whisper.cpp for free transcription
- Disable auto-refinement and refine selectively
- Reduce RAG top-K results
- Use smaller embedding model
- Disable MCP if not needed
Possible causes:
- Binary not found or not executable
- Model file path incorrect or corrupted
- Unsupported audio format
Solutions:
- Verify whisper.cpp binary path:
which whisper # Should return path like /usr/local/bin/whisper - Test whisper.cpp directly:
/usr/local/bin/whisper -m /path/to/model.bin -f test.wav
- Check model file exists:
ls -lh /path/to/ggml-base.en.bin
- Re-download model if corrupted
- Click "Test Configuration" in settings to verify
- Check console (Cmd/Ctrl+Shift+I) for error details
- Try falling back to OpenAI API if issues persist
- Audio Processing: Recordings sent to OpenAI Whisper API (or processed locally with whisper.cpp)
- Text Refinement: Transcriptions processed by OpenAI GPT-4 (optional)
- Embeddings: Vault content embedded via OpenAI Embeddings API
- Local Storage: Audio files and metadata stored in your vault
- No Telemetry: Zeddal does not collect usage data
- Local Option: Use whisper.cpp for 100% offline transcription (no cloud processing)
Per OpenAI's data policy:
- API data is not used to train models
- Data is retained for 30 days for abuse monitoring
- Zero data retention option available for enterprise
- Use API keys with usage limits
- Review OpenAI's terms of service
- Consider self-hosted alternatives for sensitive content
- Enable MCP servers only from trusted sources
# Clone repository
git clone https://github.com/jashutch/zeddal.git
cd zeddal
# Install dependencies
npm install
# Build plugin
npm run build
# Development mode (auto-rebuild)
npm run dev# Type checking
npm run type-check
# Lint
npm run lintzeddal/
├── services/ # Core business logic
│ ├── RecorderService.ts
│ ├── WhisperService.ts
│ ├── whisper/
│ │ ├── IWhisperBackend.ts # Backend abstraction interface
│ │ ├── OpenAIWhisperBackend.ts # Cloud transcription
│ │ └── LocalWhisperBackend.ts # Local whisper.cpp
│ ├── LLMRefineService.ts
│ ├── VaultRAGService.ts
│ ├── MCPClientService.ts
│ └── ...
├── ui/ # User interface components
│ ├── RecordModal.ts
│ ├── StatusBar.ts
│ └── ...
├── utils/ # Utilities and types
│ ├── Types.ts
│ ├── Config.ts
│ └── ...
├── main.ts # Plugin entry point
└── styles.css # UI styling
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentation: Full Docs
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
- Offline transcription (local Whisper models) - v1.2.0: Use whisper.cpp for free, private, offline transcription
- Correction Learning System - v1.2.0: Learn from manual corrections, 60-70% cost reduction
- Unified Refinement Architecture - v1.2.0: Single GPT call replacing 3 separate API calls
- Custom prompt templates for refinement
- Speaker diarization for multi-person recordings
- Custom LLM provider support (Anthropic, local models)
- Audio annotation and timestamping
- Batch processing for multiple recordings
- Mobile app support (when Obsidian API allows)
- Integration with other note-taking workflows
- Voice command system for hands-free operation
- Advanced audio editing capabilities
- Collaborative transcription review
Business Source License 1.1 — no commercial or SaaS use without written permission. See LICENSE for parameters and the 2029-01-01 transition to Apache 2.0.
- OpenAI: Whisper and GPT-4 APIs
- Obsidian: Powerful knowledge base platform
- MCP: Model Context Protocol specification
- Community: Beta testers and contributors
Zeddal was created to bridge the gap between spoken thoughts and written notes, making knowledge capture as natural as conversation while leveraging the full power of AI and your existing knowledge base.
Built with ❤️ for the Obsidian community.