meeting-noter 0.3.0__tar.gz → 0.3.2__tar.gz

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.

Files changed (43) hide show
  1. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/PKG-INFO +36 -78
  2. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/README.md +32 -75
  3. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/pyproject.toml +8 -3
  4. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/audio/encoder.py +26 -1
  5. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter.egg-info/PKG-INFO +36 -78
  6. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter.egg-info/requires.txt +3 -1
  7. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/setup.cfg +0 -0
  8. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/__init__.py +0 -0
  9. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/__main__.py +0 -0
  10. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/audio/__init__.py +0 -0
  11. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/audio/capture.py +0 -0
  12. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/audio/system_audio.py +0 -0
  13. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/cli.py +0 -0
  14. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/config.py +0 -0
  15. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/daemon.py +0 -0
  16. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/__init__.py +0 -0
  17. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/__main__.py +0 -0
  18. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/app.py +0 -0
  19. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/main_window.py +0 -0
  20. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/meetings_tab.py +0 -0
  21. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/recording_tab.py +0 -0
  22. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/settings_tab.py +0 -0
  23. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/install/__init__.py +0 -0
  24. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/install/macos.py +0 -0
  25. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/meeting_detector.py +0 -0
  26. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/menubar.py +0 -0
  27. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/output/__init__.py +0 -0
  28. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/output/writer.py +0 -0
  29. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/__init__.py +0 -0
  30. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon.icns +0 -0
  31. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon.png +0 -0
  32. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_128.png +0 -0
  33. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_16.png +0 -0
  34. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_256.png +0 -0
  35. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_32.png +0 -0
  36. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_512.png +0 -0
  37. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_64.png +0 -0
  38. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/transcription/__init__.py +0 -0
  39. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/transcription/engine.py +0 -0
  40. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter.egg-info/SOURCES.txt +0 -0
  41. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter.egg-info/dependency_links.txt +0 -0
  42. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter.egg-info/entry_points.txt +0 -0
  43. {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter.egg-info/top_level.txt +0 -0
@@ -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
 
@@ -4,7 +4,7 @@ Offline meeting transcription tool for macOS. Captures both your voice and meeti
4
4
 
5
5
  ## Features
6
6
 
7
- - **No virtual audio devices needed** - Uses ScreenCaptureKit (like Notion, Discord)
7
+ - **No setup required** - Just install and run
8
8
  - **Captures both sides** - Your mic + system audio (meeting participants)
9
9
  - **Offline transcription** - Uses Whisper locally, no API calls
10
10
  - **Auto-detection** - Detects active meetings (Zoom, Teams, Meet, Slack)
@@ -13,45 +13,24 @@ Offline meeting transcription tool for macOS. Captures both your voice and meeti
13
13
 
14
14
  ## Installation
15
15
 
16
- ### Option 1: Using pipx (Recommended)
17
-
18
16
  ```bash
19
- # Install pipx if you don't have it
20
- brew install pipx
21
- pipx ensurepath
22
-
23
- # Install meeting-noter
24
- cd /path/to/meeting-noter
25
- pipx install -e .
17
+ pip install meeting-noter
26
18
  ```
27
19
 
28
- ### Option 2: Using a virtual environment
29
-
20
+ Or with pipx (recommended):
30
21
  ```bash
31
- cd /path/to/meeting-noter
32
- python3 -m venv .venv
33
- .venv/bin/pip install --upgrade pip
34
- .venv/bin/pip install -e .
22
+ pipx install meeting-noter
35
23
  ```
36
24
 
37
- Then add an alias in your `~/.zshrc`:
38
-
25
+ **For MP3 support** (smaller files), install LAME first:
39
26
  ```bash
40
- echo 'alias meeting-noter="/path/to/meeting-noter/.venv/bin/meeting-noter"' >> ~/.zshrc
41
- source ~/.zshrc
27
+ brew install lame
28
+ pip install meeting-noter[mp3]
42
29
  ```
43
30
 
44
- ## Quick Start
45
-
46
- ### 1. One-time Setup
31
+ Without LAME, the app will prompt you to install it when you try to record.
47
32
 
48
- ```bash
49
- meeting-noter setup
50
- ```
51
-
52
- This will request Screen Recording permission, which is needed to capture meeting participants' audio.
53
-
54
- ### 2. Launch the App
33
+ ## Quick Start
55
34
 
56
35
  **Menu Bar App** (recommended):
57
36
  ```bash
@@ -68,14 +47,16 @@ meeting-noter gui
68
47
  meeting-noter start "Weekly Standup"
69
48
  ```
70
49
 
71
- ### 3. Record a Meeting
50
+ The app will request microphone and Screen Recording permissions on first use.
51
+
52
+ ## Usage
72
53
 
54
+ ### Recording
73
55
  - The menu bar app auto-detects meetings and prompts to record
74
56
  - Or manually start recording via the GUI/CLI
75
57
  - Press Ctrl+C (CLI) or click Stop to end recording
76
58
 
77
- ### 4. Transcribe
78
-
59
+ ### Transcription
79
60
  Recordings are auto-transcribed by default. Or manually:
80
61
 
81
62
  ```bash
@@ -93,30 +74,22 @@ meeting-noter list
93
74
 
94
75
  | Command | Description |
95
76
  |---------|-------------|
96
- | `meeting-noter setup` | One-time setup (Screen Recording permission) |
77
+ | `meeting-noter` | Launch desktop GUI |
97
78
  | `meeting-noter menubar` | Launch menu bar app |
98
79
  | `meeting-noter gui` | Launch desktop GUI |
99
80
  | `meeting-noter start [name]` | Interactive CLI recording |
100
- | `meeting-noter daemon` | Start background audio capture |
101
- | `meeting-noter status` | Check daemon status |
102
- | `meeting-noter stop` | Stop the daemon |
103
81
  | `meeting-noter list` | List recent recordings |
104
82
  | `meeting-noter transcribe` | Transcribe a recording |
105
83
  | `meeting-noter devices` | List audio devices |
84
+ | `meeting-noter status` | Check daemon status |
106
85
 
107
86
  ## Options
108
87
 
109
88
  ### `start`
110
89
  - First argument: Meeting name (optional, auto-generates timestamp if omitted)
111
90
 
112
- ### `daemon`
113
- - `-o, --output-dir`: Where to save recordings (default: `~/meetings`)
114
- - `-f, --foreground`: Run in foreground instead of background
115
- - `-n, --name`: Meeting name for the recording
116
-
117
91
  ### `transcribe`
118
92
  - `-m, --model`: Whisper model size (tiny.en, base.en, small.en, medium.en, large-v3)
119
- - `-l, --live`: Real-time transcription (experimental)
120
93
  - `-o, --output-dir`: Directory with recordings
121
94
 
122
95
  ### `list`
@@ -157,41 +130,14 @@ meeting-noter list
157
130
  ~/meetings/2024-01-15_Weekly_Standup.txt
158
131
  ```
159
132
 
160
- ## Permissions Required
133
+ ## Permissions
134
+
135
+ On first use, macOS will ask for:
161
136
 
162
137
  1. **Microphone** - For capturing your voice
163
138
  2. **Screen Recording** - For capturing system audio (meeting participants)
164
- - Grant in: System Settings > Privacy & Security > Screen Recording
165
- - This uses ScreenCaptureKit, the same API used by Notion, Discord, etc.
166
-
167
- ## Troubleshooting
168
-
169
- ### No system audio captured (only my voice)
170
-
171
- Screen Recording permission not granted. Go to:
172
- System Settings > Privacy & Security > Screen Recording
173
-
174
- Enable the toggle for Terminal (or your IDE/app).
175
-
176
- ### Meeting not auto-detected
177
-
178
- Meeting detection works for: Zoom, Microsoft Teams, Google Meet, Slack.
179
- The meeting window must be open (not minimized).
180
139
 
181
- ### Transcription is slow
182
-
183
- Use a smaller model:
184
-
185
- ```bash
186
- meeting-noter transcribe --model tiny.en
187
- ```
188
-
189
- Model sizes:
190
- - `tiny.en` (~75MB) - Fastest, good for most cases
191
- - `base.en` (~150MB) - Better accuracy
192
- - `small.en` (~500MB) - High accuracy
193
- - `medium.en` (~1.5GB) - Very high accuracy
194
- - `large-v3` (~3GB) - Best accuracy
140
+ Grant these in System Settings > Privacy & Security.
195
141
 
196
142
  ## Configuration
197
143
 
@@ -208,10 +154,21 @@ Config file: `~/.config/meeting-noter/config.json`
208
154
  }
