Funciones en el codigo » History » Version 3
« Previous -
Version 3/7
(diff) -
Next » -
Current version
fernanda ventura, 12/29/2023 12:45 PM
« Previous -
Version 3/7
(diff) -
Next » -
Current version
fernanda ventura, 12/29/2023 12:45 PM
class AsistidoScreen(Screen): recording = False # Indica si se está grabando frames = [] # Almacena fragmentos de audio audio_stream = None # Flujo de entrada de audio sound = None # Objeto para reproducir sonido file_name = "grabacion.wav" # Nombre del archivo de audio # Inicia la grabación de audio en un hilo separado def iniciar_grabacion(self): if not self.recording: self.recording = True threading.Thread(target=self._grabar_audio).start() # Detiene la grabación de audio y reproduce el audio grabado en un hilo separado def detener_grabacion(self): if self.recording: self.recording = False threading.Thread(target=self._reproducir_audio).start() # Método privado que realiza la grabación de audio def _grabar_audio(self): CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 44100 p = pyaudio.PyAudio() # Crea o sobrescribe el archivo de audio with open(self.file_name, 'wb'): pass # Abre el flujo de entrada de audio self.audio_stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) # Bucle de grabación while self.recording: data = self.audio_stream.read(CHUNK) self.frames.append(data) # Detiene y cierra el flujo de entrada de audio self.audio_stream.stop_stream() self.audio_stream.close() p.terminate() # Guarda los frames grabados en un archivo WAV with wave.open(self.file_name, 'wb') as wf: wf.setnchannels(CHANNELS) wf.setsampwidth(pyaudio.PyAudio().get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(self.frames)) # Reproduce el audio grabado self._reproducir_audio() # Limpia los frames grabados self.frames = [] # Método privado que reproduce el audio grabado def _reproducir_audio(self): if self.frames: sound_data = b''.join(self.frames) # Carga el sonido y lo reproduce sound = SoundLoader.load(self.file_name) if sound: sound.play() # Se llama al abandonar la pantalla para detener el sonido y cerrar el flujo de audio def on_leave(self): if self.sound: self.sound.stop() if self.audio_stream: self.audio_stream.stop_stream() self.audio_stream.close() # Muestra un teclado en una ventana emergente def show_keyboard(self): self.keyboard_popup = Popup(title='Teclado', content=self._build_keyboard_layout(), size_hint=(None, None), size=(400, 300), auto_dismiss=True) self.keyboard_popup.open() # Construye el diseño del teclado en la ventana emergente def _build_keyboard_layout(self): layout = BoxLayout(orientation='vertical', spacing=10, padding=10) text_input = TextInput(multiline=False, readonly=True, halign='center', font_size=24) layout.add_widget(text_input) buttons_layout = GridLayout(cols=10, spacing=5, size_hint_y=None, height=150) # Diseño del teclado QWERTY qwerty_layout = [ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', 'Space', 'Borrar', 'Enter' ] # Agrega botones al diseño for button_text in qwerty_layout: buttons_layout.add_widget(Button(text=button_text, on_press=self._on_button_press)) layout.add_widget(buttons_layout) return layout # Maneja el evento de presionar un botón en el teclado def _on_button_press(self, instance): current_text_input = self.find_text_input(self.keyboard_popup.content) # Acciones según el botón presionado if instance.text == 'Enter': self.reproducir_texto(current_text_input.text) current_text_input.text = '' elif instance.text == 'Space': current_text_input.text += ' ' elif instance.text == 'Borrar': current_text_input.text = '' else: current_text_input.text += instance.text # Encuentra el TextInput entre los hijos de un layout def find_text_input(self, layout): for child in layout.children: if isinstance(child, TextInput): return child elif len(child.children) > 0: text_input = self.find_text_input(child) if text_input: return text_input return None # Inicia la reproducción de texto en un hilo separado def reproducir_texto(self, texto): threading.Thread(target=self._reproducir_voz, args=(texto,)).start() # Método privado que reproduce el texto utilizando la biblioteca pyttsx3 def _reproducir_voz(self, texto): engine = pyttsx3.init() engine.say(texto) engine.runAndWait()