pygpt-net 2.6.26__py3-none-any.whl → 2.6.27__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.
Files changed (34) hide show
  1. pygpt_net/CHANGELOG.txt +4 -0
  2. pygpt_net/__init__.py +1 -1
  3. pygpt_net/controller/access/voice.py +3 -5
  4. pygpt_net/controller/audio/audio.py +9 -6
  5. pygpt_net/controller/audio/ui.py +263 -0
  6. pygpt_net/controller/chat/common.py +17 -1
  7. pygpt_net/controller/theme/theme.py +4 -1
  8. pygpt_net/core/audio/backend/native.py +113 -79
  9. pygpt_net/core/audio/backend/pyaudio.py +16 -19
  10. pygpt_net/core/audio/backend/pygame.py +12 -15
  11. pygpt_net/core/audio/capture.py +10 -9
  12. pygpt_net/core/audio/context.py +3 -6
  13. pygpt_net/data/config/config.json +6 -4
  14. pygpt_net/data/config/models.json +2 -2
  15. pygpt_net/data/config/settings.json +24 -10
  16. pygpt_net/data/locale/locale.de.ini +2 -0
  17. pygpt_net/data/locale/locale.en.ini +2 -0
  18. pygpt_net/data/locale/locale.es.ini +2 -0
  19. pygpt_net/data/locale/locale.fr.ini +2 -0
  20. pygpt_net/data/locale/locale.it.ini +2 -0
  21. pygpt_net/data/locale/locale.pl.ini +3 -1
  22. pygpt_net/data/locale/locale.uk.ini +2 -0
  23. pygpt_net/data/locale/locale.zh.ini +2 -0
  24. pygpt_net/plugin/audio_input/simple.py +5 -10
  25. pygpt_net/plugin/audio_output/plugin.py +4 -17
  26. pygpt_net/ui/layout/chat/input.py +5 -2
  27. pygpt_net/ui/main.py +1 -2
  28. pygpt_net/ui/widget/audio/bar.py +5 -1
  29. pygpt_net/ui/widget/textarea/input.py +475 -50
  30. {pygpt_net-2.6.26.dist-info → pygpt_net-2.6.27.dist-info}/METADATA +40 -35
  31. {pygpt_net-2.6.26.dist-info → pygpt_net-2.6.27.dist-info}/RECORD +34 -33
  32. {pygpt_net-2.6.26.dist-info → pygpt_net-2.6.27.dist-info}/LICENSE +0 -0
  33. {pygpt_net-2.6.26.dist-info → pygpt_net-2.6.27.dist-info}/WHEEL +0 -0
  34. {pygpt_net-2.6.26.dist-info → pygpt_net-2.6.27.dist-info}/entry_points.txt +0 -0
@@ -1429,7 +1429,20 @@
1429
1429
  "step": 1,
1430
1430
  "advanced": false,
1431
1431
  "tab": "device"
1432
- },
1432
+ },
1433
+ "audio.input.timeout": {
1434
+ "section": "audio",
1435
+ "type": "int",
1436
+ "slider": false,
1437
+ "label": "settings.audio.input.timeout",
1438
+ "description": "settings.audio.input.timeout.desc",
1439
+ "value": 120,
1440
+ "min": 0,
1441
+ "multiplier": 1,
1442
+ "step": 1,
1443
+ "advanced": false,
1444
+ "tab": "options"
1445
+ },
1433
1446
  "audio.input.stop_interval": {
1434
1447
  "section": "audio",
1435
1448
  "type": "int",
@@ -1444,16 +1457,17 @@
1444
1457
  "advanced": false,
1445
1458
  "tab": "options"
1446
1459
  },
1447
- "audio.input.timeout": {
1460
+ "audio.input.continuous": {
1448
1461
  "section": "audio",
1449
- "type": "int",
1462
+ "type": "bool",
1450
1463
  "slider": false,
1451
- "label": "settings.audio.input.timeout",
1452
- "description": "settings.audio.input.timeout.desc",
1453
- "value": 120,
1454
- "min": 0,
1455
- "multiplier": 1,
1456
- "step": 1,
1464
+ "label": "settings.audio.input.continuous",
1465
+ "description": "settings.audio.input.continuous.desc",
1466
+ "value": false,
1467
+ "min": null,
1468
+ "max": null,
1469
+ "multiplier": null,
1470
+ "step": null,
1457
1471
  "advanced": false,
1458
1472
  "tab": "options"
1459
1473
  },
@@ -1469,7 +1483,7 @@
1469
1483
  "step": null,
1470
1484
  "advanced": false,
1471
1485
  "tab": "options"
1472
- },
1486
+ },
1473
1487
  "audio.cache.enabled": {
1474
1488
  "section": "audio",
1475
1489
  "type": "bool",
@@ -1116,6 +1116,8 @@ settings.audio.input.backend = Backend für Audioeingabe
1116
1116
  settings.audio.input.backend.desc = Wählen Sie das Backend für die Audioeingabe.
1117
1117
  settings.audio.input.channels = Kanäle
1118
1118
  settings.audio.input.channels.desc = Eingabekanäle, Standard: 1
1119
+ settings.audio.input.continuous = Kontinuierliche Audioaufnahme (Stücke)
1120
+ settings.audio.input.continuous.desc = Aktivieren Sie die Aufnahme in Stücken für lange Audioaufnahmen im Notizblock (Sprachnotizen).
1119
1121
  settings.audio.input.device = Gerät für Audioeingabe
1120
1122
  settings.audio.input.device.desc = Wählen Sie das Gerät für Mikrofoneingang.
1121
1123
  settings.audio.input.rate = Abtastrate
@@ -1134,6 +1134,8 @@ settings.audio.input.backend = Audio Input Backend
1134
1134
  settings.audio.input.backend.desc = Select the audio input backend.
1135
1135
  settings.audio.input.channels = Channels
1136
1136
  settings.audio.input.channels.desc = Input channels, default: 1
1137
+ settings.audio.input.continuous = Continuous Audio Recording (Chunks)
1138
+ settings.audio.input.continuous.desc = Enable recording in chunks for long audio recordings in notepad (voice notes).
1137
1139
  settings.audio.input.device = Audio Input Device
1138
1140
  settings.audio.input.device.desc = Select the audio device for Microphone input.
1139
1141
  settings.audio.input.rate = Sampling Rate
@@ -1117,6 +1117,8 @@ settings.audio.input.backend = Backend para la entrada de audio
1117
1117
  settings.audio.input.backend.desc = Selecciona el backend para la entrada de audio.
1118
1118
  settings.audio.input.channels = Canaux
1119
1119
  settings.audio.input.channels.desc = Canaux d'entrée, par défaut : 1
1120
+ settings.audio.input.continuous = Grabación de Audio Continua (Fragmentos)
1121
+ settings.audio.input.continuous.desc = Habilitar grabación en fragmentos para grabaciones de audio largas en el bloc de notas (notas de voz).
1120
1122
  settings.audio.input.device = Dispositivo para la entrada de audio
1121
1123
  settings.audio.input.device.desc = Selecciona el dispositivo para la entrada del micrófono.
1122
1124
  settings.audio.input.rate = Taux d'échantillonnage
@@ -1116,6 +1116,8 @@ settings.audio.input.backend = Backend pour l'entrée audio
1116
1116
  settings.audio.input.backend.desc = Sélectionnez le backend pour l'entrée audio.
1117
1117
  settings.audio.input.channels = Canaux
1118
1118
  settings.audio.input.channels.desc = Canaux d'entrée, par défaut : 1
1119
+ settings.audio.input.continuous = Enregistrement Audio Continu (Morceaux)
1120
+ settings.audio.input.continuous.desc = Activer l'enregistrement en morceaux pour les longs enregistrements audio dans le bloc-notes (notes vocales).
1119
1121
  settings.audio.input.device = Périphérique pour l'entrée audio
1120
1122
  settings.audio.input.device.desc = Sélectionnez le périphérique pour l'entrée du microphone.
1121
1123
  settings.audio.input.rate = Taux d'échantillonnage
@@ -1116,6 +1116,8 @@ settings.audio.input.backend = Backend per l'ingresso audio
1116
1116
  settings.audio.input.backend.desc = Seleziona il backend per l'ingresso audio.
1117
1117
  settings.audio.input.channels = Canali
1118
1118
  settings.audio.input.channels.desc = Canali di ingresso, predefinito: 1
1119
+ settings.audio.input.continuous = Registrazione Audio Continua (Pezzi)
1120
+ settings.audio.input.continuous.desc = Abilita la registrazione a pezzi per lunghe registrazioni audio nei blocchi note (note vocali).
1119
1121
  settings.audio.input.device = Dispositivo per l'ingresso audio
1120
1122
  settings.audio.input.device.desc = Seleziona il dispositivo per l'ingresso del microfono.
1121
1123
  settings.audio.input.rate = Frequenza di campionamento
@@ -80,7 +80,7 @@ agent.eval.feedback = Feedback
80
80
  agent.eval.next = Ponowne uruchomienie z feedbackiem
81
81
  agent.eval.score = Ocena ewaluatora
82
82
  agent.eval.score.good = Odpowiedź wystarczająco dobra, wychodzenie.
83
- agent.evolve.generation = Generacja
83
+ agent.evolve.generation = Generacja
84
84
  agent.evolve.maxgen_limit = Osiągnięto maksymalną liczbę generacji, wychodzenie.
85
85
  agent.evolve.option.max_generations = Maksymalna liczba generacji
86
86
  agent.evolve.option.num_parents = Liczba rodziców
@@ -1117,6 +1117,8 @@ settings.audio.input.backend = Backend dla wejścia audio
1117
1117
  settings.audio.input.backend.desc = Wybierz backend dla wejścia audio.
1118
1118
  settings.audio.input.channels = Kanały
1119
1119
  settings.audio.input.channels.desc = Kanały wejściowe, domyślnie: 1
1120
+ settings.audio.input.continuous = Ciągłe Nagrywanie Dźwięku (Kawałki)
1121
+ settings.audio.input.continuous.desc = Włącz nagrywanie w kawałkach dla długich nagrań audio w notatniku (notatki głosowe).
1120
1122
  settings.audio.input.device = Urządzenie do wejścia audio
1121
1123
  settings.audio.input.device.desc = Wybierz urządzenie do wejścia mikrofonu.
1122
1124
  settings.audio.input.rate = Częstotliwość próbkowania
@@ -1116,6 +1116,8 @@ settings.audio.input.backend = Бекенд для аудіовходу
1116
1116
  settings.audio.input.backend.desc = Виберіть бекенд для аудіовходу.
1117
1117
  settings.audio.input.channels = Канали
1118
1118
  settings.audio.input.channels.desc = Вхідні канали, за замовчуванням: 1
1119
+ settings.audio.input.continuous = Безперервний Аудіозапис (Частини)
1120
+ settings.audio.input.continuous.desc = Увімкніть запис частинами для довгих аудіозаписів у блокноті (голосові нотатки).
1119
1121
  settings.audio.input.device = Пристрій для аудіовходу
1120
1122
  settings.audio.input.device.desc = Виберіть пристрій для входу мікрофону.
1121
1123
  settings.audio.input.rate = Частота дискретизації
@@ -1116,6 +1116,8 @@ settings.audio.input.backend = 音频输入的后端
1116
1116
  settings.audio.input.backend.desc = 选择音频输入的后端。
1117
1117
  settings.audio.input.channels = 声道
1118
1118
  settings.audio.input.channels.desc = 输入声道,默认: 1
1119
+ settings.audio.input.continuous = 连续音频录制(片段)
1120
+ settings.audio.input.continuous.desc = 启用记事本中的长音频录制分段记录(语音笔记)。
1119
1121
  settings.audio.input.device = 音频输入的设备
1120
1122
  settings.audio.input.device.desc = 选择用于麦克风输入的音频设备。
1121
1123
  settings.audio.input.rate = 采样率
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.08.07 03:00:00 #
9
+ # Updated Date: 2025.08.27 07:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -41,14 +41,11 @@ class Simple:
41
41
 
42
42
  def switch_btn_stop(self):
43
43
  """Switch button to stop"""
44
- self.plugin.window.ui.plugin_addon['audio.input.btn'].btn_toggle.setText(trans('audio.speak.btn.stop'))
45
- self.plugin.window.ui.plugin_addon['audio.input.btn'].btn_toggle.setToolTip(
46
- trans('audio.speak.btn.stop.tooltip'))
44
+ self.plugin.window.controller.audio.ui.on_input_begin("input")
47
45
 
48
46
  def switch_btn_start(self):
49
47
  """Switch button to start"""
50
- self.plugin.window.ui.plugin_addon['audio.input.btn'].btn_toggle.setText(trans('audio.speak.btn'))
51
- self.plugin.window.ui.plugin_addon['audio.input.btn'].btn_toggle.setToolTip(trans('audio.speak.btn.tooltip'))
48
+ self.plugin.window.controller.audio.ui.on_input_end("input")
52
49
 
53
50
  def stop_timeout(self):
54
51
  """Stop timeout"""
@@ -85,10 +82,8 @@ class Simple:
85
82
  # stop audio output if playing
86
83
  self.plugin.window.controller.audio.stop_output()
87
84
 
88
- # set audio volume bar
89
- self.plugin.window.core.audio.capture.set_bar(
90
- self.plugin.window.ui.plugin_addon['audio.input.btn'].bar
91
- )
85
+ # set audio input mode
86
+ self.plugin.window.core.audio.capture.set_mode("input")
92
87
 
93
88
  # start timeout timer to prevent infinite recording
94
89
  # disable in continuous mode
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.08.15 23:00:00 #
9
+ # Updated Date: 2025.08.27 07:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from typing import Any
@@ -250,7 +250,8 @@ class Plugin(BasePlugin):
250
250
  worker.signals.stop.connect(self.handle_stop)
251
251
  worker.signals.volume_changed.connect(self.handle_volume)
252
252
 
253
- self.window.controller.audio.on_begin("")
253
+ if not self.window.controller.audio.ui.recording:
254
+ self.window.controller.audio.on_begin("")
254
255
 
255
256
  backend = self.window.core.config.get("audio.output.backend", "native")
256
257
  if backend == "native":
@@ -275,20 +276,6 @@ class Plugin(BasePlugin):
275
276
  """
276
277
  self.window.ui.plugin_addon['audio.output'].set_status(status)
277
278
 
278
- def show_stop_button(self):
279
- """Show stop button"""
280
- self.window.ui.plugin_addon['audio.output'].stop.setVisible(True)
281
-
282
- def hide_stop_button(self):
283
- """Hide stop button"""
284
- self.window.ui.plugin_addon['audio.output'].stop.setVisible(False)
285
-
286
- def stop_speak(self):
287
- """Stop speaking"""
288
- self.window.ui.plugin_addon['audio.output'].stop.setVisible(False)
289
- self.window.ui.plugin_addon['audio.output'].set_status('Stopped')
290
- self.window.ui.plugin_addon['audio.output'].stop_audio()
291
-
292
279
  def stop_audio(self):
293
280
  """
294
281
  Event: AUDIO_OUTPUT_STOP
@@ -336,4 +323,4 @@ class Plugin(BasePlugin):
336
323
 
337
324
  :param volume: volume level
338
325
  """
339
- self.window.ui.plugin_addon['audio.output.bar'].setLevel(volume)
326
+ self.window.controller.audio.ui.on_output_volume_change(int(volume))
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.08.24 23:00:00 #
9
+ # Updated Date: 2025.08.27 07:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from functools import partial
@@ -149,6 +149,9 @@ class Input:
149
149
  self.window.ui.plugin_addon['audio.input'] = AudioInput(self.window)
150
150
  self.window.ui.plugin_addon['audio.input.btn'] = AudioInputButton(self.window)
151
151
 
152
+ self.window.ui.plugin_addon['audio.input'].setVisible(False)
153
+ self.window.ui.plugin_addon['audio.input.btn'].setVisible(False)
154
+
152
155
  grid = QGridLayout()
153
156
 
154
157
  center_layout = QHBoxLayout()
@@ -204,7 +207,7 @@ class Input:
204
207
 
205
208
  nodes['input.stop_btn'] = QPushButton(trans("input.btn.stop"))
206
209
  nodes['input.stop_btn'].setVisible(False)
207
- nodes['input.stop_btn'].clicked.connect(controller.kernel.stop)
210
+ nodes['input.stop_btn'].clicked.connect(controller.chat.common.handle_stop)
208
211
 
209
212
  nodes['input.update_btn'] = QPushButton(trans("input.btn.update"))
210
213
  nodes['input.update_btn'].setVisible(False)
pygpt_net/ui/main.py CHANGED
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.08.24 23:00:00 #
9
+ # Updated Date: 2025.08.27 07:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -254,7 +254,6 @@ class MainWindow(QMainWindow, QtStyleTools):
254
254
  """
255
255
  message = message if isinstance(message, str) else str(message)
256
256
  self.dispatch(KernelEvent(KernelEvent.STATUS, {"status": message}))
257
- del message # free memory
258
257
 
259
258
  @Slot(str)
260
259
  def update_state(self, state: str):
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.08.24 23:00:00 #
9
+ # Updated Date: 2025.08.27 07:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import Qt
@@ -25,6 +25,8 @@ class InputBar(QWidget):
25
25
 
26
26
  :param level: level
27
27
  """
28
+ if self._level == level:
29
+ return
28
30
  self._level = level
29
31
  self.update()
30
32
 
@@ -69,6 +71,8 @@ class OutputBar(QWidget):
69
71
 
70
72
  :param level: level
71
73
  """
74
+ if self._level == level:
75
+ return
72
76
  self._level = level
73
77
  self.update()
74
78