Electron + React desktop app that captures microphone + system audio, splits channels, and transcribes both sides with Groq Whisper into a diarized JSON.
Open-source recorder you can extend to build your own note-taker implementation.
- Stereo capture (mic = left, system = right) via MediaRecorder (WebM/Opus)
- Stereo split to mono FLAC (16 kHz) using ffmpeg
- Dual-channel transcription with Groq Whisper and merged
speakers/utterances - Session management: open folder, download transcript, cancel and delete
- Optional basic echo reduction via a WebRTC AEC3 AudioWorklet
- Recordings stored under
DATA_DIR/recordings/YYYY-MM-DD/SESSION_ID/ - 100 MB safety limit per recording to avoid long transcriptions
- Microphone:
getUserMediawith Web Audio routing - System audio:
getDisplayMedia+electron-audio-loopback - Recording:
ChannelMergerNode->MediaRecorder(Opus in WebM)
- Node.js >= 20.9
- macOS 12.3+ or Windows 10+ (target platforms)
- Microphone + system audio permissions
- macOS: Screen Recording + Microphone access in System Settings
- Groq API key for transcription
- Install deps:
npm install - Create a local
.env(or.env.prodfor packaging):GROQ_API_KEY=...(required)WHISPER_MODEL=whisper-large-v3(optional)DATA_DIR=.Recordings(optional, overrides data root)FORCE_DEV_DATA_DIR=true(optional, keep data inside project root)
- Run:
npm run start
DATA_DIR/
recordings/
YYYY-MM-DD/
SESSION_ID/
stereo.webm
mic.flac
system.flac
transcript.json
npm run start- dev app (Vite + Electron Forge)npm run lint- TypeScript typechecknpm run package- package appnpm run make- build installersnpm run build:aec- buildaec-wasm(Rust + wasm-pack)
src/renderer- React UI, capture pipeline, optional AEC3 workletsrc/preload.ts- IPC bridge for renderer <-> mainsrc/main- session storage, ffmpeg split, Groq transcription, file I/Opackages/webrtcaec3- vendored WebRTC AEC3 wasm assetsaec-wasm- placeholder Rust AEC module (not wired into main pipeline)
- System audio capture uses
getDisplayMediapluselectron-audio-loopback. - Recordings larger than 100 MB trigger an error to avoid slow transcriptions.
docs/init.md- dev spec and JSON formatdocs/feature:denoising.md- echo reduction notesdocs/features:webrtcaec3.md- AEC3 integration detailsdocs/feature:coreaudio.md- CoreAudio loopback research
MIT