#app/ui/chat_tab.py import asyncio from PySide6.QtCore import Qt from PySide6.QtWidgets import ( QFrame, QHBoxLayout, QLabel, QLineEdit, QPushButton, QTextEdit, QVBoxLayout, QWidget, ) class ChatTab(QWidget): def __init__(self, parent=None): super().__init__(parent) self._init_ui() def _init_ui(self): layout = QVBoxLayout(self) # 1. Chat History Display self.chat_display = QTextEdit(self) self.chat_display.setReadOnly(True) self.chat_display.setPlaceholderText( "Su conversación aparecerá aquí... (Your conversation will appear here...)" ) layout.addWidget(self.chat_display, stretch=4) # 2. Feedback Panel (Pronunciation & WER Metrics) self.feedback_panel = QFrame(self) self.feedback_panel.setFrameShape(QFrame.Shape.StyledPanel) feedback_layout = QVBoxLayout(self.feedback_panel) self.feedback_label = QLabel("Análisis de Pronunciación:", self) self.feedback_content = QLabel("Mantén presionado el botón o habla para evaluar.", self) feedback_layout.addWidget(self.feedback_label) feedback_layout.addWidget(self.feedback_content) layout.addWidget(self.feedback_panel, stretch=1) # 3. User Input Controls input_layout = QHBoxLayout() self.text_input = QLineEdit(self) self.text_input.setPlaceholderText("Escribe un mensaje o habla...") self.text_input.returnPressed.connect(self._on_send) self.btn_send = QPushButton("Enviar", self) self.btn_send.clicked.connect(self._on_send) self.btn_record = QPushButton("🎤 Hablar (Hold Space)", self) self.btn_record.clicked.connect(self._on_record_clicked) input_layout.addWidget(self.text_input, stretch=3) input_layout.addWidget(self.btn_send) input_layout.addWidget(self.btn_record) layout.addLayout(input_layout) def _on_send(self): text = self.text_input.text().strip() if text: self.chat_display.append(f"Tú: {text}") self.text_input.clear() # Schedule asynchronous processing via asyncio asyncio.create_task(self._simulate_assistant_response(text)) def _on_record_clicked(self): self.chat_display.append("[Escuchando audio local vía mlx-whisper...]") async def _simulate_assistant_response(self, user_text: str): # Async coroutine demonstrating QtAsyncio responsiveness await asyncio.sleep(1.0) response = f"¡Hola! Recibí tu mensaje: '{user_text}'. ¿Cómo te va?" self.chat_display.append(f"Asistente: {response}")