millet
CI
PyPI
PyPI Downloads
Millet은 회의 녹취, 요약 및 PDF 출력 도구입니다. 이 이름은 오스만 제국의 *밀레트 시스템(millet system)*에서 따왔습니다. 밀레트는 1493년 법적 공동 자치 체계를 의미하며, 이를 통해 두 명의 스페인 추방 세파르디 유대인 형제가 이스탄불 최초의 인쇄소를 설립할 수 있게 된 배경이 됩니다. 이름의 기원이 된 밀레트처럼, 이 도구는 자체 규칙 하에, 사용자의 장치 내에서 더 광범위한 vezir 생태계 안에서 작동합니다.
과거에는 meetscribe로 알려져 있었습니다. PyPI 배포 이름은 millet-pipeline입니다 (PyPI의 bare millet 슬롯은 관련 없는 비활성 2021년 패키지가 차지하고 있습니다). 이름 변경 세부 정보 및 전체 릴리스 기록은 CHANGELOG.md를 참조하십시오.
화자 분리(speaker diarization)가 포함된 회의 녹취, AI 생성 요약, 그리고 전문적인 PDF 출력을 제공합니다.
모든 회의 앱에서 이중 채널 오디오(사용자 마이크 + 시스템 오디오)를 기록하고 WhisperX + pyannote-audio를 사용하여 화자 분리된 녹취록을 생성합니다. 로컬 모델로 완전히 오프라인에서 작동하거나, 프롬프트가 안전한 격리 구역(secure enclave)을 벗어나지 않는 하드웨어 인증 Tinfoil TEE 내부에서 요약할 수 있습니다. 지원되는 모든 요약 백엔드는 개인 정보 보호를 보장합니다. 0.19.0 버전부터는 사용자의 회의 내용을 읽을 수 있는 클라우드 백엔드(Claude Max, OpenRouter, 일반 OpenAI 엔드포인트)가 제거되었습니다. 이는 TEE 모델이 EN/DE/TR에 걸쳐 정밀도 및 재현성 측면에서 Sonnet 4.6보다 측정 가능한 우위를 보였기 때문입니다 (평가 내용은 the evaluation를 참조하십시오). 이제 설정할 때 더 이상 개인 정보 보호와 품질 간의 상충 관계가 없습니다.
상태
Alpha (0.21.6). 전체 이력은 CHANGELOG.md에서 확인할 수 있습니다.
최근 주요 업데이트:
0.21.6 -- TEE 기본값이 deepseek-v4-1-flash로 이동했습니다 (Tinfoil이 2026-10-09에 glm-5-3-flash를 사용 중단). 형제 폴백(sibling fallback)은 이제 glm-5-3입니다. DeepSeek은 TEE 평가에서 준우승을 차지했으며, 화면 녹화 기능을 담당하기 전에 비전 엔드포인트가 재검증되었습니다.
0.20.1 -- 기본 백엔드의 SDK(tinfoil)는 선택적 추가 기능이 아니라 기본 종속성입니다. 이제 단순하게 pip install millet-pipeline만으로도 자체 기본 경로에서 요약할 수 있습니다.
0.20.0 -- 비전 요약: 화면 녹화의 프레임 큐(cue frames)가 스크립트와 함께 모델로 전송됩니다.
0.19.0 -- 클라우드 요약 백엔드가 제거되었습니다. 남아있는 모든 백엔드는 개인용입니다. PDF에는 일반적인 CONFIDENTIAL 워터마크 대신 조용한 증명(quiet attestation) 바닥글이 추가되었습니다.
0.18.1 -- 벤더가 glm-5-2를 단종함에 따라 TEE 기본값이 glm-5-3-flash로 이동했으며, 고갈된 엔클레이브를 위한 형제 모델 재시도가 이루어졌습니다.
평가 (Evaluations)
실제로 얼마나 지원하는지에 따라 의도적으로 라벨링한 두 가지 작성 글:
| 질문 | 증거 | 결과 |
|---|
| in-TEE 모델이 기본 요약기로서 Sonnet 4.6을 대체할 수 있는가? | 평가 (Evaluation) -- 회의 10회 (영어/독일어/태국어), 블라인드 재라벨링, 독립적인 in-TEE 심사위원 2명, 판결 80건, 기계적 16개 항목 점검 바 | 예. glm-5-3-flash는 모든 언어에서 두 심사위원 모두에게 정밀도(precision)와 재현율(recall) 모두에서 Sonnet을 능가했습니다. 16/16. 준우승인 deepseek-v4-1-flash (Tinfoil이 GLM-5.3 Flash를 사용 중단한 후 0.21.6부터 기본값)은 정밀도에서 일치했으나 재현율이 약 4 pp 낮았습니다. 15/16. 전체 평가 |
| 모델에게 화면 표면 결함을 보여주는 것이 스크립트만으로는 할 수 없는가? | 사례 연구 (Case study), n = 1 -- 세션 1회, 텍스트 전용 + 비전 실행 3회 | 텍스트 전용 실행에서는 나타나지 않았던 화면 전용 결함이 나타났으며; 5개 중 2개가 3/3회에서 재현되었습니다. 일반적인 주장은 아닙니다. 사례 연구 |
첫 번째는 인용할 가치가 있고, 두 번째는 믿기 전에 읽어볼 가치가 있습니다.
method에 대해 평가가 밝힌 점에 주목하세요: 네 모델 모두 형식 및 언어 준수에서 10/10점을 받았으므로 구조적 지표는 동점이었고, 모든 실제 차이는 내용에 있었습니다.
모든 회의 앱과 연동
millet은 OS 레벨에서 시스템 오디오를 캡처하기 때문에 모든 음성/비디오 통화 애플리케이션에서 작동합니다:
- Zoom
- Google Meet
- Microsoft Teams
- Slack (허들 및 통화)
- Discord
- Signal (음성 및 비디오 통화)
- Telegram (음성 및 비디오 통화)
- WhatsApp (데스크톱 음성 및 비디오 통화)
- Keet (P2P 통화)
- Jitsi Meet
- Webex
- Skype
- FaceTime (브라우저를 통해)
- GoTo Meeting
- RingCentral
- Amazon Chime
- BlueJeans
시스템 스피커를 통해 오디오를 재생하는 모든 앱에서 작동합니다. 여기에는 브라우저 기반 회의와 독립형 데스크톱 클라이언트가 포함됩니다.
기능
- 듀얼 채널 오디오 캡처: PipeWire/PulseAudio + ffmpeg을 통해 마이크(왼쪽 채널)와 원격 참가자(오른쪽 채널)를 동시에 녹음합니다.
- WhisperX 전사 (transcription):
openai/whisper-large-v3-turbo를 사용한 빠른 배치 추론과 wav2vec2 정렬을 통한 단어별 타임스탬프를 제공합니다.
- 다국어 지원: 언어를 자동 감지하거나 수동으로 설정할 수 있으며, 영어, 독일어, 터키어, 프랑스어, 스페인어, 파르시(Farsi) 및 90개 이상의 다른 언어를 지원합니다.
- 화자 분리 (Speaker diarization): pyannote-audio가 누가 무엇을 말했는지 식별하며, 듀얼 채널 신호를 통해 자동으로 YOU/REMOTE 레이블링을 합니다.
- AI 회의 요약, 기본적으로 비공개: 하드웨어 인증 Tinfoil TEE (
deepseek-v4-1-flash, 기본값) 또는 완전히 로컬인 Ollama 모델을 사용합니다.
두 기능 모두 비공개(private)이므로 tinfoil -> ollama 폴백 체인(fallback chain)은 품질을 저하시킬 수 있지만 기밀성은 절대 저하시키지 않습니다.
- 화면 기반 요약 (Summarize from the screen): 내레이션된 화면 녹화의 경우, 스크립트 타임스탬프에서 샘플링된 단서 프레임(cue frames)이 스크립트와 함께 모델로 전송되어, 반복 계획(iteration plan)이 단순히 내레이터가 말한 내용뿐만 아니라 시각적으로 잘못된 부분도 보고할 수 있습니다 (
--summary-template iteration-plan --summary-frames).
- PDF에 증명서 푸터 추가 (Attestation footer on the PDF): TEE 기반 요약에는 백엔드와 모델을 기록하는 '하드웨어 인증된 TEE에서 요약됨(Summarized in a hardware-attested TEE)'이라는 은밀한 푸터가 포함됩니다.
- 음성 지문 화자 인식 (Voiceprint speaker recognition): 음성 임베딩 프로필(voice embedding profiles)을 사용하여 회의 전반에 걸쳐 화자를 자동으로 식별합니다.
- 회의 동기화 (Meeting sync): 스크립트와 요약을 설정 가능한 일정에 따라 모든 Git 저장소로 푸시합니다.
- 전문적인 PDF 출력 (Professional PDF output): 깔끔하게 페이지 번호가 매겨진 PDF 형식으로 요약본과 전체 스크립트를 제공하며, 완전한 유니코드 지원(DejaVu Sans) 및 파르시어(Farsi)를 위한 RTL을 지원합니다.
- 다중 출력 형식 (Multiple output formats):
.txt, .srt, .json, .summary.md, .pdf 형식을 지원합니다.
- 구조화된 YAML 프론트매터 (Structured YAML frontmatter): 모든
.summary.md 파일에는 타입이 지정된 스키마(실행 항목, 결정 사항, 참가자, 주제, 언어, 지속 시간)와 일치하는 .frontmatter.json 사이드카(sidecar)가 포함되어 있어, vezir와 같은 인덱서 및 다운스트림 도구에 바로 사용될 수 있습니다.
- GTK3 GUI 위젯 (GTK3 GUI widget): 녹화/정지 버튼, 타이머, 결과에 한 번의 클릭으로 접근할 수 있는 작은 항상 위에 표시되는 창(always-on-top window)입니다.
- CLI:
millet record, millet transcribe, millet run, millet gui, millet label, millet enroll, millet sync, millet ingest, millet download, millet translate, millet devices, millet check 명령어를 제공합니다.
- 세션별 폴더 (Per-session folders): 각 녹화본은 자체적으로 정리된 디렉터리를 갖습니다.
- 오프라인 우선(Offline-first): 초기 모델 다운로드 후에는 인터넷 연결 없이 스크립트 작성, 화자 분리(diarization), PDF 출력이 가능하며, 요약 기능은 TEE (네트워크 필요, 비공개) 또는 로컬 Ollama 모델 (네트워크 불필요) 중 하나가 필요합니다.
빠른 시작
요구사항
millet은 두 가지 구성으로 실행됩니다:
Linux 데스크톱 (전체 파이프라인: 녹음 + 전사(transcribe) + 레이블링(label) + 동기화(sync))
- PipeWire 또는 PulseAudio를 지원하는 Linux (시스템 오디오 캡처용)
- CUDA가 있는 NVIDIA GPU (8 GB 이상 VRAM 권장; CPU 모드 사용 가능하나 느림)
- Python 3.10+, ffmpeg
- 화자 분리(diarization) 모델을 위한 HuggingFace 토큰 (무료)
- 로컬 AI 요약을 위한 Ollama (선택 사항)
macOS Apple Silicon (캡처 후 파이프라인: 전사 + 레이블링 + 동기화)
- macOS에서 실행되는 M1 / M2 / M3 Mac
- Python 3.10+, ffmpeg
- ASR을 위해 MLX Whisper를 자동 선택하려면
pip install 'millet-pipeline[mlx]' 사용
- HuggingFace 토큰, Ollama는 위와 같음
- 참고:
millet record / millet run (오디오 캡처)은 Linux가 필요합니다. Mac에서는 다른 곳에서 캡처된 오디오를 millet transcribe <file.wav>로 입력하거나, vezir를 사용하여 Mac을 서버로 실행하고 Linux/Android 경량 클라이언트로 녹음을 제공해야 합니다.
전체 하드웨어/소프트웨어 세부 정보는 REQUIREMENTS.md를 참조하세요.
설치
1. 시스템 종속성
sudo apt install ffmpeg pulseaudio-utils
...
2. millet 설치
pip install millet-pipeline
...
이렇게 하면 millet 명령이 PATH에 생성됩니다 (이전의 meet 명령은 사용 중단된 별칭으로 유지됩니다).
기본 TEE 백엔드 뒤에 있는 tinfoil SDK는 0.20.1 버전부터 기반 종속성입니다 — 기억할 필요가 없습니다. 엔클레이브에서 요약하려면 TINFOIL_API_KEY를 설정하거나, --summary-backend ollama와 아무 키 없이 완전히 로컬로 실행하세요. (millet-pipeline[tee]는 여전히 빈 no-op extra로 해결되므로 이전 설치 명령이 깨지지 않습니다.)
3. HuggingFace 토큰 (화자 분리를 위해)
- https://huggingface.co에서 무료 계정 생성
- https://huggingface.co/pyannote/speaker-diarization-community-1에서 모델 약관 동의
- https://huggingface.co/settings/tokens에서 읽기 토큰(read token) 생성
- 환경 변수 설정:
export HF_TOKEN=hf_your_token_here
echo 'export HF_TOKEN=hf_your_token_here' >> ~/.bashrc
4. Ollama (선택 사항, AI 요약을 위한 도구)
https://ollama.com에서 설치한 후, 기본 요약 모델을 가져옵니다(pull):
5. 설정 확인 (Verify setup)
사용법 (Usage)
오디오 장치 확인 (Check audio devices)
회의 녹음하기 (Record a meeting)
회의 시작 전이나 도중에 녹음을 시작합니다:
회의가 끝나면 Ctrl+C를 누릅니다. 10초간의 드레인 버퍼(drain buffer)는 모든 오디오가 캡처되도록 보장합니다. 녹음 파일은 ~/meet-recordings/에 저장됩니다.
옵션:
-o /path -- 다른 위치에 녹음 파일을 저장
--virtual-sink -- 격리된 가상 싱크(virtual sink)를 생성합니다 (알림 소리가 캡처되는 것을 방지).
--mic <source> -- 마이크 소스를 지정합니다 (millet devices를 사용하여 이름 확인).
--monitor <source> -- 모니터 소스를 지정합니다.
녹음 파일 전사(Transcribe)하기
millet transcribe ~/meet-recordings/meeting-20260312-140000/meeting-20260312-140000.wav