meeting-noter 0.3.0__py3-none-any.whl → 0.3.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of meeting-noter might be problematic. Click here for more details.

@@ -3,12 +3,36 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import re
6
+ import sys
6
7
  import numpy as np
7
- import lameenc
8
8
  from pathlib import Path
9
9
  from datetime import datetime
10
10
  from typing import Optional, Tuple
11
11
 
12
+ # Try to import lameenc, provide helpful error if not available
13
+ try:
14
+ import lameenc
15
+ LAMEENC_AVAILABLE = True
16
+ except ImportError:
17
+ LAMEENC_AVAILABLE = False
18
+ lameenc = None
19
+
20
+
21
+ def _check_lameenc():
22
+ """Check if lameenc is available, raise helpful error if not."""
23
+ if not LAMEENC_AVAILABLE:
24
+ print("\n" + "=" * 60, file=sys.stderr)
25
+ print("ERROR: MP3 encoding requires the 'lame' library", file=sys.stderr)
26
+ print("=" * 60, file=sys.stderr)
27
+ print("\nTo fix this, run:", file=sys.stderr)
28
+ print("\n brew install lame", file=sys.stderr)
29
+ print("\nThen reinstall meeting-noter:", file=sys.stderr)
30
+ print("\n pip install --force-reinstall meeting-noter", file=sys.stderr)
31
+ print("\n" + "=" * 60 + "\n", file=sys.stderr)
32
+ raise ImportError(
33
+ "lameenc not available. Install LAME first: brew install lame"
34
+ )
35
+
12
36
 
13
37
  def _sanitize_filename(name: str, max_length: int = 50) -> str:
14
38
  """Sanitize a string for use as a filename.
@@ -47,6 +71,7 @@ class MP3Encoder:
47
71
  bitrate: int = 128,
48
72
  quality: int = 2,
49
73
  ):
74
+ _check_lameenc()
50
75
  self.sample_rate = sample_rate
51
76
  self.channels = channels
52
77
  self.encoder = lameenc.Encoder()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meeting-noter
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Offline meeting transcription for macOS with automatic meeting detection
5
5
  Author: Victor
6
6
  License: MIT
@@ -19,13 +19,12 @@ Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
22
- Requires-Python: >=3.9
22
+ Requires-Python: <3.13,>=3.9
23
23
  Description-Content-Type: text/markdown
24
24
  Requires-Dist: click>=8.0
25
25
  Requires-Dist: sounddevice>=0.4.6
26
26
  Requires-Dist: numpy>=1.21
27
27
  Requires-Dist: faster-whisper>=1.0.0
28
- Requires-Dist: lameenc>=1.5.0
29
28
  Requires-Dist: rumps>=0.4.0
30
29
  Requires-Dist: PyQt6>=6.5.0
31
30
  Requires-Dist: pyobjc-framework-Cocoa>=9.0; sys_platform == "darwin"
@@ -34,6 +33,8 @@ Requires-Dist: pyobjc-framework-ScreenCaptureKit>=9.0; sys_platform == "darwin"
34
33
  Requires-Dist: pyobjc-framework-AVFoundation>=9.0; sys_platform == "darwin"
35
34
  Requires-Dist: pyobjc-framework-CoreMedia>=9.0; sys_platform == "darwin"
36
35
  Requires-Dist: pyobjc-framework-libdispatch>=9.0; sys_platform == "darwin"
36
+ Provides-Extra: mp3
37
+ Requires-Dist: lameenc>=1.5.0; extra == "mp3"
37
38
  Provides-Extra: dev
38
39
  Requires-Dist: pytest>=7.0; extra == "dev"
39
40
  Requires-Dist: pytest-cov; extra == "dev"
@@ -47,7 +48,7 @@ Offline meeting transcription tool for macOS. Captures both your voice and meeti
47
48
 
48
49
  ## Features
49
50
 
50
- - **No virtual audio devices needed** - Uses ScreenCaptureKit (like Notion, Discord)
51
+ - **No setup required** - Just install and run
51
52
  - **Captures both sides** - Your mic + system audio (meeting participants)
52
53
  - **Offline transcription** - Uses Whisper locally, no API calls
53
54
  - **Auto-detection** - Detects active meetings (Zoom, Teams, Meet, Slack)
@@ -56,45 +57,24 @@ Offline meeting transcription tool for macOS. Captures both your voice and meeti
56
57
 
57
58
  ## Installation
58
59
 
59
- ### Option 1: Using pipx (Recommended)
60
-
61
60
  ```bash
62
- # Install pipx if you don't have it
63
- brew install pipx
64
- pipx ensurepath
65
-
66
- # Install meeting-noter
67
- cd /path/to/meeting-noter
68
- pipx install -e .
61
+ pip install meeting-noter
69
62
  ```
70
63
 
71
- ### Option 2: Using a virtual environment
72
-
64
+ Or with pipx (recommended):
73
65
  ```bash
74
- cd /path/to/meeting-noter
75
- python3 -m venv .venv
76
- .venv/bin/pip install --upgrade pip
77
- .venv/bin/pip install -e .
66
+ pipx install meeting-noter
78
67
  ```
79
68
 
80
- Then add an alias in your `~/.zshrc`:
81
-
69
+ **For MP3 support** (smaller files), install LAME first:
82
70
  ```bash
83
- echo 'alias meeting-noter="/path/to/meeting-noter/.venv/bin/meeting-noter"' >> ~/.zshrc
84
- source ~/.zshrc
71
+ brew install lame
72
+ pip install meeting-noter[mp3]
85
73
  ```
86
74
 
87
- ## Quick Start
88
-
89
- ### 1. One-time Setup
75
+ Without LAME, the app will prompt you to install it when you try to record.
90
76
 
91
- ```bash
92
- meeting-noter setup
93
- ```
94
-
95
- This will request Screen Recording permission, which is needed to capture meeting participants' audio.
96
-
97
- ### 2. Launch the App
77
+ ## Quick Start
98
78
 
99
79
  **Menu Bar App** (recommended):
100
80
  ```bash
@@ -111,14 +91,16 @@ meeting-noter gui
111
91
  meeting-noter start "Weekly Standup"
112
92
  ```
113
93
 
114
- ### 3. Record a Meeting
94
+ The app will request microphone and Screen Recording permissions on first use.
95
+
96
+ ## Usage
115
97
 
98
+ ### Recording
116
99
  - The menu bar app auto-detects meetings and prompts to record
117
100
  - Or manually start recording via the GUI/CLI
118
101
  - Press Ctrl+C (CLI) or click Stop to end recording
119
102
 
120
- ### 4. Transcribe
121
-
103
+ ### Transcription
122
104
  Recordings are auto-transcribed by default. Or manually:
123
105
 
124
106
  ```bash
@@ -136,30 +118,22 @@ meeting-noter list
136
118
 
137
119
  | Command | Description |
138
120
  |---------|-------------|
139
- | `meeting-noter setup` | One-time setup (Screen Recording permission) |
121
+ | `meeting-noter` | Launch desktop GUI |
140
122
  | `meeting-noter menubar` | Launch menu bar app |
141
123
  | `meeting-noter gui` | Launch desktop GUI |
142
124
  | `meeting-noter start [name]` | Interactive CLI recording |
143
- | `meeting-noter daemon` | Start background audio capture |
144
- | `meeting-noter status` | Check daemon status |
145
- | `meeting-noter stop` | Stop the daemon |
146
125
  | `meeting-noter list` | List recent recordings |
147
126
  | `meeting-noter transcribe` | Transcribe a recording |
148
127
  | `meeting-noter devices` | List audio devices |
128
+ | `meeting-noter status` | Check daemon status |
149
129
 
150
130
  ## Options
151
131
 
152
132
  ### `start`
153
133
  - First argument: Meeting name (optional, auto-generates timestamp if omitted)
154
134
 
155
- ### `daemon`
156
- - `-o, --output-dir`: Where to save recordings (default: `~/meetings`)
157
- - `-f, --foreground`: Run in foreground instead of background
158
- - `-n, --name`: Meeting name for the recording
159
-
160
135
  ### `transcribe`
161
136
  - `-m, --model`: Whisper model size (tiny.en, base.en, small.en, medium.en, large-v3)
162
- - `-l, --live`: Real-time transcription (experimental)
163
137
  - `-o, --output-dir`: Directory with recordings
164
138
 
165
139
  ### `list`
@@ -200,41 +174,14 @@ meeting-noter list
200
174
  ~/meetings/2024-01-15_Weekly_Standup.txt
201
175
  ```
202
176
 
203
- ## Permissions Required
177
+ ## Permissions
178
+
179
+ On first use, macOS will ask for:
204
180
 
205
181
  1. **Microphone** - For capturing your voice
206
182
  2. **Screen Recording** - For capturing system audio (meeting participants)
207
- - Grant in: System Settings > Privacy & Security > Screen Recording
208
- - This uses ScreenCaptureKit, the same API used by Notion, Discord, etc.
209
-
210
- ## Troubleshooting
211
-
212
- ### No system audio captured (only my voice)
213
-
214
- Screen Recording permission not granted. Go to:
215
- System Settings > Privacy & Security > Screen Recording
216
-
217
- Enable the toggle for Terminal (or your IDE/app).
218
-
219
- ### Meeting not auto-detected
220
-
221
- Meeting detection works for: Zoom, Microsoft Teams, Google Meet, Slack.
222
- The meeting window must be open (not minimized).
223
183
 
224
- ### Transcription is slow
225
-
226
- Use a smaller model:
227
-
228
- ```bash
229
- meeting-noter transcribe --model tiny.en
230
- ```
231
-
232
- Model sizes:
233
- - `tiny.en` (~75MB) - Fastest, good for most cases
234
- - `base.en` (~150MB) - Better accuracy
235
- - `small.en` (~500MB) - High accuracy
236
- - `medium.en` (~1.5GB) - Very high accuracy
237
- - `large-v3` (~3GB) - Best accuracy
184
+ Grant these in System Settings > Privacy & Security.
238
185
 
239
186
  ## Configuration
240
187
 
@@ -251,10 +198,21 @@ Config file: `~/.config/meeting-noter/config.json`
251
198
  }
252
199
  ```
253
200
 
201
+ ## Whisper Models
202
+
203
+ | Model | Size | Speed | Accuracy |
204
+ |-------|------|-------|----------|
205
+ | `tiny.en` | ~75MB | Fastest | Good |
206
+ | `base.en` | ~150MB | Fast | Better |
207
+ | `small.en` | ~500MB | Medium | High |
208
+ | `medium.en` | ~1.5GB | Slow | Very High |
209
+ | `large-v3` | ~3GB | Slowest | Best |
210
+
254
211
  ## Requirements
255
212
 
256
213
  - macOS 12.3+ (for ScreenCaptureKit)
257
- - Python 3.9+
214
+ - Python 3.9 - 3.12
215
+ - LAME audio encoder (`brew install lame`) - optional but recommended for MP3
258
216
 
259
217
  ## License
260
218
 
@@ -7,7 +7,7 @@ meeting_noter/meeting_detector.py,sha256=I8zzSdSSmbfd3yyCOyzPL8AS-xSHttFCagrDE35
7
7
  meeting_noter/menubar.py,sha256=Wmwaw-_f2Zky6-0DLC5Ql2o6_VBG1-sWacL85dNeGwU,15366
8
8
  meeting_noter/audio/__init__.py,sha256=O7PU8CxHSHxMeHbc9Jdwt9kePLQzsPh81GQU7VHCtBY,44
9
9
  meeting_noter/audio/capture.py,sha256=fDrT5oXfva8vdFlht9cv60NviKbksw2QeJ8eOtI19uE,6469
10
- meeting_noter/audio/encoder.py,sha256=UT9yLbURsRfVafRbT-DRianSCx1fOEwWPLP-LULYqVo,5443
10
+ meeting_noter/audio/encoder.py,sha256=C-lGn6S-1KmvfeXMaP032XhifDNMe6sa0RKDZHoZlio,6374
11
11
  meeting_noter/audio/system_audio.py,sha256=jbHGjNCerI19weXap0a90Ik17lVTCT1hCEgRKYke-p8,13016
12
12
  meeting_noter/gui/__init__.py,sha256=z5GxxaeXyjqyEa9ox0dQxuL5u_BART0bi7cI6rfntEI,103
13
13
  meeting_noter/gui/__main__.py,sha256=A2HWdYod0bTgjQQIi21O7XpmgxLH36e_X0aygEUZLls,146
@@ -31,8 +31,8 @@ meeting_noter/resources/icon_512.png,sha256=o7X3ngYcppcIAAk9AcfPx94MUmrsPRp0qBTp
31
31
  meeting_noter/resources/icon_64.png,sha256=TqG7Awx3kK8YdiX1e_z1odZonosZyQI2trlkNZCzUoI,607
32
32
  meeting_noter/transcription/__init__.py,sha256=7GY9diP06DzFyoli41wddbrPv5bVDzH35bmnWlIJev4,29
33
33
  meeting_noter/transcription/engine.py,sha256=HK2J2QOBNIDm1MXW-gkagXP8C8cqUfK_WylHQD_LqOI,6320
34
- meeting_noter-0.3.0.dist-info/METADATA,sha256=FhIlKw7Wg1tRRLsFBmrXkKLa8zf3L2csAtO1bQADbcQ,7952
35
- meeting_noter-0.3.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
36
- meeting_noter-0.3.0.dist-info/entry_points.txt,sha256=rKNhzjSF5-e3bLRr8LVe22FeiwcacXabCvNpoEXfu4I,56
37
- meeting_noter-0.3.0.dist-info/top_level.txt,sha256=9Tuq04_0SXM0OXOHVbOHkHkB5tG3fqkrMrfzCMpbLpY,14
38
- meeting_noter-0.3.0.dist-info/RECORD,,
34
+ meeting_noter-0.3.2.dist-info/METADATA,sha256=z8Wsm2_khrlm6V56L5TG1RSTyE_RxVrLG1Pq4YdhltA,6865
35
+ meeting_noter-0.3.2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
36
+ meeting_noter-0.3.2.dist-info/entry_points.txt,sha256=rKNhzjSF5-e3bLRr8LVe22FeiwcacXabCvNpoEXfu4I,56
37
+ meeting_noter-0.3.2.dist-info/top_level.txt,sha256=9Tuq04_0SXM0OXOHVbOHkHkB5tG3fqkrMrfzCMpbLpY,14
38
+ meeting_noter-0.3.2.dist-info/RECORD,,