pygpt-net 2.4.49__py3-none-any.whl → 2.4.51__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. CHANGELOG.md +10 -0
  2. README.md +12 -62
  3. pygpt_net/CHANGELOG.txt +10 -0
  4. pygpt_net/__init__.py +3 -3
  5. pygpt_net/controller/access/voice.py +19 -36
  6. pygpt_net/controller/audio/__init__.py +15 -1
  7. pygpt_net/controller/lang/custom.py +2 -1
  8. pygpt_net/controller/ui/tabs.py +7 -1
  9. pygpt_net/core/audio/__init__.py +10 -17
  10. pygpt_net/core/audio/capture.py +349 -0
  11. pygpt_net/data/config/config.json +5 -3
  12. pygpt_net/data/config/models.json +3 -3
  13. pygpt_net/data/config/modes.json +3 -3
  14. pygpt_net/data/config/settings.json +13 -0
  15. pygpt_net/data/locale/locale.de.ini +3 -0
  16. pygpt_net/data/locale/locale.en.ini +3 -0
  17. pygpt_net/data/locale/locale.es.ini +3 -0
  18. pygpt_net/data/locale/locale.fr.ini +3 -0
  19. pygpt_net/data/locale/locale.it.ini +3 -0
  20. pygpt_net/data/locale/locale.pl.ini +3 -0
  21. pygpt_net/data/locale/locale.uk.ini +3 -0
  22. pygpt_net/data/locale/locale.zh.ini +3 -0
  23. pygpt_net/plugin/audio_input/simple.py +45 -55
  24. pygpt_net/provider/core/config/patch.py +9 -1
  25. pygpt_net/ui/layout/chat/input.py +0 -12
  26. pygpt_net/ui/menu/__init__.py +4 -3
  27. pygpt_net/ui/widget/audio/input_button.py +84 -24
  28. pygpt_net/ui/widget/dialog/snap.py +2 -2
  29. pygpt_net/ui/widget/dialog/update.py +3 -2
  30. {pygpt_net-2.4.49.dist-info → pygpt_net-2.4.51.dist-info}/METADATA +13 -63
  31. {pygpt_net-2.4.49.dist-info → pygpt_net-2.4.51.dist-info}/RECORD +34 -33
  32. {pygpt_net-2.4.49.dist-info → pygpt_net-2.4.51.dist-info}/LICENSE +0 -0
  33. {pygpt_net-2.4.49.dist-info → pygpt_net-2.4.51.dist-info}/WHEEL +0 -0
  34. {pygpt_net-2.4.49.dist-info → pygpt_net-2.4.51.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,349 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ================================================== #
4
+ # This file is a part of PYGPT package #
5
+ # Website: https://pygpt.net #
6
+ # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
+ # MIT License #
8
+ # Created By : Marcin Szczygliński #
9
+ # Updated Date: 2025.01.17 02:00:00 #
10
+ # ================================================== #
11
+
12
+ import time
13
+
14
+ import numpy as np
15
+ import wave
16
+
17
+ from PySide6.QtMultimedia import QAudioFormat, QMediaDevices, QAudioSource
18
+ from PySide6.QtCore import QTimer
19
+
20
+ class Capture:
21
+ def __init__(self, window=None):
22
+ """
23
+ Audio input capture core
24
+
25
+ :param window: Window instance
26
+ """
27
+ self.window = window
28
+ self.audio_source = None
29
+ self.audio_io_device = None
30
+ self.frames = []
31
+ self.actual_audio_format = None
32
+ self.path = None
33
+ self.disconnected = False
34
+ self.loop = False
35
+ self.stop_callback = None
36
+ self.start_time = 0
37
+ self.devices = []
38
+ self.selected_device = None
39
+ self.bar = None
40
+ self.check_audio_devices()
41
+
42
+ def set_path(self, path: str):
43
+ """
44
+ Set audio input file path
45
+
46
+ :param path: file path
47
+ """
48
+ self.path = path
49
+
50
+ def set_bar(self, bar):
51
+ """
52
+ Set audio level bar
53
+
54
+ :param bar: audio level bar
55
+ """
56
+ self.bar = bar
57
+
58
+ def check_audio_devices(self):
59
+ """Check audio input devices"""
60
+ self.devices = QMediaDevices.audioInputs()
61
+ if not self.devices:
62
+ # no devices found
63
+ self.selected_device = None
64
+ print("No audio input devices found.")
65
+ else:
66
+ # set the first device as default
67
+ self.selected_device = self.devices[0]
68
+
69
+ def device_changed(self, index: int):
70
+ """
71
+ Change audio input device
72
+
73
+ :param index: device index
74
+ """
75
+ if 0 <= index < len(self.devices):
76
+ self.selected_device = self.devices[index]
77
+ else:
78
+ self.selected_device = None
79
+
80
+ def prepare_device(self):
81
+ """Set the current audio input device"""
82
+ device_id = int(self.window.core.config.get('audio.input.device', 0))
83
+ self.device_changed(device_id)
84
+
85
+ def start(self):
86
+ """
87
+ Start audio input recording
88
+
89
+ :return: True if started
90
+ """
91
+ # Clear previous frames
92
+ self.frames = []
93
+
94
+ # Prepare selected device
95
+ self.prepare_device()
96
+ if not self.selected_device:
97
+ print("No audio input device selected")
98
+ return
99
+ if self.disconnected:
100
+ print("Audio source disconnected, please connect the audio source")
101
+ return False
102
+
103
+ # Prevent multiple recordings
104
+ if self.audio_source is not None:
105
+ return False
106
+
107
+ # Set up audio input and start recording
108
+ self.setup_audio_input()
109
+ self.start_time = time.time()
110
+ return True
111
+
112
+ def stop(self):
113
+ """
114
+ Stop audio input recording
115
+
116
+ :return: True if stopped
117
+ """
118
+ result = False
119
+ if self.audio_source is not None:
120
+ # Disconnect the readyRead signal
121
+ self.audio_io_device.readyRead.disconnect(self.process_audio_input)
122
+ self.audio_source.stop()
123
+ self.audio_source = None
124
+ self.audio_io_device = None
125
+
126
+ # Save frames to file (if any)
127
+ if self.frames:
128
+ self.save_audio_file(self.path)
129
+ result = True
130
+ else:
131
+ print("No audio data recorded")
132
+ return result
133
+
134
+ def has_source(self) -> bool:
135
+ """
136
+ Check if audio source is available
137
+
138
+ :return: True if available
139
+ """
140
+ if self.audio_source is not None:
141
+ return True
142
+ return False
143
+
144
+ def has_frames(self) -> bool:
145
+ """
146
+ Check if audio frames are available
147
+
148
+ :return: True if available
149
+ """
150
+ if self.frames:
151
+ return True
152
+ return False
153
+
154
+ def get_frames(self) -> list:
155
+ """
156
+ Get recorded audio frames
157
+
158
+ :return: list of frames
159
+ """
160
+ return self.frames
161
+
162
+ def setup_audio_input(self):
163
+ """Set up audio input device and start recording"""
164
+ if not self.selected_device:
165
+ print("No audio input device selected")
166
+ return
167
+
168
+ # Define audio format
169
+ audio_format = QAudioFormat()
170
+ audio_format.setSampleRate(int(self.window.core.config.get('audio.input.rate', 44100)))
171
+ audio_format.setChannelCount(int(self.window.core.config.get('audio.input.channels', 1)))
172
+ audio_format.setSampleFormat(QAudioFormat.SampleFormat.Int16)
173
+
174
+ # Select default audio input device
175
+ audio_input_device = self.selected_device
176
+
177
+ # Check if the format is supported
178
+ if not audio_input_device.isFormatSupported(audio_format):
179
+ print("Requested format not supported, using nearest format.")
180
+ audio_format = audio_input_device.preferredFormat()
181
+
182
+ # Store the actual format being used
183
+ self.actual_audio_format = audio_format
184
+
185
+ # Create QAudioSource object with the device and format
186
+ try:
187
+ self.audio_source = QAudioSource(audio_input_device, audio_format)
188
+ except Exception as e:
189
+ self.disconnected = True
190
+ print(f"Failed to create audio source: {e}")
191
+
192
+ # Start audio input and obtain the QIODevice
193
+ try:
194
+ self.audio_io_device = self.audio_source.start()
195
+ if self.audio_io_device is None:
196
+ raise Exception("Unable to access audio input device")
197
+ except Exception as e:
198
+ print(f"Failed to start audio input: {e}")
199
+ self.disconnected = True
200
+ self.audio_source = None
201
+ self.audio_io_device = None
202
+ return
203
+
204
+ # Connect the readyRead signal to process incoming data
205
+ self.audio_io_device.readyRead.connect(self.process_audio_input)
206
+
207
+ def process_audio_input(self):
208
+ """Process incoming audio data"""
209
+ # add seconds to stop timer
210
+ data = self.audio_io_device.readAll()
211
+ if data.isEmpty():
212
+ return
213
+
214
+ # Convert QByteArray to bytes
215
+ data_bytes = data.data()
216
+
217
+ # Append raw data to frames list for saving
218
+ self.frames.append(data_bytes)
219
+
220
+ # Determine the correct dtype and normalization factor
221
+ sample_format = self.actual_audio_format.sampleFormat()
222
+ dtype = self.get_dtype_from_sample_format(sample_format)
223
+ normalization_factor = self.get_normalization_factor(sample_format)
224
+
225
+ # Convert bytes to NumPy array of the appropriate type
226
+ samples = np.frombuffer(data_bytes, dtype=dtype)
227
+ if samples.size == 0:
228
+ return
229
+
230
+ # For unsigned formats, center the data
231
+ if sample_format == QAudioFormat.SampleFormat.UInt8:
232
+ samples = samples.astype(np.int16)
233
+ samples -= 128
234
+
235
+ # Compute RMS of the audio samples as float64 for precision
236
+ rms = np.sqrt(np.mean(samples.astype(np.float64) ** 2))
237
+
238
+ # Normalize RMS value based on the sample format
239
+ level = rms / normalization_factor
240
+
241
+ # Ensure level is within 0.0 to 1.0
242
+ level = min(max(level, 0.0), 1.0)
243
+
244
+ # Scale to 0-100
245
+ level_percent = level * 100
246
+
247
+ # Update the level bar widget
248
+ self.update_audio_level(level_percent)
249
+
250
+ # Handle loop recording
251
+ if self.loop and self.stop_callback is not None:
252
+ stop_interval = int(self.window.core.config.get('audio.input.stop_interval', 10))
253
+ current_time = time.time()
254
+ time_elapsed = current_time - self.start_time
255
+ if time_elapsed >= stop_interval:
256
+ # stop recording here, save audio chunk to WAV file, run transcription, and start recording again
257
+ self.start_time = current_time
258
+ QTimer.singleShot(0, self.stop_callback) # required QTimer to prevent crash!!!
259
+
260
+ def update_audio_level(self, level: int):
261
+ """
262
+ Update the audio level bar
263
+
264
+ :param level: audio level
265
+ """
266
+ if self.bar is not None:
267
+ self.bar.setLevel(level)
268
+
269
+ def reset_audio_level(self):
270
+ """Reset the audio level bar"""
271
+ if self.bar is not None:
272
+ self.bar.setLevel(0)
273
+
274
+ def save_audio_file(self, filename: str):
275
+ """
276
+ Save the recorded audio frames to a WAV file
277
+
278
+ :param filename: output file name
279
+ """
280
+ # Define the parameters for the WAV file
281
+ channels = self.actual_audio_format.channelCount()
282
+ sample_size = self.actual_audio_format.bytesPerSample()
283
+ frame_rate = self.actual_audio_format.sampleRate()
284
+
285
+ # Open the WAV file
286
+ wf = wave.open(filename, 'wb')
287
+ wf.setnchannels(channels)
288
+ wf.setsampwidth(sample_size)
289
+ wf.setframerate(frame_rate)
290
+
291
+ # Write frames to the file
292
+ wf.writeframes(b''.join(self.frames))
293
+ wf.close()
294
+
295
+ def get_dtype_from_sample_format(self, sample_format):
296
+ """
297
+ Get the NumPy dtype corresponding to the QAudioFormat sample format
298
+
299
+ :param sample_format: QAudioFormat.SampleFormat
300
+ """
301
+ if sample_format == QAudioFormat.SampleFormat.UInt8:
302
+ return np.uint8
303
+ elif sample_format == QAudioFormat.SampleFormat.Int16:
304
+ return np.int16
305
+ elif sample_format == QAudioFormat.SampleFormat.Int32:
306
+ return np.int32
307
+ elif sample_format == QAudioFormat.SampleFormat.Float:
308
+ return np.float32
309
+ else:
310
+ raise ValueError("Unsupported sample format")
311
+
312
+ def get_normalization_factor(self, sample_format):
313
+ """
314
+ Get the normalization factor for the QAudioFormat sample format
315
+
316
+ :param sample_format: QAudioFormat.SampleFormat
317
+ """
318
+ if sample_format == QAudioFormat.SampleFormat.UInt8:
319
+ return 255.0
320
+ elif sample_format == QAudioFormat.SampleFormat.Int16:
321
+ return 32768.0
322
+ elif sample_format == QAudioFormat.SampleFormat.Int32:
323
+ return float(2 ** 31)
324
+ elif sample_format == QAudioFormat.SampleFormat.Float:
325
+ return 1.0
326
+ else:
327
+ raise ValueError("Unsupported sample format")
328
+
329
+ def check_audio_input(self) -> bool:
330
+ """
331
+ Check if default audio input device is working
332
+
333
+ :return: True if working
334
+ """
335
+ import pyaudio
336
+ try:
337
+ rate = 44100
338
+ channels = 1
339
+ p = pyaudio.PyAudio()
340
+ stream = p.open(format=pyaudio.paInt16,
341
+ channels=channels,
342
+ rate=rate,
343
+ input=True)
344
+ stream.stop_stream()
345
+ stream.close()
346
+ p.terminate()
347
+ return True
348
+ except Exception as e:
349
+ return False
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.49",
4
- "app.version": "2.4.49",
5
- "updated_at": "2025-01-16T00:00:00"
3
+ "version": "2.4.51",
4
+ "app.version": "2.4.51",
5
+ "updated_at": "2025-01-17T00:00:00"
6
6
  },
