diff --git a/client/transcription_engine.py b/client/transcription_engine.py index 1e6df90..03811c7 100644 --- a/client/transcription_engine.py +++ b/client/transcription_engine.py @@ -221,9 +221,16 @@ class TranscriptionEngine: def unload_model(self): """Unload the model from memory.""" with self.model_lock: + if self.model is not None: + # Delete the model reference + del self.model self.model = None self.is_loaded = False + # Force garbage collection to free memory + import gc + gc.collect() + def __repr__(self) -> str: return f"TranscriptionEngine(model={self.model_size}, device={self.device}, loaded={self.is_loaded})" diff --git a/gui/main_window_qt.py b/gui/main_window_qt.py index f2f4f85..998b52a 100644 --- a/gui/main_window_qt.py +++ b/gui/main_window_qt.py @@ -571,6 +571,18 @@ class MainWindow(QMainWindow): self.status_label.setText("⚙ Reloading model...") self.start_button.setEnabled(False) + # Wait for any existing model loader thread to finish and disconnect + if self.model_loader_thread and self.model_loader_thread.isRunning(): + print("Waiting for previous model loader to finish...") + self.model_loader_thread.wait() + + # Disconnect any existing signals to prevent duplicate connections + if self.model_loader_thread: + try: + self.model_loader_thread.finished.disconnect() + except: + pass # Already disconnected or never connected + # Unload current model if self.transcription_engine: try: @@ -600,10 +612,7 @@ class MainWindow(QMainWindow): min_confidence=self.config.get('processing.min_confidence', 0.5) ) - # Load model in background thread - if self.model_loader_thread and self.model_loader_thread.isRunning(): - self.model_loader_thread.wait() - + # Create new model loader thread self.model_loader_thread = ModelLoaderThread(self.transcription_engine) self.model_loader_thread.finished.connect(self._on_model_reloaded) self.model_loader_thread.start() @@ -619,23 +628,28 @@ class MainWindow(QMainWindow): def _on_model_reloaded(self, success: bool, message: str): """Handle model reloading completion.""" - if success: - # Update device label with actual device used - if self.transcription_engine: - actual_device = self.transcription_engine.device - compute_type = self.transcription_engine.compute_type - device_display = f"{actual_device.upper()} ({compute_type})" - self.device_label.setText(f"Device: {device_display}") + try: + if success: + # Update device label with actual device used + if self.transcription_engine: + actual_device = self.transcription_engine.device + compute_type = self.transcription_engine.compute_type + device_display = f"{actual_device.upper()} ({compute_type})" + self.device_label.setText(f"Device: {device_display}") - host = self.config.get('web_server.host', '127.0.0.1') - port = self.config.get('web_server.port', 8080) - self.status_label.setText(f"✓ Ready | Web: http://{host}:{port}") - self.start_button.setEnabled(True) - QMessageBox.information(self, "Settings Saved", "Model reloaded successfully with new settings!") - else: - self.status_label.setText("❌ Model loading failed") - QMessageBox.critical(self, "Error", f"Failed to reload model:\n{message}") - self.start_button.setEnabled(False) + host = self.config.get('web_server.host', '127.0.0.1') + port = self.config.get('web_server.port', 8080) + self.status_label.setText(f"✓ Ready | Web: http://{host}:{port}") + self.start_button.setEnabled(True) + QMessageBox.information(self, "Settings Saved", "Model reloaded successfully with new settings!") + else: + self.status_label.setText("❌ Model loading failed") + QMessageBox.critical(self, "Error", f"Failed to reload model:\n{message}") + self.start_button.setEnabled(False) + except Exception as e: + print(f"Error in _on_model_reloaded: {e}") + import traceback + traceback.print_exc() def _start_server_sync(self): """Start server sync client.""" diff --git a/gui/settings_dialog_qt.py b/gui/settings_dialog_qt.py index cb6af4a..eb125b8 100644 --- a/gui/settings_dialog_qt.py +++ b/gui/settings_dialog_qt.py @@ -283,11 +283,13 @@ class SettingsDialog(QDialog): self.config.set('server_sync.room', self.server_room_input.text()) self.config.set('server_sync.passphrase', self.server_passphrase_input.text()) - # Call save callback + # Call save callback (which will show the success message) if self.on_save: self.on_save() + else: + # Only show message if no callback + QMessageBox.information(self, "Settings Saved", "Settings have been saved successfully!") - QMessageBox.information(self, "Settings Saved", "Settings have been saved successfully!") self.accept() except ValueError as e: