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.
Files changed (50) hide show
  1. paypertranscript-0.2.3/PKG-INFO +111 -0
  2. paypertranscript-0.2.3/PayPerTranscript.egg-info/PKG-INFO +111 -0
  3. paypertranscript-0.2.3/README.md +82 -0
  4. paypertranscript-0.2.3/paypertranscript/__init__.py +3 -0
  5. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/__main__.py +2 -2
  6. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/styles/dark.qss +1 -1
  7. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/audio_manager.py +5 -5
  8. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/config.py +3 -3
  9. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/cost_tracker.py +1 -1
  10. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/recorder.py +6 -6
  11. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/text_inserter.py +5 -5
  12. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/updater.py +3 -3
  13. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/window_detector.py +2 -2
  14. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/pipeline/transcription.py +6 -6
  15. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/providers/base.py +1 -1
  16. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/app.py +16 -16
  17. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/overlay.py +3 -3
  18. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/settings.py +4 -4
  19. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/setup_wizard.py +28 -8
  20. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/statistics.py +8 -8
  21. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/tray.py +11 -11
  22. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/window_mapping.py +2 -2
  23. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/word_list.py +3 -3
  24. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/pyproject.toml +1 -1
  25. paypertranscript-0.2.1/PKG-INFO +0 -159
  26. paypertranscript-0.2.1/PayPerTranscript.egg-info/PKG-INFO +0 -159
  27. paypertranscript-0.2.1/README.md +0 -130
  28. paypertranscript-0.2.1/paypertranscript/__init__.py +0 -3
  29. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/LICENSE +0 -0
  30. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/PayPerTranscript.egg-info/SOURCES.txt +0 -0
  31. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/PayPerTranscript.egg-info/dependency_links.txt +0 -0
  32. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/PayPerTranscript.egg-info/entry_points.txt +0 -0
  33. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/PayPerTranscript.egg-info/requires.txt +0 -0
  34. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/PayPerTranscript.egg-info/top_level.txt +0 -0
  35. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/icons/app.ico +0 -0
  36. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/icons/app.png +0 -0
  37. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/icons/arrow_down.svg +0 -0
  38. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/sounds/start.wav +0 -0
  39. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/assets/sounds/stop.wav +0 -0
  40. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/__init__.py +0 -0
  41. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/hotkey.py +0 -0
  42. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/logging.py +0 -0
  43. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/paths.py +0 -0
  44. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/core/session_logger.py +0 -0
  45. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/pipeline/__init__.py +0 -0
  46. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/providers/__init__.py +0 -0
  47. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/providers/groq_provider.py +0 -0
  48. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/__init__.py +0 -0
  49. {paypertranscript-0.2.1 → paypertranscript-0.2.3}/paypertranscript/ui/dashboard.py +0 -0
  50. {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
+ [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
40
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://python.org)
41
+ [![Windows](https://img.shields.io/badge/platform-Windows-blue.svg)]()
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
+ [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
40
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://python.org)
41
+ [![Windows](https://img.shields.io/badge/platform-Windows-blue.svg)]()
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
+ [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
11
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://python.org)
12
+ [![Windows](https://img.shields.io/badge/platform-Windows-blue.svg)]()
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>
@@ -0,0 +1,3 @@
1
+ """PayPerTranscript - Voice-to-Text mit Pay-per-Use Pricing."""
2
+
3
+ __version__ = "0.2.3"
@@ -1,4 +1,4 @@
1
- """PayPerTranscript Entry Point.
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 initialisiert Logging und startet die PySide6-App."""
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
- /* PayPerTranscript Dark Theme Stylesheet
1
+ /* PayPerTranscript - Dark Theme Stylesheet
2
2
  *
3
3
  * Farbpalette (neutral, passend zum Overlay):
4
4
  * Hintergrund dunkel: #121218
@@ -1,4 +1,4 @@
1
- """Sound-Playback & Temp-File-Management für PayPerTranscript.
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 %s", name, e)
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 %s", sound_file.name, e)
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 %s", name, e)
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 %s", wav_file.name, e)
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
- """Konfigurationsmanagement für PayPerTranscript.
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 Fallback auf python.exe")
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 Voice-to-Text"
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
  """Kostenberechnung fuer PayPerTranscript.
2
2
 
3
3
  Reine Berechnungsfunktionen fuer STT- und LLM-Kosten.
4
- Keine I/O, keine Seiteneffekte einfach testbar.
4
+ Keine I/O, keine Seiteneffekte - einfach testbar.
5
5
  """
6
6
 
7
7
  from dataclasses import dataclass
@@ -1,7 +1,7 @@
1
- """Audio-Aufnahme für PayPerTranscript.
1
+ """Audio-Aufnahme für PayPerTranscript.
2
2
 
3
3
  Callback-basiertes Recording mit sounddevice (16kHz, Mono, int16).
4
- Persistenter Stream wird einmal erstellt und wiederverwendet.
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 sammelt Frames während der Aufnahme."""
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 keine Audio-Daten aufgenommen")
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 Dauer: %.2fs (%.2fs wall), %d Samples",
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.01.0) für Visualizer."""
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
- """Clipboard-basierte Texteinfügung für PayPerTranscript.
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 übersprungen")
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 wird als leer behandelt")
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 wird als leer behandelt")
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 versuche Fallback", e)
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 Version pruefen, installieren, neustarten.
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 uebersprungen")
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 -> %s installiere...", __version__, latest)
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
- """Foreground-Window-Erkennung für PayPerTranscript.
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 '%s'", process_name, window_title)
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:
@@ -1,4 +1,4 @@
1
- """Transkriptions-Pipeline fuer PayPerTranscript.
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 uebersprungen")
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 verwende Rohtext")
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 Fallback auf Rohtext: %s", e)
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 %s", e)
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 %s", e, exc_info=True)
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 das Interface ermöglicht
4
+ Aktuell nur GroqCloud implementiert - das Interface ermöglicht
5
5
  zukünftige Erweiterung ohne Refactoring.
6
6
  """
7
7