7
7
  "access.audio.event.speech": false,
8
8
  "access.audio.event.speech.disabled": [],
@@ -74,8 +74,10 @@
74
74
  "attachments_send_clear": true,
75
75
  "attachments_capture_clear": true,
76
76
  "audio.input.channels": 1,
77
+ "audio.input.continuous": false,
77
78
  "audio.input.device": "0",
78
79
  "audio.input.rate": 44100,
80
+ "audio.input.stop_interval": 10,
79
81
  "audio.transcribe.convert_video": true,
80
82
  "context_threshold": 200,
81
83
  "cmd": false,
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.49",
4
- "app.version": "2.4.49",
5
- "updated_at": "2025-01-16T00:00:00"
3
+ "version": "2.4.51",
4
+ "app.version": "2.4.51",
5
+ "updated_at": "2025-01-17T00:00:00"
6
6
  },
7
7
  "items": {
8
8
  "claude-3-5-sonnet-20240620": {
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.49",
4
- "app.version": "2.4.49",
5
- "updated_at": "2025-01-16T00:00:00"
3
+ "version": "2.4.51",
4
+ "app.version": "2.4.51",
5
+ "updated_at": "2025-01-17T00:00:00"
6
6
  },
7
7
  "items": {
8
8
  "chat": {
@@ -1123,6 +1123,19 @@
1123
1123
  "step": 1,
1124
1124
  "advanced": false
1125
1125
  },
1126
+ "audio.input.stop_interval": {
1127
+ "section": "audio",
1128
+ "type": "int",
1129
+ "slider": true,
1130
+ "label": "settings.audio.input.stop_interval",
1131
+ "description": "settings.audio.input.stop_interval.desc",
1132
+ "value": 10,
1133
+ "min": 5,
1134
+ "max": 120,
1135
+ "multiplier": 1,
1136
+ "step": 1,
1137
+ "advanced": false
1138
+ },
1126
1139
  "llama.idx.list": {
1127
1140
  "section": "llama-index",
1128
1141
  "type": "dict",
@@ -135,6 +135,7 @@ audio.magic_word.detected = Zauberwort erkannt!
135
135
  audio.magic_word.invalid = Kein Zauberwort :(
136
136
  audio.magic_word.please = Bitte das Zauberwort...
137
137
  audio.speak.btn = Mikrofon
138
+ audio.speak.btn.continuous = Kontinuierliche Aufzeichnung
138
139
  audio.speak.btn.stop = Stopp
139
140
  audio.speak.btn.stop.tooltip = Klicken, um das Mikrofonhören zu beenden
140
141
  audio.speak.btn.tooltip = Klicken, um das Mikrofonhören zu starten
@@ -774,6 +775,8 @@ settings.audio.input.device = Audioeingabegerät
774
775
  settings.audio.input.device.desc = Wählen Sie das Audiogerät für die Mikrofoneingabe.
775
776
  settings.audio.input.rate = Abtastrate
776
777
  settings.audio.input.rate.desc = Abtastrate, Standard: 44100
778
+ settings.audio.input.stop_interval = Intervall für kontinuierliche automatische Transkription
779
+ settings.audio.input.stop_interval.desc = Intervall in Sekunden für automatisches Transkribieren eines Audioabschnitts, Standard: 10
777
780
  settings.check_updates = Beim Start nach Updates suchen
778
781
  settings.check_updates.bg = Im Hintergrund nach Updates suchen
779
782
  settings.cmd.field.desc = Aktivieren Sie das `{cmd}`-Werkzeug.
@@ -147,6 +147,7 @@ audio.magic_word.detected = Magic word detected!
147
147
  audio.magic_word.invalid = Not a magic word :(
148
148
  audio.magic_word.please = Magic word please...
149
149
  audio.speak.btn = Microphone
150
+ audio.speak.btn.continuous = Continuous recording
150
151
  audio.speak.btn.stop = Stop
151
152
  audio.speak.btn.stop.tooltip = Click to stop microphone listening
152
153
  audio.speak.btn.tooltip = Click to start microphone listening
@@ -945,6 +946,8 @@ settings.audio.input.device = Audio Input Device
945
946
  settings.audio.input.device.desc = Select the audio device for Microphone input.
946
947
  settings.audio.input.rate = Sampling Rate
947
948
  settings.audio.input.rate.desc = Sampling rate, default: 44100
949
+ settings.audio.input.stop_interval = Continuous recording auto-transcribe interval
950
+ settings.audio.input.stop_interval.desc = Interval in seconds for auto-transcribe audio chunk, default: 10
948
951
  settings.check_updates = Check for Updates on start
949
952
  settings.check_updates.bg = Check for Updates in the background
950
953
  settings.cmd.config.collapse = JSON params
@@ -135,6 +135,7 @@ audio.magic_word.detected = ¡Palabra mágica detectada!
135
135
  audio.magic_word.invalid = No es una palabra mágica :(
136
136
  audio.magic_word.please = Por favor, una palabra mágica...
137
137
  audio.speak.btn = Micrófono
138
+ audio.speak.btn.continuous = Grabación continua
138
139
  audio.speak.btn.stop = Detener
139
140
  audio.speak.btn.stop.tooltip = Haz clic para dejar de escuchar a través del micrófono
140
141
  audio.speak.btn.tooltip = Haz clic para empezar a escuchar a través del micrófono
@@ -773,6 +774,8 @@ settings.audio.input.device = Dispositivo de Entrada de Audio
773
774
  settings.audio.input.device.desc = Selecciona el dispositivo de audio para la entrada del micrófono.
774
775
  settings.audio.input.rate = Taux d'échantillonnage
775
776
  settings.audio.input.rate.desc = Taux d'échantillonnage, par défaut : 44100
777
+ settings.audio.input.stop_interval = Intervalo de transcripción automática continua
778
+ settings.audio.input.stop_interval.desc = Intervalo en segundos para transcribir automáticamente el fragmento de audio, predeterminado: 10
776
779
  settings.check_updates = Buscar actualizaciones al iniciar
777
780
  settings.check_updates.bg = Buscar actualizaciones en segundo plano
778
781
  settings.cmd.field.desc = Habilitar la herramienta `{cmd}`.
@@ -135,6 +135,7 @@ audio.magic_word.detected = Mot magique détecté !
135
135
  audio.magic_word.invalid = Pas un mot magique :(
136
136
  audio.magic_word.please = S'il vous plaît, le mot magique...
137
137
  audio.speak.btn = Microphone
138
+ audio.speak.btn.continuous = Enregistrement continu
138
139
  audio.speak.btn.stop = Arrêt
139
140
  audio.speak.btn.stop.tooltip = Cliquez pour arrêter l'écoute par le microphone
140
141
  audio.speak.btn.tooltip = Cliquez pour commencer l'écoute par le microphone
@@ -773,6 +774,8 @@ settings.audio.input.device = Périphérique d'Entrée Audio
773
774
  settings.audio.input.device.desc = Sélectionnez le périphérique audio pour l'entrée du microphone.
774
775
  settings.audio.input.rate = Taux d'échantillonnage
775
776
  settings.audio.input.rate.desc = Taux d'échantillonnage, par défaut : 44100
777
+ settings.audio.input.stop_interval = Intervalle d'auto-transcription enregistrement continu
778
+ settings.audio.input.stop_interval.desc = Intervalle en secondes pour la transcription automatique d'un morceau audio, par défaut : 10
776
779
  settings.check_updates = Vérifier les mises à jour au démarrage
777
780
  settings.check_updates.bg = Vérifier les mises à jour en arrière-plan
778
781
  settings.cmd.field.desc = Activer l'outil `{cmd}`.
@@ -135,6 +135,7 @@ audio.magic_word.detected = Parola magica rilevata!
135
135
  audio.magic_word.invalid = Non è una parola magica :(
136
136
  audio.magic_word.please = Per favore, parola magica...
137
137
  audio.speak.btn = Microfono
138
+ audio.speak.btn.continuous = Registrazione continua
138
139
  audio.speak.btn.stop = Stop
139
140
  audio.speak.btn.stop.tooltip = Clicca per terminare l'ascolto tramite microfono
140
141
  audio.speak.btn.tooltip = Clicca per iniziare l'ascolto tramite microfono
@@ -774,6 +775,8 @@ settings.audio.input.device = Dispositivo di Ingresso Audio
774
775
  settings.audio.input.device.desc = Seleziona il dispositivo audio per l'ingresso del microfono.
775
776
  settings.audio.input.rate = Frequenza di campionamento
776
777
  settings.audio.input.rate.desc = Frequenza di campionamento, predefinito: 44100
778
+ settings.audio.input.stop_interval = Intervallo di trascrizione automatica continua
779
+ settings.audio.input.stop_interval.desc = Intervallo in secondi per la trascrizione automatica del segmento audio, predefinito: 10
777
780
  settings.check_updates = Controlla aggiornamenti all'avvio
778
781
  settings.check_updates.bg = Controlla gli aggiornamenti in background
779
782
  settings.cmd.field.desc = Abilita lo strumento `{cmd}`.
@@ -135,6 +135,7 @@ audio.magic_word.detected = Wykryto magiczne słowo!
135
135
  audio.magic_word.invalid = To nie magiczne słowo :(
136
136
  audio.magic_word.please = Podaj magiczne słowo...
137
137
  audio.speak.btn = Mikrofon
138
+ audio.speak.btn.continuous = Ciągłe nagrywanie
138
139
  audio.speak.btn.stop = Stop
139
140
  audio.speak.btn.stop.tooltip = Kliknij, aby zakończyć nasłuchiwanie przez mikrofon
140
141
  audio.speak.btn.tooltip = Kliknij, aby rozpocząć nasłuchiwanie przez mikrofon
@@ -774,6 +775,8 @@ settings.audio.input.device = Urządzenie Wejściowe Audio
774
775
  settings.audio.input.device.desc = Wybierz urządzenie audio dla wejścia mikrofonu.
775
776
  settings.audio.input.rate = Częstotliwość próbkowania
776
777
  settings.audio.input.rate.desc = Częstotliwość próbkowania, domyślnie: 44100
778
+ settings.audio.input.stop_interval = Interwał automatycznego transkrybowania nagrania ciągłego
779
+ settings.audio.input.stop_interval.desc = Interwał w sekundach dla automatycznego transkrybowania fragmentu audio, domyślnie: 10
777
780
  settings.check_updates = Sprawdź aktualizacje przy starcie
778
781
  settings.check_updates.bg = Sprawdź aktualizacje w tle
779
782
  settings.cmd.field.desc = Włącz narzędzie `{cmd}`.
@@ -135,6 +135,7 @@ audio.magic_word.detected = Магічне слово виявлено!
135
135
  audio.magic_word.invalid = Не магічне слово :(
136
136
  audio.magic_word.please = Магічне слово, будь ласка...
137
137
  audio.speak.btn = Мікрофон
138
+ audio.speak.btn.continuous = Безперервний запис
138
139
  audio.speak.btn.stop = Стоп
139
140
  audio.speak.btn.stop.tooltip = Натисніть, щоб закінчити слухання через мікрофон
140
141
  audio.speak.btn.tooltip = Натисніть, щоб почати слухання через мікрофон
@@ -773,6 +774,8 @@ settings.audio.input.device = Аудіо Вхідний Пристрій
773
774
  settings.audio.input.device.desc = Виберіть аудіо пристрій для введення мікрофона.
774
775
  settings.audio.input.rate = Частота дискретизації
775
776
  settings.audio.input.rate.desc = Частота дискретизації, за замовчуванням: 44100
777
+ settings.audio.input.stop_interval = Інтервал автоматичного транскрибування безперервного запису
778
+ settings.audio.input.stop_interval.desc = Інтервал у секундах для автоматичного транскрибування фрагмента аудіо, за замовчуванням: 10
776
779
  settings.check_updates = Перевіряти оновлення при запуску
777
780
  settings.check_updates.bg = Перевіряти оновлення у фоновому режимі
778
781
  settings.cmd.field.desc = Увімкнути інструмент `{cmd}`.
@@ -136,6 +136,7 @@ audio.control.btn = 语音控制
136
136
  audio.magic_word.detected = 檢測到魔法詞!
137
137
  audio.magic_word.invalid= 不是魔法詞 :(
138
138
  audio.magic_word.please= 請說出魔法詞...
139
+ audio.speak.btn.continuous = 连续录音
139
140
  audio.speak.btn.stop = 停止
140
141
  audio.speak.btn.stop.tooltip = 點擊停止麥克風聆聽
141
142
  audio.speak.btn.tooltip = 點擊開始麥克風聆聽
@@ -875,6 +876,8 @@ settings.audio.input.device = 音频输入设备
875
876
  settings.audio.input.device.desc = 选择用于麦克风输入的音频设备。
876
877
  settings.audio.input.rate = 采样率
877
878
  settings.audio.input.rate.desc = 采样率,默认: 44100
879
+ settings.audio.input.stop_interval = 连续录音自动转录间隔
880
+ settings.audio.input.stop_interval.desc = 自动转录音频片段的间隔(以秒为单位),默认:10
878
881
  settings.check_updates = 啟動時檢查更新
879
882
  settings.check_updates.bg = 在後台檢查更新
880
883
  settings.cmd.field.desc = 启用 `{cmd}` 工具。