Project

General

Profile

Funciones en el codigo » History » Version 1

fernanda ventura, 12/29/2023 12:39 PM

1 1 fernanda ventura
h1. Funciones en el codigo
2 1 fernanda ventura
3 1 fernanda ventura
<pre>
4 1 fernanda ventura
# Clase que representa la pantalla del usuario asistido
5 1 fernanda ventura
class AsistidoScreen(Screen):
6 1 fernanda ventura
    recording = False  # Indica si se está grabando
7 1 fernanda ventura
    frames = []  # Almacena fragmentos de audio
8 1 fernanda ventura
    audio_stream = None  # Flujo de entrada de audio
9 1 fernanda ventura
    sound = None  # Objeto para reproducir sonido
10 1 fernanda ventura
    file_name = "grabacion.wav"  # Nombre del archivo de audio
11 1 fernanda ventura
12 1 fernanda ventura
    # Inicia la grabación de audio en un hilo separado
13 1 fernanda ventura
    def iniciar_grabacion(self):
14 1 fernanda ventura
        if not self.recording:
15 1 fernanda ventura
            self.recording = True
16 1 fernanda ventura
            threading.Thread(target=self._grabar_audio).start()
17 1 fernanda ventura
18 1 fernanda ventura
    # Detiene la grabación de audio y reproduce el audio grabado en un hilo separado
19 1 fernanda ventura
    def detener_grabacion(self):
20 1 fernanda ventura
        if self.recording:
21 1 fernanda ventura
            self.recording = False
22 1 fernanda ventura
            threading.Thread(target=self._reproducir_audio).start()
23 1 fernanda ventura
24 1 fernanda ventura
    # Método privado que realiza la grabación de audio
25 1 fernanda ventura
    def _grabar_audio(self):
26 1 fernanda ventura
        CHUNK = 1024
27 1 fernanda ventura
        FORMAT = pyaudio.paInt16
28 1 fernanda ventura
        CHANNELS = 2
29 1 fernanda ventura
        RATE = 44100
30 1 fernanda ventura
31 1 fernanda ventura
        p = pyaudio.PyAudio()
32 1 fernanda ventura
33 1 fernanda ventura
        # Crea o sobrescribe el archivo de audio
34 1 fernanda ventura
        with open(self.file_name, 'wb'):
35 1 fernanda ventura
            pass
36 1 fernanda ventura
37 1 fernanda ventura
        # Abre el flujo de entrada de audio
38 1 fernanda ventura
        self.audio_stream = p.open(format=FORMAT,
39 1 fernanda ventura
                                   channels=CHANNELS,
40 1 fernanda ventura
                                   rate=RATE,
41 1 fernanda ventura
                                   input=True,
42 1 fernanda ventura
                                   frames_per_buffer=CHUNK)
43 1 fernanda ventura
44 1 fernanda ventura
        # Bucle de grabación
45 1 fernanda ventura
        while self.recording:
46 1 fernanda ventura
            data = self.audio_stream.read(CHUNK)
47 1 fernanda ventura
            self.frames.append(data)
48 1 fernanda ventura
49 1 fernanda ventura
        # Detiene y cierra el flujo de entrada de audio
50 1 fernanda ventura
        self.audio_stream.stop_stream()
51 1 fernanda ventura
        self.audio_stream.close()
52 1 fernanda ventura
        p.terminate()
53 1 fernanda ventura
54 1 fernanda ventura
        # Guarda los frames grabados en un archivo WAV
55 1 fernanda ventura
        with wave.open(self.file_name, 'wb') as wf:
56 1 fernanda ventura
            wf.setnchannels(CHANNELS)
57 1 fernanda ventura
            wf.setsampwidth(pyaudio.PyAudio().get_sample_size(FORMAT))
58 1 fernanda ventura
            wf.setframerate(RATE)
59 1 fernanda ventura
            wf.writeframes(b''.join(self.frames))
60 1 fernanda ventura
61 1 fernanda ventura
        # Reproduce el audio grabado
62 1 fernanda ventura
        self._reproducir_audio()
63 1 fernanda ventura
64 1 fernanda ventura
        # Limpia los frames grabados
65 1 fernanda ventura
        self.frames = []
66 1 fernanda ventura
67 1 fernanda ventura
    # Método privado que reproduce el audio grabado
68 1 fernanda ventura
    def _reproducir_audio(self):
69 1 fernanda ventura
        if self.frames:
70 1 fernanda ventura
            sound_data = b''.join(self.frames)
71 1 fernanda ventura
72 1 fernanda ventura
            # Carga el sonido y lo reproduce
73 1 fernanda ventura
            sound = SoundLoader.load(self.file_name)
74 1 fernanda ventura
            if sound:
75 1 fernanda ventura
                sound.play()
76 1 fernanda ventura
77 1 fernanda ventura
    # Se llama al abandonar la pantalla para detener el sonido y cerrar el flujo de audio