209
155
  ```
210
156
 
157
+ ## Whisper Models
158
+
159
+ | Model | Size | Speed | Accuracy |
160
+ |-------|------|-------|----------|
161
+ | `tiny.en` | ~75MB | Fastest | Good |
162
+ | `base.en` | ~150MB | Fast | Better |
163
+ | `small.en` | ~500MB | Medium | High |
164
+ | `medium.en` | ~1.5GB | Slow | Very High |
165
+ | `large-v3` | ~3GB | Slowest | Best |
166
+
211
167
  ## Requirements
212
168
 
213
169
  - macOS 12.3+ (for ScreenCaptureKit)
214
- - Python 3.9+
170
+ - Python 3.9 - 3.12
171
+ - LAME audio encoder (`brew install lame`) - optional but recommended for MP3
215
172
 
216
173
  ## License
217
174
 
@@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meeting-noter"
7
- version = "0.3.0"
7
+ version = "0.3.2"
8
8
  description = "Offline meeting transcription for macOS with automatic meeting detection"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
11
- requires-python = ">=3.9"
11
+ requires-python = ">=3.9,<3.13"
12
12
  authors = [
13
13
  {name = "Victor"}
14
14
  ]
@@ -32,7 +32,6 @@ dependencies = [
32
32
  "sounddevice>=0.4.6",
33
33
  "numpy>=1.21",
34
34
  "faster-whisper>=1.0.0",
35
- "lameenc>=1.5.0",
36
35
  "rumps>=0.4.0",
37
36
  "PyQt6>=6.5.0",
38
37
  "pyobjc-framework-Cocoa>=9.0; sys_platform == 'darwin'",
@@ -43,7 +42,13 @@ dependencies = [
43
42
  "pyobjc-framework-libdispatch>=9.0; sys_platform == 'darwin'",
44
43
  ]
45
44
 
45
+ # lameenc requires LAME to be installed (brew install lame)
46
+ # It will be installed automatically if LAME is present
47
+
46
48
  [project.optional-dependencies]
49
+ mp3 = [
50
+ "lameenc>=1.5.0",
51
+ ]
47
52
  dev = [
48
53
  "pytest>=7.0",
49
54
  "pytest-cov",
@@ -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
 
@@ -2,7 +2,6 @@ click>=8.0
2
2
  sounddevice>=0.4.6
3
3
  numpy>=1.21
4
4
  faster-whisper>=1.0.0
5
- lameenc>=1.5.0
6
5
  rumps>=0.4.0
7
6
  PyQt6>=6.5.0
8
7
 
@@ -20,3 +19,6 @@ pytest-cov
20
19
  black
21
20
  ruff
22
21
  mypy
22
+
23
+ [mp3]
24
+ lameenc>=1.5.0
File without changes