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.
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/PKG-INFO +36 -78
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/README.md +32 -75
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/pyproject.toml +8 -3
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/audio/encoder.py +26 -1
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter.egg-info/PKG-INFO +36 -78
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter.egg-info/requires.txt +3 -1
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/setup.cfg +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/__init__.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/__main__.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/audio/__init__.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/audio/capture.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/audio/system_audio.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/cli.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/config.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/daemon.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/__init__.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/__main__.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/app.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/main_window.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/meetings_tab.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/recording_tab.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/gui/settings_tab.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/install/__init__.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/install/macos.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/meeting_detector.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/menubar.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/output/__init__.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/output/writer.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/__init__.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon.icns +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon.png +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_128.png +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_16.png +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_256.png +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_32.png +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_512.png +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/resources/icon_64.png +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/transcription/__init__.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter/transcription/engine.py +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter.egg-info/SOURCES.txt +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter.egg-info/dependency_links.txt +0 -0
- {meeting_noter-0.3.0 → meeting_noter-0.3.2}/src/meeting_noter.egg-info/entry_points.txt +0 -0
- {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.
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
72
|
-
|
|
64
|
+
Or with pipx (recommended):
|
|
73
65
|
```bash
|
|
74
|
-
|
|
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
|
-
|
|
81
|
-
|
|
69
|
+
**For MP3 support** (smaller files), install LAME first:
|
|
82
70
|
```bash
|
|
83
|
-
|
|
84
|
-
|
|
71
|
+
brew install lame
|
|
72
|
+
pip install meeting-noter[mp3]
|
|
85
73
|
```
|
|
86
74
|
|
|
87
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
29
|
-
|
|
20
|
+
Or with pipx (recommended):
|
|
30
21
|
```bash
|
|
31
|
-
|
|
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
|
-
|
|
38
|
-
|
|
25
|
+
**For MP3 support** (smaller files), install LAME first:
|
|
39
26
|
```bash
|
|
40
|
-
|
|
41
|
-
|
|
27
|
+
brew install lame
|
|
28
|
+
pip install meeting-noter[mp3]
|
|
42
29
|
```
|
|
43
30
|
|
|
44
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
72
|
-
|
|
64
|
+
Or with pipx (recommended):
|
|
73
65
|
```bash
|
|
74
|
-
|
|
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
|
-
|
|
81
|
-
|
|
69
|
+
**For MP3 support** (smaller files), install LAME first:
|
|
82
70
|
```bash
|
|
83
|
-
|
|
84
|
-
|
|
71
|
+
brew install lame
|
|
72
|
+
pip install meeting-noter[mp3]
|
|
85
73
|
```
|
|
86
74
|
|
|
87
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|