78 1 fernanda ventura
    def on_leave(self):
79 1 fernanda ventura
        if self.sound:
80 1 fernanda ventura
            self.sound.stop()
81 1 fernanda ventura
        if self.audio_stream:
82 1 fernanda ventura
            self.audio_stream.stop_stream()
83 1 fernanda ventura
            self.audio_stream.close()
84 1 fernanda ventura
85 1 fernanda ventura
    # Muestra un teclado en una ventana emergente
86 1 fernanda ventura
    def show_keyboard(self):
87 1 fernanda ventura
        self.keyboard_popup = Popup(title='Teclado',
88 1 fernanda ventura
                                    content=self._build_keyboard_layout(),
89 1 fernanda ventura
                                    size_hint=(None, None),
90 1 fernanda ventura
                                    size=(400, 300),
91 1 fernanda ventura
                                    auto_dismiss=True)
92 1 fernanda ventura
        self.keyboard_popup.open()
93 1 fernanda ventura
94 1 fernanda ventura
    # Construye el diseño del teclado en la ventana emergente
95 1 fernanda ventura
    def _build_keyboard_layout(self):
96 1 fernanda ventura
        layout = BoxLayout(orientation='vertical', spacing=10, padding=10)
97 1 fernanda ventura
98 1 fernanda ventura
        text_input = TextInput(multiline=False, readonly=True, halign='center', font_size=24)
99 1 fernanda ventura
        layout.add_widget(text_input)
100 1 fernanda ventura
101 1 fernanda ventura
        buttons_layout = GridLayout(cols=10, spacing=5, size_hint_y=None, height=150)
102 1 fernanda ventura
103 1 fernanda ventura
        # Diseño del teclado QWERTY
104 1 fernanda ventura
        qwerty_layout = [
105 1 fernanda ventura
            'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P',
106 1 fernanda ventura
            'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L',
107 1 fernanda ventura
            'Z', 'X', 'C', 'V', 'B', 'N', 'M',
108 1 fernanda ventura
            'Space', 'Borrar', 'Enter'
109 1 fernanda ventura
        ]
110 1 fernanda ventura
111 1 fernanda ventura
        # Agrega botones al diseño
112 1 fernanda ventura
        for button_text in qwerty_layout:
113 1 fernanda ventura
            buttons_layout.add_widget(Button(text=button_text, on_press=self._on_button_press))
114 1 fernanda ventura
115 1 fernanda ventura
        layout.add_widget(buttons_layout)
116 1 fernanda ventura
117 1 fernanda ventura
        return layout
118 1 fernanda ventura
119 1 fernanda ventura
    # Maneja el evento de presionar un botón en el teclado
120 1 fernanda ventura
    def _on_button_press(self, instance):
121 1 fernanda ventura
        current_text_input = self.find_text_input(self.keyboard_popup.content)
122 1 fernanda ventura
123 1 fernanda ventura
        # Acciones según el botón presionado
124 1 fernanda ventura
        if instance.text == 'Enter':
125 1 fernanda ventura
            self.reproducir_texto(current_text_input.text)
126 1 fernanda ventura
            current_text_input.text = ''
127 1 fernanda ventura
        elif instance.text == 'Space':
128 1 fernanda ventura
            current_text_input.text += ' '
129 1 fernanda ventura
        elif instance.text == 'Borrar':
130 1 fernanda ventura
            current_text_input.text = ''
131 1 fernanda ventura
        else:
132 1 fernanda ventura
            current_text_input.text += instance.text
133 1 fernanda ventura
134 1 fernanda ventura
    # Encuentra el TextInput entre los hijos de un layout
135 1 fernanda ventura
    def find_text_input(self, layout):
136 1 fernanda ventura
        for child in layout.children:
137 1 fernanda ventura
            if isinstance(child, TextInput):
138 1 fernanda ventura
                return child
139 1 fernanda ventura
            elif len(child.children) > 0:
140 1 fernanda ventura
                text_input = self.find_text_input(child)
141 1 fernanda ventura
                if text_input:
142 1 fernanda ventura
                    return text_input
143 1 fernanda ventura
        return None
144 1 fernanda ventura
145 1 fernanda ventura
    # Inicia la reproducción de texto en un hilo separado
146 1 fernanda ventura
    def reproducir_texto(self, texto):
147 1 fernanda ventura
        threading.Thread(target=self._reproducir_voz, args=(texto,)).start()
148 1 fernanda ventura
149 1 fernanda ventura
    # Método privado que reproduce el texto utilizando la biblioteca pyttsx3
150 1 fernanda ventura
    def _reproducir_voz(self, texto):
151 1 fernanda ventura
        engine = pyttsx3.init()
152 1 fernanda ventura
        engine.say(texto)
153 1 fernanda ventura
        engine.runAndWait()
154 1 fernanda ventura
155 1 fernanda ventura
</pre>