PayPerTranscript 0.2.1__tar.gz → 0.2.3__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.
- paypertranscript-0.2.3/PKG-INFO +111 -0
- paypertranscript-0.2.3/PayPerTranscript.egg-info/PKG-INFO +111 -0
- paypertranscript-0.2.3/README.md +82 -0
- paypertranscript-0.2.3/paypertranscript/__init__.py +3 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/__main__.py +2 -2
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/styles/dark.qss +1 -1
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/audio_manager.py +5 -5
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/config.py +3 -3
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/cost_tracker.py +1 -1
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/recorder.py +6 -6
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/text_inserter.py +5 -5
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/updater.py +3 -3
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/window_detector.py +2 -2
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/pipeline/transcription.py +6 -6
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/providers/base.py +1 -1
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/app.py +16 -16
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/overlay.py +3 -3
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/settings.py +4 -4
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/setup_wizard.py +28 -8
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/statistics.py +8 -8
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/tray.py +11 -11
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/window_mapping.py +2 -2
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/word_list.py +3 -3
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/pyproject.toml +1 -1
- paypertranscript-0.2.1/PKG-INFO +0 -159
- paypertranscript-0.2.1/PayPerTranscript.egg-info/PKG-INFO +0 -159
- paypertranscript-0.2.1/README.md +0 -130
- paypertranscript-0.2.1/paypertranscript/__init__.py +0 -3
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/LICENSE +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/PayPerTranscript.egg-info/SOURCES.txt +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/PayPerTranscript.egg-info/dependency_links.txt +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/PayPerTranscript.egg-info/entry_points.txt +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/PayPerTranscript.egg-info/requires.txt +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/PayPerTranscript.egg-info/top_level.txt +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/icons/app.ico +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/icons/app.png +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/icons/arrow_down.svg +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/sounds/start.wav +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/sounds/stop.wav +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/__init__.py +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/hotkey.py +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/logging.py +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/paths.py +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/session_logger.py +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/pipeline/__init__.py +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/providers/__init__.py +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/providers/groq_provider.py +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/__init__.py +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/dashboard.py +0 -0
- {paypertranscript-0.2.1 → paypertranscript-0.2.3}/setup.cfg +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: PayPerTranscript
|
|
3
|
+
Version: 0.2.3
|
|
4
|
+
Summary: Open-Source Voice-to-Text mit Pay-per-Use Pricing
|
|
5
|
+
Author: PayPerTranscript Contributors
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/jxnxts/PayPerTranscript
|
|
8
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
10
|
+
Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
|
|
11
|
+
Requires-Python: >=3.12
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: PySide6
|
|
15
|
+
Requires-Dist: sounddevice
|
|
16
|
+
Requires-Dist: numpy
|
|
17
|
+
Requires-Dist: groq
|
|
18
|
+
Requires-Dist: pynput
|
|
19
|
+
Requires-Dist: pywin32
|
|
20
|
+
Requires-Dist: psutil
|
|
21
|
+
Requires-Dist: pyperclip
|
|
22
|
+
Requires-Dist: pyautogui
|
|
23
|
+
Requires-Dist: keyring
|
|
24
|
+
Requires-Dist: soundfile
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: build; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest; extra == "dev"
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
|
|
30
|
+
<div align="center">
|
|
31
|
+
|
|
32
|
+
# 🎙️ PayPerTranscript
|
|
33
|
+
|
|
34
|
+
**Voice-to-Text ohne Abo-Falle**
|
|
35
|
+
|
|
36
|
+
Hotkey halten → Sprechen → Text erscheint
|
|
37
|
+
*Bezahle nur, was du nutzt: ~0.02¢ pro Transkription*
|
|
38
|
+
|
|
39
|
+
[](LICENSE)
|
|
40
|
+
[](https://python.org)
|
|
41
|
+
[]()
|
|
42
|
+
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 💡 Das Problem
|
|
48
|
+
|
|
49
|
+
Kommerzielle Voice-to-Text Dienste kosten **$12-15/Monat** - egal ob du sie 5 Minuten oder 5 Stunden nutzt.
|
|
50
|
+
|
|
51
|
+
## ✨ Die Lösung
|
|
52
|
+
|
|
53
|
+
**PayPerTranscript** nutzt deinen eigenen API-Key. Du zahlst nur für tatsächliche Nutzung:
|
|
54
|
+
- **100 Transkriptionen/Tag** = nur **~74 Cent/Monat**
|
|
55
|
+
- Kommerzielle Alternative = **$15/Monat**
|
|
56
|
+
- **Du sparst über 95%**
|
|
57
|
+
|
|
58
|
+
**Open Source** · **Keine Telemetrie** · **Dein eigener API-Key**
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 🚀 Features
|
|
63
|
+
|
|
64
|
+
### 🎯 Kernfunktionen
|
|
65
|
+
- **Hold-to-Record**: `Ctrl+Win` halten - sprechen - loslassen - fertig
|
|
66
|
+
- **Blitzschnell**: 30 Sekunden Audio = 0.14 Sekunden Transkription (via Groq Whisper)
|
|
67
|
+
- **Smart Formatting**: WhatsApp bekommt lockere Texte, Outlook professionelle E-Mails
|
|
68
|
+
- **Wortliste**: Eigene Namen und Fachbegriffe werden immer korrekt geschrieben
|
|
69
|
+
|
|
70
|
+
### 📊 Transparenz & Kontrolle
|
|
71
|
+
- **Live-Kosten-Dashboard**: Sieh genau, was du verbrauchst
|
|
72
|
+
- **Abo-Vergleich**: Wie viel du im Vergleich zu kommerziellen Diensten sparst
|
|
73
|
+
- **Session-Historie**: Jede Transkription nachvollziehbar
|
|
74
|
+
|
|
75
|
+
### 🔒 Privatsphäre
|
|
76
|
+
- Dein eigener API-Key - du kontrollierst die Daten
|
|
77
|
+
- Keine Telemetrie, kein Tracking
|
|
78
|
+
- Audio-Dateien werden automatisch gelöscht
|
|
79
|
+
- Open Source unter MIT-Lizenz
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 📦 Installation
|
|
84
|
+
|
|
85
|
+
### Via pip (empfohlen)
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
pip install paypertranscript
|
|
89
|
+
paypertranscript
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Beim ersten Start führt dich ein **Setup-Wizard** durch die Konfiguration (2 Minuten).
|
|
93
|
+
|
|
94
|
+
**Voraussetzungen**: Windows 10/11 · Python 3.12+
|
|
95
|
+
|
|
96
|
+
### Aus Quellcode
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
git clone https://github.com/jxnxts/PayPerTranscript.git
|
|
100
|
+
cd PayPerTranscript
|
|
101
|
+
pip install -e .
|
|
102
|
+
paypertranscript
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
<div align="center">
|
|
108
|
+
|
|
109
|
+
**Bezahle nur, was du wirklich nutzt** 💰
|
|
110
|
+
|
|
111
|
+
</div>
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: PayPerTranscript
|
|
3
|
+
Version: 0.2.3
|
|
4
|
+
Summary: Open-Source Voice-to-Text mit Pay-per-Use Pricing
|
|
5
|
+
Author: PayPerTranscript Contributors
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/jxnxts/PayPerTranscript
|
|
8
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
10
|
+
Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
|
|
11
|
+
Requires-Python: >=3.12
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: PySide6
|
|
15
|
+
Requires-Dist: sounddevice
|
|
16
|
+
Requires-Dist: numpy
|
|
17
|
+
Requires-Dist: groq
|
|
18
|
+
Requires-Dist: pynput
|
|
19
|
+
Requires-Dist: pywin32
|
|
20
|
+
Requires-Dist: psutil
|
|
21
|
+
Requires-Dist: pyperclip
|
|
22
|
+
Requires-Dist: pyautogui
|
|
23
|
+
Requires-Dist: keyring
|
|
24
|
+
Requires-Dist: soundfile
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: build; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest; extra == "dev"
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
|
|
30
|
+
<div align="center">
|
|
31
|
+
|
|
32
|
+
# 🎙️ PayPerTranscript
|
|
33
|
+
|
|
34
|
+
**Voice-to-Text ohne Abo-Falle**
|
|
35
|
+
|
|
36
|
+
Hotkey halten → Sprechen → Text erscheint
|
|
37
|
+
*Bezahle nur, was du nutzt: ~0.02¢ pro Transkription*
|
|
38
|
+
|
|
39
|
+
[](LICENSE)
|
|
40
|
+
[](https://python.org)
|
|
41
|
+
[]()
|
|
42
|
+
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 💡 Das Problem
|
|
48
|
+
|
|
49
|
+
Kommerzielle Voice-to-Text Dienste kosten **$12-15/Monat** - egal ob du sie 5 Minuten oder 5 Stunden nutzt.
|
|
50
|
+
|
|
51
|
+
## ✨ Die Lösung
|
|
52
|
+
|
|
53
|
+
**PayPerTranscript** nutzt deinen eigenen API-Key. Du zahlst nur für tatsächliche Nutzung:
|
|
54
|
+
- **100 Transkriptionen/Tag** = nur **~74 Cent/Monat**
|
|
55
|
+
- Kommerzielle Alternative = **$15/Monat**
|
|
56
|
+
- **Du sparst über 95%**
|
|
57
|
+
|
|
58
|
+
**Open Source** · **Keine Telemetrie** · **Dein eigener API-Key**
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 🚀 Features
|
|
63
|
+
|
|
64
|
+
### 🎯 Kernfunktionen
|
|
65
|
+
- **Hold-to-Record**: `Ctrl+Win` halten - sprechen - loslassen - fertig
|
|
66
|
+
- **Blitzschnell**: 30 Sekunden Audio = 0.14 Sekunden Transkription (via Groq Whisper)
|
|
67
|
+
- **Smart Formatting**: WhatsApp bekommt lockere Texte, Outlook professionelle E-Mails
|
|
68
|
+
- **Wortliste**: Eigene Namen und Fachbegriffe werden immer korrekt geschrieben
|
|
69
|
+
|
|
70
|
+
### 📊 Transparenz & Kontrolle
|
|
71
|
+
- **Live-Kosten-Dashboard**: Sieh genau, was du verbrauchst
|
|
72
|
+
- **Abo-Vergleich**: Wie viel du im Vergleich zu kommerziellen Diensten sparst
|
|
73
|
+
- **Session-Historie**: Jede Transkription nachvollziehbar
|
|
74
|
+
|
|
75
|
+
### 🔒 Privatsphäre
|
|
76
|
+
- Dein eigener API-Key - du kontrollierst die Daten
|
|
77
|
+
- Keine Telemetrie, kein Tracking
|
|
78
|
+
- Audio-Dateien werden automatisch gelöscht
|
|
79
|
+
- Open Source unter MIT-Lizenz
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 📦 Installation
|
|
84
|
+
|
|
85
|
+
### Via pip (empfohlen)
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
pip install paypertranscript
|
|
89
|
+
paypertranscript
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Beim ersten Start führt dich ein **Setup-Wizard** durch die Konfiguration (2 Minuten).
|
|
93
|
+
|
|
94
|
+
**Voraussetzungen**: Windows 10/11 · Python 3.12+
|
|
95
|
+
|
|
96
|
+
### Aus Quellcode
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
git clone https://github.com/jxnxts/PayPerTranscript.git
|
|
100
|
+
cd PayPerTranscript
|
|
101
|
+
pip install -e .
|
|
102
|
+
paypertranscript
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
<div align="center">
|
|
108
|
+
|
|
109
|
+
**Bezahle nur, was du wirklich nutzt** 💰
|
|
110
|
+
|
|
111
|
+
</div>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# 🎙️ PayPerTranscript
|
|
4
|
+
|
|
5
|
+
**Voice-to-Text ohne Abo-Falle**
|
|
6
|
+
|
|
7
|
+
Hotkey halten → Sprechen → Text erscheint
|
|
8
|
+
*Bezahle nur, was du nutzt: ~0.02¢ pro Transkription*
|
|
9
|
+
|
|
10
|
+
[](LICENSE)
|
|
11
|
+
[](https://python.org)
|
|
12
|
+
[]()
|
|
13
|
+
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 💡 Das Problem
|
|
19
|
+
|
|
20
|
+
Kommerzielle Voice-to-Text Dienste kosten **$12-15/Monat** - egal ob du sie 5 Minuten oder 5 Stunden nutzt.
|
|
21
|
+
|
|
22
|
+
## ✨ Die Lösung
|
|
23
|
+
|
|
24
|
+
**PayPerTranscript** nutzt deinen eigenen API-Key. Du zahlst nur für tatsächliche Nutzung:
|
|
25
|
+
- **100 Transkriptionen/Tag** = nur **~74 Cent/Monat**
|
|
26
|
+
- Kommerzielle Alternative = **$15/Monat**
|
|
27
|
+
- **Du sparst über 95%**
|
|
28
|
+
|
|
29
|
+
**Open Source** · **Keine Telemetrie** · **Dein eigener API-Key**
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 🚀 Features
|
|
34
|
+
|
|
35
|
+
### 🎯 Kernfunktionen
|
|
36
|
+
- **Hold-to-Record**: `Ctrl+Win` halten - sprechen - loslassen - fertig
|
|
37
|
+
- **Blitzschnell**: 30 Sekunden Audio = 0.14 Sekunden Transkription (via Groq Whisper)
|
|
38
|
+
- **Smart Formatting**: WhatsApp bekommt lockere Texte, Outlook professionelle E-Mails
|
|
39
|
+
- **Wortliste**: Eigene Namen und Fachbegriffe werden immer korrekt geschrieben
|
|
40
|
+
|
|
41
|
+
### 📊 Transparenz & Kontrolle
|
|
42
|
+
- **Live-Kosten-Dashboard**: Sieh genau, was du verbrauchst
|
|
43
|
+
- **Abo-Vergleich**: Wie viel du im Vergleich zu kommerziellen Diensten sparst
|
|
44
|
+
- **Session-Historie**: Jede Transkription nachvollziehbar
|
|
45
|
+
|
|
46
|
+
### 🔒 Privatsphäre
|
|
47
|
+
- Dein eigener API-Key - du kontrollierst die Daten
|
|
48
|
+
- Keine Telemetrie, kein Tracking
|
|
49
|
+
- Audio-Dateien werden automatisch gelöscht
|
|
50
|
+
- Open Source unter MIT-Lizenz
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 📦 Installation
|
|
55
|
+
|
|
56
|
+
### Via pip (empfohlen)
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pip install paypertranscript
|
|
60
|
+
paypertranscript
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Beim ersten Start führt dich ein **Setup-Wizard** durch die Konfiguration (2 Minuten).
|
|
64
|
+
|
|
65
|
+
**Voraussetzungen**: Windows 10/11 · Python 3.12+
|
|
66
|
+
|
|
67
|
+
### Aus Quellcode
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
git clone https://github.com/jxnxts/PayPerTranscript.git
|
|
71
|
+
cd PayPerTranscript
|
|
72
|
+
pip install -e .
|
|
73
|
+
paypertranscript
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
<div align="center">
|
|
79
|
+
|
|
80
|
+
**Bezahle nur, was du wirklich nutzt** 💰
|
|
81
|
+
|
|
82
|
+
</div>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""PayPerTranscript
|
|
1
|
+
"""PayPerTranscript - Entry Point.
|
|
2
2
|
|
|
3
3
|
Open-Source Voice-to-Text mit Pay-per-Use Pricing.
|
|
4
4
|
Supports: python -m paypertranscript
|
|
@@ -34,7 +34,7 @@ def _load_dotenv() -> None:
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
def main() -> None:
|
|
37
|
-
"""Hauptfunktion
|
|
37
|
+
"""Hauptfunktion - initialisiert Logging und startet die PySide6-App."""
|
|
38
38
|
_load_dotenv()
|
|
39
39
|
|
|
40
40
|
from paypertranscript.core.logging import setup_logging
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"""Sound-Playback & Temp-File-Management für PayPerTranscript.
|
|
2
2
|
|
|
3
3
|
Sounds werden beim App-Start in den Speicher vorgeladen (kein Disk-I/O während Aufnahme).
|
|
4
4
|
WAV-Dateien werden im %APPDATA%-Audio-Verzeichnis gespeichert.
|
|
@@ -50,7 +50,7 @@ class AudioManager:
|
|
|
50
50
|
sf.write(str(path), wave, sr)
|
|
51
51
|
log.info("Standard-Sound generiert: %s", name)
|
|
52
52
|
except Exception as e:
|
|
53
|
-
log.warning("Standard-Sound konnte nicht generiert werden: %s
|
|
53
|
+
log.warning("Standard-Sound konnte nicht generiert werden: %s - %s", name, e)
|
|
54
54
|
|
|
55
55
|
def preload_sounds(self) -> None:
|
|
56
56
|
"""Lädt alle Sound-Dateien aus assets/sounds/ in den Speicher."""
|
|
@@ -66,7 +66,7 @@ class AudioManager:
|
|
|
66
66
|
self._sounds[sound_file.stem] = (data, samplerate)
|
|
67
67
|
log.debug("Sound vorgeladen: %s (%.1f KB)", sound_file.stem, sound_file.stat().st_size / 1024)
|
|
68
68
|
except Exception as e:
|
|
69
|
-
log.warning("Sound konnte nicht geladen werden: %s
|
|
69
|
+
log.warning("Sound konnte nicht geladen werden: %s - %s", sound_file.name, e)
|
|
70
70
|
|
|
71
71
|
if self._sounds:
|
|
72
72
|
log.info("%d Sound(s) vorgeladen", len(self._sounds))
|
|
@@ -87,7 +87,7 @@ class AudioManager:
|
|
|
87
87
|
try:
|
|
88
88
|
sd.play(data, samplerate)
|
|
89
89
|
except sd.PortAudioError as e:
|
|
90
|
-
log.warning("Sound-Playback fehlgeschlagen: %s
|
|
90
|
+
log.warning("Sound-Playback fehlgeschlagen: %s - %s", name, e)
|
|
91
91
|
|
|
92
92
|
def generate_temp_path(self) -> Path:
|
|
93
93
|
"""Generiert einen eindeutigen Pfad für eine temporäre WAV-Datei.
|
|
@@ -130,7 +130,7 @@ class AudioManager:
|
|
|
130
130
|
deleted += 1
|
|
131
131
|
log.debug("Audio-Datei gelöscht: %s (%.1fh alt)", wav_file.name, age / 3600)
|
|
132
132
|
except OSError as e:
|
|
133
|
-
log.warning("Audio-Datei konnte nicht gelöscht werden: %s
|
|
133
|
+
log.warning("Audio-Datei konnte nicht gelöscht werden: %s - %s", wav_file.name, e)
|
|
134
134
|
|
|
135
135
|
if deleted:
|
|
136
136
|
log.info("%d alte Audio-Datei(en) gelöscht", deleted)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"""Konfigurationsmanagement für PayPerTranscript.
|
|
2
2
|
|
|
3
3
|
JSON-basiert, Merge-on-Write, Schema-Validierung mit Fallback auf Defaults.
|
|
4
4
|
Alle Laufzeit-Daten liegen unter %APPDATA%\\PayPerTranscript\\.
|
|
@@ -333,13 +333,13 @@ def enable_autostart() -> bool:
|
|
|
333
333
|
python_dir = Path(sys.executable).parent
|
|
334
334
|
pythonw = python_dir / "pythonw.exe"
|
|
335
335
|
if not pythonw.exists():
|
|
336
|
-
log.warning("pythonw.exe nicht gefunden
|
|
336
|
+
log.warning("pythonw.exe nicht gefunden - Fallback auf python.exe")
|
|
337
337
|
pythonw = Path(sys.executable)
|
|
338
338
|
shortcut.Targetpath = str(pythonw)
|
|
339
339
|
shortcut.WorkingDirectory = str(Path.home())
|
|
340
340
|
shortcut.Arguments = "-m paypertranscript"
|
|
341
341
|
|
|
342
|
-
shortcut.Description = "PayPerTranscript
|
|
342
|
+
shortcut.Description = "PayPerTranscript - Voice-to-Text"
|
|
343
343
|
shortcut.save()
|
|
344
344
|
log.info("Autostart-Shortcut erstellt: %s", shortcut_path)
|
|
345
345
|
return True
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"""Audio-Aufnahme für PayPerTranscript.
|
|
2
2
|
|
|
3
3
|
Callback-basiertes Recording mit sounddevice (16kHz, Mono, int16).
|
|
4
|
-
Persistenter Stream
|
|
4
|
+
Persistenter Stream - wird einmal erstellt und wiederverwendet.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
import threading
|
|
@@ -44,7 +44,7 @@ class AudioRecorder:
|
|
|
44
44
|
time_info: object,
|
|
45
45
|
status: sd.CallbackFlags,
|
|
46
46
|
) -> None:
|
|
47
|
-
"""Callback des InputStream
|
|
47
|
+
"""Callback des InputStream - sammelt Frames während der Aufnahme."""
|
|
48
48
|
if status:
|
|
49
49
|
log.warning("Audio-Callback Status: %s", status)
|
|
50
50
|
if self._is_recording:
|
|
@@ -115,13 +115,13 @@ class AudioRecorder:
|
|
|
115
115
|
self._amplitude = 0.0
|
|
116
116
|
|
|
117
117
|
if not frames:
|
|
118
|
-
log.warning("Aufnahme gestoppt
|
|
118
|
+
log.warning("Aufnahme gestoppt - keine Audio-Daten aufgenommen")
|
|
119
119
|
return None
|
|
120
120
|
|
|
121
121
|
audio = np.concatenate(frames)
|
|
122
122
|
actual_duration = len(audio) / SAMPLE_RATE
|
|
123
123
|
log.info(
|
|
124
|
-
"Aufnahme gestoppt
|
|
124
|
+
"Aufnahme gestoppt - Dauer: %.2fs (%.2fs wall), %d Samples",
|
|
125
125
|
actual_duration,
|
|
126
126
|
duration,
|
|
127
127
|
len(audio),
|
|
@@ -156,7 +156,7 @@ class AudioRecorder:
|
|
|
156
156
|
|
|
157
157
|
@property
|
|
158
158
|
def amplitude(self) -> float:
|
|
159
|
-
"""Aktuelle Audio-Amplitude (0.0
|
|
159
|
+
"""Aktuelle Audio-Amplitude (0.0-1.0) für Visualizer."""
|
|
160
160
|
return self._amplitude
|
|
161
161
|
|
|
162
162
|
@property
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"""Clipboard-basierte Texteinfügung für PayPerTranscript.
|
|
2
2
|
|
|
3
3
|
Sichert die Zwischenablage, kopiert den Text, simuliert Ctrl+V,
|
|
4
4
|
und stellt die alte Zwischenablage wieder her.
|
|
@@ -34,7 +34,7 @@ def insert_text(text: str) -> None:
|
|
|
34
34
|
text: Der einzufügende Text.
|
|
35
35
|
"""
|
|
36
36
|
if not text:
|
|
37
|
-
log.warning("insert_text aufgerufen mit leerem Text
|
|
37
|
+
log.warning("insert_text aufgerufen mit leerem Text - übersprungen")
|
|
38
38
|
return
|
|
39
39
|
|
|
40
40
|
# 1. Aktuelle Zwischenablage sichern
|
|
@@ -42,7 +42,7 @@ def insert_text(text: str) -> None:
|
|
|
42
42
|
try:
|
|
43
43
|
old_clipboard = pyperclip.paste() or ""
|
|
44
44
|
except Exception:
|
|
45
|
-
log.debug("Zwischenablage konnte nicht gelesen werden
|
|
45
|
+
log.debug("Zwischenablage konnte nicht gelesen werden - wird als leer behandelt")
|
|
46
46
|
|
|
47
47
|
try:
|
|
48
48
|
# 2. Text in Zwischenablage kopieren
|
|
@@ -86,7 +86,7 @@ def insert_text_streaming(chunks: Iterator[str]) -> None:
|
|
|
86
86
|
try:
|
|
87
87
|
old_clipboard = pyperclip.paste() or ""
|
|
88
88
|
except Exception:
|
|
89
|
-
log.debug("Zwischenablage konnte nicht gelesen werden
|
|
89
|
+
log.debug("Zwischenablage konnte nicht gelesen werden - wird als leer behandelt")
|
|
90
90
|
|
|
91
91
|
buffer = ""
|
|
92
92
|
total_inserted = 0
|
|
@@ -114,7 +114,7 @@ def insert_text_streaming(chunks: Iterator[str]) -> None:
|
|
|
114
114
|
log.info("Streaming-Text eingefügt (%d Zeichen)", total_inserted)
|
|
115
115
|
|
|
116
116
|
except Exception as e:
|
|
117
|
-
log.error("Streaming-Einfügung fehlgeschlagen: %s
|
|
117
|
+
log.error("Streaming-Einfügung fehlgeschlagen: %s - versuche Fallback", e)
|
|
118
118
|
# Fallback: alles was noch nicht eingefügt wurde komplett pasten
|
|
119
119
|
if buffer:
|
|
120
120
|
try:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Auto-Update von PyPI
|
|
1
|
+
"""Auto-Update von PyPI - Version pruefen, installieren, neustarten.
|
|
2
2
|
|
|
3
3
|
Nutzt nur Stdlib (urllib, subprocess) um PySide6-Imports zu vermeiden.
|
|
4
4
|
Wird sowohl beim Startup (vor UI-Init) als auch periodisch waehrend der Laufzeit genutzt.
|
|
@@ -87,7 +87,7 @@ def check_and_auto_update() -> bool:
|
|
|
87
87
|
try:
|
|
88
88
|
cfg = json.loads(config_file.read_text(encoding="utf-8"))
|
|
89
89
|
if not cfg.get("updates", {}).get("auto_update", True):
|
|
90
|
-
log.info("Auto-Update deaktiviert
|
|
90
|
+
log.info("Auto-Update deaktiviert - uebersprungen")
|
|
91
91
|
return False
|
|
92
92
|
except Exception:
|
|
93
93
|
pass # Bei Lesefehler: Default = Update aktiv
|
|
@@ -102,7 +102,7 @@ def check_and_auto_update() -> bool:
|
|
|
102
102
|
log.info("Kein Update verfuegbar (aktuell: %s, PyPI: %s)", __version__, latest)
|
|
103
103
|
return False
|
|
104
104
|
|
|
105
|
-
log.info("Update verfuegbar: %s
|
|
105
|
+
log.info("Update verfuegbar: %s - %s - installiere...", __version__, latest)
|
|
106
106
|
if install_update():
|
|
107
107
|
restart_app()
|
|
108
108
|
return True # wird nicht erreicht (sys.exit), aber fuer Typsicherheit
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"""Foreground-Window-Erkennung für PayPerTranscript.
|
|
2
2
|
|
|
3
3
|
Erkennt das aktive Fenster (Prozessname + Fenstertitel) via pywin32 + psutil.
|
|
4
4
|
Wird bei Aufnahme-Start aufgerufen, um das Fenster für Window-Mapping zu identifizieren.
|
|
@@ -50,7 +50,7 @@ def get_foreground_window() -> WindowInfo:
|
|
|
50
50
|
process_name = ""
|
|
51
51
|
log.debug("Prozessname für PID %d nicht ermittelbar", pid)
|
|
52
52
|
|
|
53
|
-
log.debug("Foreground-Window: %s
|
|
53
|
+
log.debug("Foreground-Window: %s - '%s'", process_name, window_title)
|
|
54
54
|
return WindowInfo(process_name=process_name, window_title=window_title)
|
|
55
55
|
|
|
56
56
|
except Exception as e:
|
{paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/pipeline/transcription.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"""Transkriptions-Pipeline fuer PayPerTranscript.
|
|
2
2
|
|
|
3
3
|
Orchestriert: WAV-Datei -> STT -> (optional) LLM-Formatierung -> Text-Einfuegung.
|
|
4
4
|
"""
|
|
@@ -239,7 +239,7 @@ class TranscriptionPipeline:
|
|
|
239
239
|
_notify(STATUS_STT_DONE)
|
|
240
240
|
|
|
241
241
|
if not text:
|
|
242
|
-
log.info("Pipeline: STT lieferte leeren Text
|
|
242
|
+
log.info("Pipeline: STT lieferte leeren Text - uebersprungen")
|
|
243
243
|
_notify(STATUS_DONE)
|
|
244
244
|
return
|
|
245
245
|
|
|
@@ -287,7 +287,7 @@ class TranscriptionPipeline:
|
|
|
287
287
|
if formatted:
|
|
288
288
|
text = formatted
|
|
289
289
|
else:
|
|
290
|
-
log.warning("Pipeline: LLM lieferte leeren Text
|
|
290
|
+
log.warning("Pipeline: LLM lieferte leeren Text - verwende Rohtext")
|
|
291
291
|
_do_insert(text)
|
|
292
292
|
|
|
293
293
|
llm_used = True
|
|
@@ -297,7 +297,7 @@ class TranscriptionPipeline:
|
|
|
297
297
|
llm_output_tokens = usage.get("completion_tokens", 0)
|
|
298
298
|
|
|
299
299
|
except ProviderError as e:
|
|
300
|
-
log.warning("Pipeline: LLM-Fehler
|
|
300
|
+
log.warning("Pipeline: LLM-Fehler - Fallback auf Rohtext: %s", e)
|
|
301
301
|
_do_insert(text)
|
|
302
302
|
else:
|
|
303
303
|
# Kein Mapping oder kein LLM-Provider -> Rohtext direkt einfuegen
|
|
@@ -326,10 +326,10 @@ class TranscriptionPipeline:
|
|
|
326
326
|
|
|
327
327
|
except ProviderError as e:
|
|
328
328
|
msg = str(e).split(": ", 1)[0] if ": " in str(e) else str(e)
|
|
329
|
-
log.error("Pipeline: STT-Fehler
|
|
329
|
+
log.error("Pipeline: STT-Fehler - %s", e)
|
|
330
330
|
_notify(STATUS_ERROR, msg)
|
|
331
331
|
except Exception as e:
|
|
332
|
-
log.error("Pipeline: Unerwarteter Fehler
|
|
332
|
+
log.error("Pipeline: Unerwarteter Fehler - %s", e, exc_info=True)
|
|
333
333
|
_notify(STATUS_ERROR, "Unerwarteter Fehler")
|
|
334
334
|
|
|
335
335
|
def process_async(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Abstrakte Basis-Klassen für API-Provider.
|
|
2
2
|
|
|
3
3
|
Definiert die Interfaces für STT- und LLM-Provider.
|
|
4
|
-
Aktuell nur GroqCloud implementiert
|
|
4
|
+
Aktuell nur GroqCloud implementiert - das Interface ermöglicht
|
|
5
5
|
zukünftige Erweiterung ohne Refactoring.
|
|
6
6
|
"""
|
|
7
7
|
|