Skip to content

madAsket/empy-recorder

Repository files navigation

Empy Recorder

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.

Features

  • 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

Audio capture

  • Microphone: getUserMedia with Web Audio routing
  • System audio: getDisplayMedia + electron-audio-loopback
  • Recording: ChannelMergerNode -> MediaRecorder (Opus in WebM)

Requirements

  • 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

Quick start

  1. Install deps: npm install
  2. Create a local .env (or .env.prod for 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)
  3. Run: npm run start

Data layout

DATA_DIR/
  recordings/
    YYYY-MM-DD/
      SESSION_ID/
        stereo.webm
        mic.flac
        system.flac
        transcript.json

Scripts

  • npm run start - dev app (Vite + Electron Forge)
  • npm run lint - TypeScript typecheck
  • npm run package - package app
  • npm run make - build installers
  • npm run build:aec - build aec-wasm (Rust + wasm-pack)

Architecture

  • src/renderer - React UI, capture pipeline, optional AEC3 worklet
  • src/preload.ts - IPC bridge for renderer <-> main
  • src/main - session storage, ffmpeg split, Groq transcription, file I/O
  • packages/webrtcaec3 - vendored WebRTC AEC3 wasm assets
  • aec-wasm - placeholder Rust AEC module (not wired into main pipeline)

Notes

  • System audio capture uses getDisplayMedia plus electron-audio-loopback.
  • Recordings larger than 100 MB trigger an error to avoid slow transcriptions.

Docs

  • docs/init.md - dev spec and JSON format
  • docs/feature:denoising.md - echo reduction notes
  • docs/features:webrtcaec3.md - AEC3 integration details
  • docs/feature:coreaudio.md - CoreAudio loopback research

License

MIT

About

OpenSource audio recoder for macOS on Electron & Whisper AI. Captures mic and system sound and makes transcript.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors