Record calls, diarize speakers with NVIDIA NeMo, transcribe with NVIDIA Parakeet, and summarize with any OpenAI-compatible LLM.
Requires Python 3.13. Recording uses PipeWire on Linux and WASAPI loopback on Windows.
# From source (clone or local copy)
uv tool install .
# From GitLab directly (no clone needed)
uv tool install git+https://gitlab.com/dmmop/call2notes.git
# Run without installing (ephemeral)
uvx call2notesSee docs/troubleshooting.md if installation fails.
# 1. Create config (prompts for API keys)
call2notes init
# 2. Run the full pipeline
call2notes run --profile work-daily
# 3. Name speakers collected during transcription
call2notes speakers collect <data-dir>/work-daily/processed/<recording>/
call2notes speakers enroll --profile work-dailyAfter enrolling, enable identify_speakers = true in your profile to automatically name known speakers in future transcriptions.
The CLI reads ~/.config/call2notes/config.toml on Linux or %APPDATA%/call2notes/config.toml on Windows by default. Minimal example:
[default]
openai_api_key = "sk-..."
openai_model = "gpt-4o-mini"
[profiles.work-daily]
name = "daily"
identify_speakers = truePrecedence: CLI flags > environment variables > profile > [default] > built-in defaults.
Call2Notes includes prompt templates for different kinds of recordings. Choose one per profile with summary_prompt, or select it in the GUI before processing.
| Template | Use it for |
|---|---|
default |
Standard meetings: attendees, summary, key points, decisions, open questions, action items and next steps. Best default for work calls. |
brainstorm |
Brainstorming sessions where capturing all ideas matters more than filtering them. Groups ideas, connections, selected options and follow-up actions. |
chat |
Informal conversations, catch-ups, planning chats, emotional support, debates or mixed personal conversations. Adapts sections to the conversation type. |
memo |
Solo voice notes or quick personal memos. Extracts themes, pending tasks, questions, related people/projects/dates and personal reflections. |
support |
Technical support or debugging sessions. Focuses on problem, environment, diagnosis, root cause, applied solution, workarounds and follow-up. |
Example:
[profiles.support]
summary_prompt = "~/call2notes-prompts/support.md"Advanced options
| Option | Description |
|---|---|
device |
auto (CUDA if available), cpu, or cuda |
summary_template |
Path template — variables: {name}, {slug}, {date}, {time}, {datetime}, {yyyy}, {mm}, {dd}, {yyyy-mm-dd} |
no_mic |
Record system audio only |
CALL2NOTES_MIC_SOURCE |
Pin a specific mic source; on Windows use default or a device-name substring |
--data-dir |
Override data directory via call2notes init --data-dir <path> |
Each profile gets isolated raw/ and processed/ dirs under data_dir/<profile>/. raw_person/ and embeddings.json are shared at the data_dir root.
See docs/configuration.md for the full reference.
<data-dir>/
├── raw_person/David/seg_*.wav ← speaker samples (shared)
├── embeddings.json ← speaker embeddings (shared)
└── <profile>/
├── raw/<id>.wav
└── processed/<id>/
├── transcript.txt
├── summary.md
└── SPEAKER_*/seg_*.wav
- Linux:
~/.local/share/call2notes/ - Windows:
%LOCALAPPDATA%/call2notes/(e.g.C:\Users\<you>\AppData\Local\call2notes\)
| Command | What it does |
|---|---|
call2notes run |
Record → transcribe → summarize |
call2notes doctor |
Diagnose config, paths, device |
call2notes clean |
Remove old artifacts (WAVs, segments) |
call2notes speakers collect <dir> |
Assign names to diarized speakers |
call2notes speakers enroll |
Build shared speaker embeddings |
call2notes clean --dry-run # preview
call2notes clean --keep-last 10 # keep 10 most recent raw WAVs
call2notes clean --segments-only # remove segments, keep WAVs
call2notes clean --keep-last 0 # remove all raw + segmentsTranscripts and summaries are never removed.
call2notes transcribe <raw.wav> --profile <name>
call2notes summarize <transcript.txt> --recording-id <id> --profile <name>