TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
Apple Silicon 전용, 기기 내 회의 녹취·화자 구분·실시간 처리, 오픈소스, 클라우드 없음
Private, on-device meeting transcription for Apple Silicon. Dual-stream mic + system audio, on-device speaker diarization, chunked pipeline at ~62x real-time end-to-end. Open-source, zero cloud.
생산성Swift · ShellGitHub @fmasi온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Parley — private, on-device meeting transcription for Apple Silicon. Dual-stream mic + system audio, speaker diarization, 146x real-time. Open-source, zero cloud.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Private, on-device meeting transcription for Apple Silicon. Captures your microphone and the
far side of the call (Zoom, Teams, Meet, Slack, FaceTime), and turns them into speaker-attributed
transcripts that never leave your Mac. 100% open-source, open-model, airgapped.
🤝 Sister project: mailrag — private, self-hosted email RAG. Two halves of one idea: a private, open context stack your AI agents can draw on.README 전문 보기 ↗Private, on-device meeting transcription for Apple Silicon. Captures your microphone and the far side of the call (Zoom, Teams, Meet, Slack, FaceTime), and turns them into speaker-attributed transcripts that never leave your Mac. 100% open-source, open-model, airgapped.
🤝 Sister project: mailrag — private, self-hosted email RAG. Two halves of one idea: a private, open context stack your AI agents can draw on.
What it buys you. Meeting transcription that's private by construction — every byte stays on your Mac, on open models, with nothing phoning home. It transcribes and labels speakers chunk by chunk in the background as you record, so when you stop, only the last chunk is left: a 3-hour meeting is ready about as fast as a 30-minute one. On an M5 Pro that runs at ~140× real-time for transcription and ~110× for diarization on the Neural Engine and GPU. It separates "you" from "them" with dual-stream capture and survives a crash mid-recording with zero data loss.
The first time I used cloud AI for meeting notes it felt like a cheat code — until I thought about what I was actually doing: uploading the raw audio of every meeting to someone else's servers. For anything confidential, that's a non-starter.
So I built the opposite. parley runs entirely on your Mac, on open models, with nothing phoning home — no account, no upload, no vendor to trust.
Then the real point clicked. These transcripts aren't just notes, they're context. A faithful, private record of what was actually said is exactly what an AI agent needs to be useful about your work — kept on-device, so you get total recall without renting your memory to anyone. parley is one private context source, for calls and meetings. mailrag is another, for email — different domain, different machinery (vector-DB retrieval). They don't talk to each other; my agents know about both and reach for whatever fits. The point was never a single app — it's a private, open stack of context I own.
Meetings are sensitive. Most of what gets said in them shouldn't be uploaded to anyone's servers, and for confidential work that rules out every cloud notetaker. So I built the opposite, around a few hard requirements:
Put together, that's a private, verifiable record of what was actually said, that you and your agents can rely on. Parley covers meetings, mailrag covers email. By humans. For agents.
echo).git clone https://github.com/fmasi/parley.git
cd parley
bash package_app.sh --release --install # builds the Swift targets (optimised), assembles the .app +
# XPC service, ad-hoc signs everything, installs to /Applications
open /Applications/Parley.app
On first launch, macOS asks for Screen & System Audio Recording permission. The default engine downloads its model (~500 MB) on first use and caches it after that.
Requirements: macOS 15+ (Sequoia), Apple Silicon (M1–M5); Xcode to build from source. (The Apple SpeechAnalyzer engine additionally requires macOS 26+.)
The interesting engineering isn't the transcription call; it's everything around keeping the record faithful and private.
metadata.echo_clusters).
The rename dialog and the completion notice say it in words: which speaker row looks like the far end
through your loudspeakers, how many lines were marked, and that headphones avoid it..cpuAndNeuralEngine); pyannote/WeSpeaker/VBx diarization runs through CoreML's .all,
spread across the Neural Engine and GPU.For the full design — the Core Audio tap, capture reliability and healing, the recording lifecycle, the pipeline — see ARCHITECTURE.md.
Two ASR engines, switchable in Settings: FluidAudio (Parakeet) — ~500 MB model, 25 European languages, macOS 15+ — and Apple SpeechAnalyzer — system languages, downloaded per language on first use, macOS 26+. Engine choice is measured, not assumed: FluidAudio leads on European languages, Apple SpeechAnalyzer is the reliable path for Japanese, Korean and Chinese. FluidAudio also adds inverse text normalization ("two hundred" → "200") and per-segment confidence scores.
Measured on an M5 Pro (release build) with the bundled harness (tools/engine-benchmark), on a
4-minute AMI clip:
| Stage | Engine | Real-time factor |
|---|---|---|
| Transcription | FluidAudio (Parakeet, ANE) | ~142× |
| Transcription | WhisperKit (large-v3-turbo), for contrast | ~2.5× |
| Speaker diarization | pyannote + WeSpeaker + VBx | ~111× |
| Full pipeline | transcription + diarization | ~62× |
Because chunks are processed in the background during the meeting, the number you actually feel is the last row: at ~62× real-time end-to-end, the final chunk (≤30 min by default; the chunk length is configurable) finishes in well under a minute after you stop, whatever the meeting's length.
Apple SpeechAnalyzer isn't in this table — it needs a per-language model and errored on this clip in this run, so it should be benchmarked separately per system language.
Transcripts are written as JSON, with SRT or TXT alongside:
{
"metadata": { "language": "multilingual", "diarization": true, "dual_stream": true },
"segments": [
{ "start": 1.6, "end": 8.72, "speaker": "Speaker 1", "source": "local",
"text": "On March 15, 2026, we held a meeting with 342 participants.", "confidence": 0.963 },
{ "start": 49.2, "end": 56.08, "speaker": "Speaker 2", "source": "remote",
"text": "Le 14 juillet 2026, nous avons organisé une conférence.", "confidence": 0.941 }
]
}
source is local (your mic) or remote (the far side) — the dual-stream signal that makes the
record trustworthy.
# Transcribe audio files (system + optional mic stream)
"$(swift build --show-bin-path)/Parley" transcribe -i system.wav [-i mic.wav] [-f srt] [--engine fluid_audio]
# Rename detected speakers interactively
"$(swift build --show-bin-path)/Parley" rename -i transcript.json
# Summarize a transcript with a local/remote LLM
"$(swift build --show-bin-path)/Parley" summarize -i transcript.json
# Benchmark engines (speed + WER) across languages
swift run --package-path tools/engine-benchmark EngineBenchmark audio.wav --engines fluid,speech
TranscriberApp/ SwiftUI menu-bar app (MenuBarExtra + Settings), XPC client, windows and dialogs
TranscriberCore/ recording lifecycle, chunk processing, engines, diarization, echo detection, summaries, transcript I/O
AudioCaptureHelper/ XPC audio-capture service (Core Audio tap or ScreenCaptureKit, dual-stream)
AudioCaptureProtocol/ shared @objc XPC protocol
SwiftTests/ 2775 tests across 299 suites
tools/engine-benchmark/ WER + speed benchmark harness
docs/ architecture, pipeline, parameters, gotchas
CI runs once per PR, when it's marked ready, so run the checks on your machine first:
lefthook install # once per clone: pre-commit secrets/shell/workflow checks, pre-push `just ci`
just ci # exactly what CI runs (workflow lint, the serial Swift suite, the red-first gate), plus the app build
/ci-review # in Claude Code: the same review rubric CI uses (.github/claude-review-prompt.md)
gh pr create --draft # CI skips drafts
gh pr ready # runs CI and the Claude review once
A PR merges when test, red-first and review / review-gate are green; a Critical review
finding keeps the gate red until a re-review passes. The full rules for contributors and coding
agents are in AGENTS.md.
parley runs on open models that download on first use — nothing is sent to the cloud:
| Component | Model | License |
|---|---|---|
| Speech recognition | NVIDIA Parakeet TDT 0.6B (CoreML via FluidInference) | CC-BY-4.0 |
| Speaker diarization | pyannote segmentation + WeSpeaker embeddings | CC-BY-4.0 |
| Voice activity detection | Silero VAD | MIT |
| Engine SDK | FluidAudio | Apache-2.0 |
| Apple engine (optional) | SpeechAnalyzer — on-device, macOS 26+ | OS-provided |
All model weights are CC-BY-4.0 or MIT — free for commercial and non-commercial use with attribution.
I build private, on-device context tools for AI agents — software that gives an agent (and me) total recall over my own work without sending anything to the cloud. parley covers calls and meetings; mailrag covers email.
I care about on-device ML, audio, and systems that stay correct when things crash. If that's useful to you, or you're hiring, I'd like to hear from you.
Open source under the GNU AGPL-3.0 — see LICENSE and NOTICE.
Copyright © 2026 Frédéric Masi.
If you build on this code, the AGPL requires your derivative — including any networked service — to be released under the same license. Dual licensing: as the sole copyright holder, I also offer parley under separate commercial terms (proprietary binaries, App Store). For a commercial license, reach out via LinkedIn.