meeting-noter 0.3.1__py3-none-any.whl → 0.3.3__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.
- meeting_noter/audio/encoder.py +26 -1
- {meeting_noter-0.3.1.dist-info → meeting_noter-0.3.3.dist-info}/METADATA +16 -12
- {meeting_noter-0.3.1.dist-info → meeting_noter-0.3.3.dist-info}/RECORD +6 -6
- {meeting_noter-0.3.1.dist-info → meeting_noter-0.3.3.dist-info}/WHEEL +0 -0
- {meeting_noter-0.3.1.dist-info → meeting_noter-0.3.3.dist-info}/entry_points.txt +0 -0
- {meeting_noter-0.3.1.dist-info → meeting_noter-0.3.3.dist-info}/top_level.txt +0 -0
meeting_noter/audio/encoder.py
CHANGED
|
@@ -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.3
|
|
4
4
|
Summary: Offline meeting transcription for macOS with automatic meeting detection
|
|
5
5
|
Author: Victor
|
|
6
6
|
License: MIT
|
|
@@ -18,14 +18,14 @@ Classifier: Programming Language :: Python :: 3.9
|
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.10
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
20
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
22
|
Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
|
|
22
|
-
Requires-Python:
|
|
23
|
+
Requires-Python: >=3.9
|
|
23
24
|
Description-Content-Type: text/markdown
|
|
24
25
|
Requires-Dist: click>=8.0
|
|
25
26
|
Requires-Dist: sounddevice>=0.4.6
|
|
26
|
-
Requires-Dist: numpy>=1.
|
|
27
|
+
Requires-Dist: numpy>=1.24
|
|
27
28
|
Requires-Dist: faster-whisper>=1.0.0
|
|
28
|
-
Requires-Dist: lameenc>=1.5.0
|
|
29
29
|
Requires-Dist: rumps>=0.4.0
|
|
30
30
|
Requires-Dist: PyQt6>=6.5.0
|
|
31
31
|
Requires-Dist: pyobjc-framework-Cocoa>=9.0; sys_platform == "darwin"
|
|
@@ -34,6 +34,8 @@ Requires-Dist: pyobjc-framework-ScreenCaptureKit>=9.0; sys_platform == "darwin"
|
|
|
34
34
|
Requires-Dist: pyobjc-framework-AVFoundation>=9.0; sys_platform == "darwin"
|
|
35
35
|
Requires-Dist: pyobjc-framework-CoreMedia>=9.0; sys_platform == "darwin"
|
|
36
36
|
Requires-Dist: pyobjc-framework-libdispatch>=9.0; sys_platform == "darwin"
|
|
37
|
+
Provides-Extra: mp3
|
|
38
|
+
Requires-Dist: lameenc>=1.5.0; extra == "mp3"
|
|
37
39
|
Provides-Extra: dev
|
|
38
40
|
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
39
41
|
Requires-Dist: pytest-cov; extra == "dev"
|
|
@@ -56,12 +58,6 @@ Offline meeting transcription tool for macOS. Captures both your voice and meeti
|
|
|
56
58
|
|
|
57
59
|
## Installation
|
|
58
60
|
|
|
59
|
-
First, install the LAME audio encoder (required for MP3 encoding):
|
|
60
|
-
```bash
|
|
61
|
-
brew install lame
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Then install meeting-noter:
|
|
65
61
|
```bash
|
|
66
62
|
pip install meeting-noter
|
|
67
63
|
```
|
|
@@ -71,6 +67,14 @@ Or with pipx (recommended):
|
|
|
71
67
|
pipx install meeting-noter
|
|
72
68
|
```
|
|
73
69
|
|
|
70
|
+
**For MP3 support** (smaller files), install LAME first:
|
|
71
|
+
```bash
|
|
72
|
+
brew install lame
|
|
73
|
+
pip install meeting-noter[mp3]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Without LAME, the app will prompt you to install it when you try to record.
|
|
77
|
+
|
|
74
78
|
## Quick Start
|
|
75
79
|
|
|
76
80
|
**Menu Bar App** (recommended):
|
|
@@ -208,8 +212,8 @@ Config file: `~/.config/meeting-noter/config.json`
|
|
|
208
212
|
## Requirements
|
|
209
213
|
|
|
210
214
|
- macOS 12.3+ (for ScreenCaptureKit)
|
|
211
|
-
- Python 3.9
|
|
212
|
-
- LAME audio encoder (`brew install lame`)
|
|
215
|
+
- Python 3.9+
|
|
216
|
+
- LAME audio encoder (`brew install lame`) - optional but recommended for MP3
|
|
213
217
|
|
|
214
218
|
## License
|
|
215
219
|
|
|
@@ -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=
|
|
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.
|
|
35
|
-
meeting_noter-0.3.
|
|
36
|
-
meeting_noter-0.3.
|
|
37
|
-
meeting_noter-0.3.
|
|
38
|
-
meeting_noter-0.3.
|
|
34
|
+
meeting_noter-0.3.3.dist-info/METADATA,sha256=qhcVN8AGEu4sG7nemONR1VSHvM1kz8zm5Q9-k8DcSl0,6904
|
|
35
|
+
meeting_noter-0.3.3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
36
|
+
meeting_noter-0.3.3.dist-info/entry_points.txt,sha256=rKNhzjSF5-e3bLRr8LVe22FeiwcacXabCvNpoEXfu4I,56
|
|
37
|
+
meeting_noter-0.3.3.dist-info/top_level.txt,sha256=9Tuq04_0SXM0OXOHVbOHkHkB5tG3fqkrMrfzCMpbLpY,14
|
|
38
|
+
meeting_noter-0.3.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|