Skip to main content

millet-record

CI PyPI PyPI Downloads

Lightweight capture-only subset of millet (formerly meetscribe-record).

Records dual-channel meeting audio — your microphone on the left channel, system/remote audio on the right — into a single stereo WAV via PipeWire or PulseAudio + ffmpeg. Ships none of millet's transcription, diarization, summarization, or PDF dependencies; install footprint is ~30 MB instead of ~3 GB.

Full release history in CHANGELOG.md. Named after the Ottoman millet system. Part of the vezir ecosystem.

When to use which

Need Install
Just record audio (e.g., for vezir thin clients, or local archival) pip install millet-record
Record + transcribe + diarize + summarize + PDF pip install millet-pipeline (depends on millet-record)

Install

pip install millet-record

System deps (apt example):

sudo apt install ffmpeg pulseaudio-utils

CLI

millet check                   # verify prerequisites
millet devices                 # list audio sources
millet record                  # record dual-channel WAV; Ctrl+C to stop
millet archive                 # compress past WAV recordings to OGG/Opus

millet record writes to ~/meet-recordings/meeting-YYYYMMDD-HHMMSS/...wav unless -o is passed. See millet record --help for options.

When millet-pipeline is also installed, additional subcommands (transcribe, run, label, sync, gui, ...) become available under the same millet command via Click entry-points.

System-audio silence warning (0.5.1)

The system-audio monitor is resolved once, at session start. If the meeting app's output is later routed elsewhere — switching apps mid-call, plugging in headphones — that monitor goes silent while your mic keeps the stereo file growing. The remote side is lost with no process failure and nothing in the output to suggest it.

millet record now samples per-channel RMS while recording and warns inline the first time the system channel goes quiet:

⚠ System audio silent — remote participants may not be recorded
✔ System audio restored

session.json records system_ever_active and system_silent_detected, so a downstream tool can flag a recording that captured only one side. An unreadable sample counts as unknown, never as silent, so a transient ffmpeg hiccup cannot produce a false alarm.

Crash resilience (0.6.0)

Recorders run start_new_session=True-detached on purpose: if the controlling app (TUI, CLI) crashes, the recording survives — the meeting is still happening. 0.6.0 adds the bookkeeping to make that survivable in practice:

  • recording.lock in the recordings root blocks a second concurrent recording (RecordingInProgressError, PID-checked, stale locks auto-reclaimed; MEET_RECORD_LOCK=0 disables).
  • <stem>.recorder.json identifies the live recorder process (pid + owner pid + start ticks); removed on clean stop/pause.
  • <stem>.session.json is now written at recording start (status: "recording") and rewritten at stop (status: "stopped").
  • millet_record.capture.find_interrupted_sessions(root) scans a recordings dir for sessions that never finished, distinguishing in progress / orphaned recorder / interrupted; and millet_record.capture.recover_session(dir) stitches leftover chunks into the final WAV (repairing SIGKILL-damaged headers).

Legacy meet command (removed in 0.6.0)

The pre-rename meet console script and the meet_record import alias were removed in millet-record 0.6.0, after the announced two-minor-version deprecation window. Use millet / millet_record.

Architecture

millet-record exposes a stable package millet_record containing:

  • millet_record.capture — ffmpeg-backed dual-channel capture (RecordingSession, watchdog, drain buffer)
  • millet_record.audio — stereo channel reading, per-channel RMS sampling (system-silence detection), ffmpeg-based audio compression
  • millet_record.utils — formatting helpers (HH:MM:SS, file sizes)
  • millet_record.languages — language constants used by capture flow
  • millet_record.cli — millet console-script entry point

millet-pipeline depends on this package and re-uses these modules, plus its own heavy modules (transcribe, label, voiceprint, summarize, sync, pdf, gui).

macOS (Apple Silicon)

pip install millet-record on macOS 14.4+ Apple Silicon ships a bundled meet-record-mac Swift sidecar that captures via Core Audio Process Tap + AVAudioEngine — no PulseAudio, no BlackHole, no extra install. millet record uses it by default.

Note: the Swift binary itself is still named meet-record-mac for now — renaming would require macOS code-signing bundle-path changes that aren't worth doing as part of the package rename. Tracked as a follow-up; doesn't affect end users.

First run prompts for Microphone and System Audio Recording permissions via the standard macOS TCC dialogs; both are required for full dual- channel capture (mic on left, system on right). See mac/README.md for the sidecar's CLI surface, level analysis recipes, and environment variables.

On macOS Sequoia 15+, Apple removed the manual + button from System Settings → Privacy → Microphone, so users can no longer add permissions before running the app. Instead, run millet check: it invokes the sidecar's request-permissions routine, which calls AVCaptureDevice.requestAccess(for: .audio) to trigger the TCC dialog, and reports which permission is still missing. (request-permissions is a subcommand of the bundled meet-record-mac binary, not of the millet CLI — millet check is the user-facing entry point.)

Set MEET_RECORD_MAC=0 to force the legacy ffmpeg+PulseAudio path (diagnostic kill switch only — that path will fail on a stock macOS install because there is no PulseAudio device). Intel Macs and macOS < 14.4 are unsupported.

License

GPL-3.0-or-later, same as parent millet.

Metadata

Release files for millet-record 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for millet-record 0.6.0
File Size Uploaded
millet_record-0.6.0.tar.gz 59.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for millet-record 0.6.0
File Interpreter ABI Platform
millet_record-0.6.0-py3-none-macosx_14_0_arm64.whl Python 3 none macOS 14.0+ ARM64 Details
millet_record-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 332.2 kB

Release files / millet_record-0.6.0.tar.gz

Download URL millet_record-0.6.0.tar.gz
Size 59.1 kB
Tags Source
SHA-256 checksum
How to use checksums
60af31a2aac4faeffbbfb30a8738e1425f710b2332b080c81ccff6b8f6ed717c
BLAKE2b-256 checksum
How to use checksums
fe13966a4fbc3ffd1a4ec30d5f3c38ae1eb6b9a01efa33a4651adb2c1ba49214
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / millet_record-0.6.0-py3-none-macosx_14_0_arm64.whl

Download URL millet_record-0.6.0-py3-none-macosx_14_0_arm64.whl
Size 136.6 kB
Tags Python 3 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
1107820669c47aaeb84f806d2cd6671befd4c11415bec306b334ff7e5541ddcb
BLAKE2b-256 checksum
How to use checksums
d04b09d3613ea56b2240dbb25c90787cd428c3ddb943dc15902e690b0eb329fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / millet_record-0.6.0-py3-none-any.whl

Download URL millet_record-0.6.0-py3-none-any.whl
Size 136.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a911f84b7bfd879dfec07684776927bf9778e32cff7f5b1db3895a998cd770e0
BLAKE2b-256 checksum
How to use checksums
c482172b2bf27a10840b8368c04b7effce8cea97f0adf445398a1005ca5978fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.0 This release

3 release files

0.5.1

3 release files

0.5.0

3 release files

0.4.4

3 release files

0.4.3

3 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page