GuillermoPuma commited on
Commit
3dc3be1
1 Parent(s): 4f26f73
app.py ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # cargamos el modelo de huggingsound
2
+ import re
3
+ import unidecode
4
+ from huggingsound import SpeechRecognitionModel
5
+ from models.model import *
6
+ from models.plantillas_codigo import *
7
+ from models.variables_globales import *
8
+
9
+
10
+ # creación del modelo
11
+ model = SpeechRecognitionModel("patrickvonplaten/wav2vec2-large-xlsr-53-spanish-with-lm")
12
+
13
+ # Variables globales
14
+ bloque = '' # Define el contexto (si es función, condicional, ciclo, etc.)
15
+ codigo = None # Guarda el código hasta el momento
16
+ indentacion = 0 # Nivel de indentación
17
+ linea_codigo = 0 # Esto para dar seguimiento al eliminado de una linea
18
+ recomendacion = ""
19
+
20
+ import gradio as gr
21
+
22
+ def transcribe(audio, state=""):
23
+ global bloque
24
+ global codigo
25
+
26
+
27
+ transcriptions_es = model.transcribe([audio])[0]
28
+ # quitamos el acento de la transcripcion
29
+ frase = unidecode.unidecode(transcriptions_es['transcription']).lower()
30
+
31
+ # print(frase)
32
+ if not bloque:
33
+ # Significa que es la primera vez
34
+ codigo = main(frase)
35
+ else:
36
+ codigo = agregar_adentro(codigo, frase)
37
+
38
+ return codigo, frase
39
+
40
+ inputs = gr.inputs.Audio(label="Dar click para escuchar tu voz", type="filepath", source="microphone")
41
+ output1 = gr.outputs.Textbox(label="Asi se ve tu código")
42
+ output2 = gr.outputs.Textbox(label="Transcripción en español de la última línea de código")
43
+
44
+ title = "Expresate con voz"
45
+ description = "<h1>Hola</h1> Aplicación que ayuda a programar a traves de tu voz"
46
+ # ,'mientras variable alpha es menor igual a numero dos'
47
+ # ,'Definir variable con nombre india igual a numero uno'
48
+ examples = [
49
+ 'definir función con nombre magica y parámetros x y z'
50
+ 'mientras variable india es menor o igual a seis',
51
+ 'ejecuta print con argumentos variable india producto cadena o cadena','Asignar variable india con india mas uno',
52
+ './grabaciones-wav/codigo_o/Audios demo while/definir_func_avitua.wav',
53
+ './grabaciones-wav/codigo_o/Audios demo while/linea1_avitua.wav',
54
+ './grabaciones-wav/codigo_o/Audios demo while/linea2_avitua.wav',
55
+ './grabaciones-wav/codigo_o/Audios demo while/linea3_avitua.wav',
56
+ './grabaciones-wav/codigo_o/Audios demo while/linea4_avitua.wav',
57
+ './grabaciones-wav/codigo_o/Audios demo while/fin_bloque_avitua.wav',
58
+ ]
59
+
60
+ article = "<a style='color:#eb9f59;' href = 'https://github.com/gandres-dev/Hackaton-Common-Voice'> Repositorio de la app"
61
+ demo = gr.Interface(fn=transcribe, inputs=inputs, outputs=[output1,output2],
62
+ title=title, description=description, article=article,
63
+ allow_flagging="never", theme="darkpeach", examples=examples,
64
+ # live=True
65
+ )
66
+
67
+ if __name__ == "__main__":
68
+ demo.launch()
models/__pycache__/variables_globales.cpython-37.pyc ADDED
Binary file (2.75 kB). View file
 
models/model.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+
3
+
4
+
5
+ def encontrar_palabras(transcript,cjto_palabras):
6
+ '''
7
+ Toma un string (en minúsculas) y un conjunto de palabras. Busca el primer match
8
+ de cjto_palabras en transcript y particiona el string en:
9
+ 1. El slice de la cadena antes del primer match (antes_palabra)
10
+ 2. La cadena del primer match (coincidencia de cjto_palabras)
11
+ 3. El slice de la cadena después del match (despues_palabra)
12
+ '''
13
+ inicio,final=list(re.finditer(r'|'.join(cjto_palabras),transcript))[0].span()
14
+ antes_palabra=transcript[:inicio].strip()
15
+ despues_palabra=transcript[final:].strip()
16
+ palabra=transcript[inicio:final]
17
+ return antes_palabra,palabra,despues_palabra
18
+
19
+
20
+
21
+ def agregar_adentro(codigo, transcipcion):
22
+
23
+ codigo2 = main(transcipcion)
24
+
25
+ return codigo[:-1] + codigo2
26
+
27
+
28
+
29
+ def main(instruccion):
30
+ """
31
+ Función global encargada de recibir las instrucciones y capaz de direccionar
32
+ a funciones correspondientes mediante medidas de similitud.
33
+ """
34
+ global bloque
35
+
36
+ plantillas = [
37
+ crear_funcion,
38
+ crear_condicional,
39
+ crear_condicional,
40
+ asignar_variable,
41
+ crear_variable,
42
+ crear_llamada,
43
+ crear_for,
44
+ fin_de_bloque,
45
+ crear_comentario,
46
+ crear_regresa
47
+ ]
48
+
49
+ comandos = [set(['definir', 'funcion', 'parametros']),
50
+ set(['mientras']),
51
+ set(['si']), # si se cumple / mientras se cumpla
52
+ set(['asignar', 'con']),
53
+ set(['definir', 'variable']),
54
+ set(['ejecuta', 'argumentos']),
55
+ set(['para', 'rango']),
56
+ set(['terminar','bloque']),
57
+ set(['comentario']),
58
+ set(['regresa'])
59
+
60
+ ]
61
+
62
+ J = []
63
+ for comando in comandos:
64
+ J.append(len(set(instruccion.strip().split(' ')).intersection(comando)) / len(set(instruccion.strip().split(' ')).union(comando)))
65
+
66
+ # print(J,np.argmax(J))
67
+ pos_func=np.argmax(J)
68
+ # print(pos_func)
69
+
70
+ return plantillas[pos_func](instruccion)
models/plantillas_codigo.py ADDED
@@ -0,0 +1,641 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+
3
+ def crear_funcion(instruccion):
4
+ """
5
+ Crea el template de la estructura de una función
6
+
7
+ Parametros
8
+ ----------
9
+ instrucion: str
10
+ La intruccion de voz en texto.
11
+
12
+ Regresa
13
+ ---------
14
+ output: str
15
+ Codigo generado
16
+ recomendacion: str
17
+ Una sugerencia o fallo
18
+ """
19
+
20
+ global indentacion
21
+ global recomendacion
22
+ global bloque
23
+
24
+ bloque='funcion'
25
+
26
+ # guarda los avisos o recomendaciones que el programa te hace
27
+ recomendacion = ''
28
+
29
+ # guarda la línea de código
30
+ output = ''
31
+
32
+ # pivote que ayuda a definir el nombre de una función
33
+ before_keyword, keyword, after_keyword = instruccion.partition('nombre')
34
+
35
+ # verifica que haya o esté escrita la frase "nombre"
36
+ if len(after_keyword) == 0:
37
+ recomendacion = f'¡No me dijiste el nombre de la función!'
38
+
39
+ # de otro modo, si tiene nombre la función
40
+ else:
41
+
42
+ # obtenemos el nombre de la función por el usuario
43
+ name_func = after_keyword.split(' ')[1]
44
+
45
+ # verificamos si no desea poner parametros
46
+ if instruccion.strip().split(' ')[-1] == name_func:
47
+ parametros = ''
48
+
49
+ # de otro modo, si desea una función con parámetros
50
+ else:
51
+ before_keyword, keyword, after_keyword = instruccion.partition('parametros')
52
+
53
+ # verifica que si exista el nombre de los parámetros
54
+ if len(after_keyword) == 0:
55
+ parametros = ''
56
+ recomendacion = f'¡No me dijiste el nombre de los parámetros!'
57
+
58
+ # escribe como parámetros todo lo que está después de "parámetros"
59
+ else:
60
+ candidatos = []
61
+ cadena_separada = after_keyword.strip().split(' ')
62
+
63
+ for palabra in cadena_separada:
64
+ try:
65
+ candidatos.append(diccionario_fonetico[palabra])
66
+ except:
67
+ continue
68
+
69
+ if len(candidatos) == 0:
70
+ parametros = after_keyword.split(' ')[1:]
71
+ parametros = ', '.join(parametros)
72
+
73
+ else:
74
+ parametros = ', '.join(candidatos)
75
+
76
+ # indenta aunque marque que detecte que no le dije parámetros
77
+ if not recomendacion or recomendacion == '¡No me dijiste el nombre de los parámetros!':
78
+ indentacion += 1
79
+
80
+ # concatenación del nombre y parámetros de la función
81
+ output = f'def {name_func}({parametros}):\n' + '\t' * indentacion + '|'
82
+ return output
83
+
84
+
85
+
86
+ def encontrar_palabras(transcript,cjto_palabras):
87
+
88
+ """
89
+ Toma un string (en minúsculos) y un conjunto de palabras. Busca el primer match
90
+ de cjto_palabras en transcript y particiona el string
91
+
92
+ Parametros
93
+ ----------
94
+ transcript: str
95
+ La intruccion de voz en texto ya en minúsculas.
96
+ cjto_palabras: list(str)
97
+ Lista de strings donde se comienza a dividir el transcript original
98
+
99
+ Regresa
100
+ ---------
101
+ output: list(str)
102
+ [antes_palabra,palabra,despues_palabra]
103
+
104
+ antes_palabra: string que está antes de la palabra de interés (de cjto_palabras)
105
+ palabra: string que da la palabra clave donde dividimos
106
+ despues_palabra: string que está después de la palabra
107
+
108
+ Ejemplo
109
+ --------
110
+ encontrar_palabras('variable india producto variable alfa',['producto','suma','menos','entre'])
111
+ >> ['variable india','producto',' variable alfa]
112
+ """
113
+ inicio,final=list(re.finditer(r'|'.join(cjto_palabras),transcript))[0].span()
114
+ antes_palabra=transcript[:inicio].strip()
115
+ despues_palabra=transcript[final:].strip()
116
+ palabra=transcript[inicio:final]
117
+ return antes_palabra,palabra,despues_palabra
118
+
119
+
120
+
121
+ def crear_condicional(transcript):
122
+ '''
123
+ Toma el transcript de un enunciado condicional y regresa su traducción a código en Python
124
+
125
+ Parametros
126
+ ----------
127
+ transcript: str
128
+ La intruccion de voz en texto ya en minúsculas.
129
+
130
+
131
+ Regresa
132
+ ---------
133
+ output: str
134
+ Cadena con el código en python, tiene una línea al final y un pipe
135
+ que representa el prompt donde se seguirá escribiendo
136
+
137
+ Ejemplo
138
+ --------
139
+ crear_condicional('mientras variable india sea menor igual a numero seis')
140
+ >> while (i<=6):
141
+ >> |
142
+ '''
143
+ global indentacion
144
+ global bloque
145
+
146
+ keyword_mapeo={'mientras':'while','si':'if','contrario':'else'}
147
+ antes_keyword,keyword,desp_keyword=encontrar_palabras(transcript,keyword_mapeo.keys())
148
+ cadena=keyword_mapeo[keyword]
149
+ bloque = keyword
150
+
151
+ if cadena=='else':
152
+ indentacion=indentacion+1
153
+ return 'else:'+'\n' +'\t'* indentacion+'|'
154
+
155
+ # Primera división
156
+ condicional_mapeo={'menor estricto':'<','menor o igual':'<=','igual':'==','diferente':'!='
157
+ ,'mayor estricto':'>','mayor o igual':'>='}
158
+ cjto_condicional=condicional_mapeo.keys()
159
+ antes_condicional,palabra_condicional,despues_condicional=encontrar_palabras(transcript,cjto_condicional)
160
+
161
+
162
+ # Buscar antes en la lista de variables
163
+ a_var,var,d_var=encontrar_palabras(antes_condicional,['variable'])
164
+ nombre_var=d_var.split(' ')[0]
165
+
166
+ if diccionario_fonetico.get(nombre_var,False):
167
+ nombre_var=diccionario_fonetico[nombre_var]
168
+
169
+
170
+ cadena+=' '+nombre_var+' ' +condicional_mapeo[palabra_condicional]
171
+
172
+ # Buscar en despues_condicional el número
173
+
174
+ valor=despues_condicional.split(' ')[-1]
175
+
176
+ if dict_numeros.get(valor,False):
177
+ valor=str(dict_numeros[valor])
178
+
179
+ indentacion+=1
180
+
181
+ return f'{keyword_mapeo[keyword]} {nombre_var} {condicional_mapeo[palabra_condicional]} {valor}:'+'\n' +'\t'* indentacion+'|'
182
+
183
+
184
+
185
+ def crear_cadena(transcript):
186
+ """
187
+ Toma el transcript de un enunciado que contiene una cadena y regresa el código en Python.
188
+ Para usarse cuando ya se sabe que transcript sólo es los límites de la cadena
189
+
190
+ Parametros
191
+ ----------
192
+ transcript: str
193
+ La intruccion de voz en texto ya en minúsculas.
194
+
195
+
196
+ Regresa
197
+ ---------
198
+ output: list(str)
199
+ antes_palabra:parte del transcript que va antes de las comillas
200
+ palabra: Cadena con el código en python de las comillas y lo que está adentro
201
+ despues_palabra:parte del transcript que va antes de las comillas
202
+
203
+ Ejemplo
204
+ --------
205
+ crear_cadena('ejecuta print con argumentos variable India producto cadena guion cadena')[1]
206
+ >> ['ejecuta print con argumentos variable India producto','"guion"','']
207
+ """
208
+ try:
209
+ inicio,final = list(re.finditer(r"cadena (.+) cadena",transcript))[0].span()
210
+ except:
211
+ return ''
212
+ antes_palabra = transcript[:inicio].strip()
213
+ despues_palabra = transcript[final:].strip()
214
+ palabra = list(re.finditer(r"cadena (.+) cadena", transcript))[0].group(1)
215
+ return antes_palabra, f'"{palabra}"', despues_palabra
216
+
217
+
218
+
219
+ def crear_var_existente(transcript):
220
+ """
221
+ Toma el transcript de un enunciado que contiene la mención de una variable
222
+ y devuelve dicha variable
223
+
224
+ Parametros
225
+ ----------
226
+ transcript: str
227
+ La intruccion de voz en texto ya en minúsculas.
228
+
229
+
230
+ Regresa
231
+ ---------
232
+ output: str
233
+ palabra: Cadena con el código en python del nombre de la variable
234
+
235
+ Ejemplo
236
+ --------
237
+ crear_var_existente('ejecuta print con argumentos variable india producto cadena guión cadena')
238
+ >> i
239
+ """
240
+ try:
241
+ antes_var,var,desp_var=encontrar_palabras(transcript,['variable'])
242
+ except:
243
+ return ''
244
+
245
+ nombre_var=desp_var.split(' ')[0]
246
+ if diccionario_fonetico.get(nombre_var,False):
247
+ nombre_var=diccionario_fonetico[nombre_var]
248
+
249
+ return nombre_var
250
+
251
+
252
+
253
+ def crear_operacion(transcript):
254
+ '''
255
+ Toma el transcript de una operación binaria y la traduce a código de Python.
256
+ Para traducir las variables que se usan en la operación binaria busca
257
+ si son cadenas o sólo menciones de variables usando las funciones
258
+ crear_cadena y crear_var_existente
259
+
260
+ Parametros
261
+ ----------
262
+ transcript: str
263
+ La intruccion de voz en texto ya en minúsculas.
264
+
265
+
266
+ Regresa
267
+ ---------
268
+ output: str
269
+ Cadena con el código en python
270
+
271
+ Ejemplo
272
+ --------
273
+ crear_operacion('variable India producto cadena guión cadena')
274
+ >> i*'-'
275
+ '''
276
+ global dict_operaciones
277
+
278
+
279
+ try:
280
+ antes_op,op,desp_op=encontrar_palabras(transcript,dict_operaciones.keys())
281
+ except:
282
+ return ''
283
+
284
+ # Buscamos la información en la cadena detrás del operador
285
+ cadena_izq=crear_var_existente(antes_op)
286
+ try:
287
+ cadena_izq+=f'{crear_cadena(antes_op)[1]}'
288
+ except:
289
+ cadena_izq+=''
290
+
291
+ if len(cadena_izq)==0:
292
+ nombre_var=antes_op.split(' ')[-1]
293
+ if dict_numeros.get(nombre_var,False):
294
+ nombre_var=dict_numeros[nombre_var]
295
+ cadena_izq+=str(nombre_var)
296
+
297
+ # Buscamos la información en la cadena después del operador
298
+ cadena_der=crear_var_existente(desp_op)
299
+ try:
300
+ cadena_der+=f'{crear_cadena(desp_op)[1]}'
301
+ except:
302
+ cadena_der+=''
303
+
304
+ if len(cadena_der)==0:
305
+ nombre_var=desp_op.split(' ')[0]
306
+ if dict_numeros.get(nombre_var,False):
307
+ nombre_var=dict_numeros[nombre_var]
308
+ if diccionario_fonetico.get(nombre_var,False):
309
+ nombre_var=diccionario_fonetico[nombre_var]
310
+ cadena_der+=str(nombre_var)
311
+
312
+
313
+ return f'{cadena_izq} {dict_operaciones[op]} {cadena_der}'
314
+
315
+
316
+
317
+ def crear_llamada(transcript):
318
+ """
319
+ Toma el transcript de la llamada de una función y la convierte en código de Python
320
+ Hace uso de las funciones que detectan operaciones, variables y comillas
321
+ ,para cada argumento de la función
322
+
323
+ Parametros
324
+ ----------
325
+ transcript: str
326
+ La intruccion de voz en texto ya en minúsculas.
327
+
328
+
329
+ Regresa
330
+ ---------
331
+ output: str
332
+ Cadena con el código en python
333
+
334
+ Ejemplo
335
+ --------
336
+ crear_llamada(ejecuta print con argumentos variable India producto cadena guión cadena
337
+ coma cadena hola cadena')
338
+ >> print(i*'-','hola')
339
+
340
+ """
341
+ global bloque
342
+ global indentacion
343
+
344
+ bloque='llamada'
345
+ try:
346
+ antes_ej,ej,desp_ej=encontrar_palabras(transcript,['ejecuta'])
347
+ except:
348
+ return ''
349
+ funcion_nombre=desp_ej.split(' ')[0]
350
+ # Aquí tal vez valdría la pena tener un registro de las funciones previamente definidas para
351
+ # poder buscar en un directorio con Jaccard y no aproximar
352
+
353
+ antes_arg,keyword,desp_arg=encontrar_palabras(desp_ej,['argumentos','parametros'])
354
+
355
+ argumentos=desp_arg.split('coma')
356
+ lista_cadenas=[]
357
+ for arg in argumentos:
358
+ arg=arg.strip()
359
+ cadena_arg=''
360
+ # print('arg',arg)
361
+ # Caso cuando es operacion
362
+ cadena_op=crear_operacion(arg)
363
+ cadena_var=crear_var_existente(arg)
364
+ cadena_cadena=crear_cadena(arg)
365
+ if len(cadena_op)!=0:
366
+ lista_cadenas.append(cadena_op)
367
+ elif len(cadena_var)!=0:
368
+ lista_cadenas.append(cadena_var)
369
+ elif len(cadena_cadena)!=0:
370
+ lista_cadenas.append(cadena_cadena[1])
371
+ else:
372
+ nombre_var=arg
373
+ if dict_numeros.get(nombre_var,False):
374
+ nombre_var=str(dict_numeros[nombre_var])
375
+
376
+ lista_cadenas.append(nombre_var)
377
+
378
+ # Caso cuando es variable
379
+
380
+ cadena_final=','.join(lista_cadenas)
381
+ cadena=f'{funcion_nombre}({cadena_final})\n'+'\t'*indentacion+'|'
382
+
383
+ return cadena
384
+
385
+
386
+
387
+ def crear_regresa(transcript):
388
+ antes_reg,reg,desp_reg=encontrar_palabras(transcript,['regresa'])
389
+
390
+ arg=desp_reg.strip()
391
+ cadena_arg=''
392
+
393
+ # Si es llamada
394
+ cadena_llamada=crear_llamada(arg)
395
+ # Caso cuando es operacion
396
+ cadena_op=crear_operacion(arg)
397
+ cadena_var=crear_var_existente(arg)
398
+ cadena_cadena=crear_cadena(arg)
399
+
400
+ cadena_final=''
401
+ if len(cadena_llamada)!=0:
402
+ cadena_final+=cadena_llamada[:-2]
403
+ elif len(cadena_op)!=0:
404
+ cadena_final+=cadena_op
405
+ elif len(cadena_var)!=0:
406
+ cadena_final+=cadena_var
407
+ elif len(cadena_cadena)!=0:
408
+ cadena_final+=cadena_cadena[1]
409
+ else:
410
+ nombre_var=arg
411
+ if dict_numeros.get(nombre_var,False):
412
+ nombre_var=str(dict_numeros[nombre_var])
413
+
414
+ cadena_final+=nombre_var
415
+ global indentacion
416
+ indentacion-=1
417
+ return f'return {cadena_final}\n'+'\t'*indentacion+'|'
418
+
419
+
420
+
421
+ def crear_variable(instruccion):
422
+ """
423
+ Estructura:
424
+ definir variable con nombre [nombre_variable] igual a /*objeto_basico* valor/
425
+
426
+ Parametros
427
+ ----------
428
+ instrucion: str
429
+ La intruccion de voz en texto.
430
+
431
+ Regresa
432
+ ---------
433
+ output: str
434
+ Codigo generado
435
+ recomendacion: str
436
+ Una sugerencia o fallo
437
+
438
+ Testing
439
+ -------
440
+ >>> definir variable con nombre india igual a numero uno
441
+ >>> definir variable con nombre i igual a numero 1 (int)
442
+ >>> definir variable con nombre i igual a flotante tres punto cinco (float)
443
+ >>> definir variable con nombre i igual a cadena hola (string)
444
+ >>> definir variable con nombre i igual a lista/dic (string)
445
+ """
446
+ global indentacion
447
+ global bloque
448
+
449
+ bloque='variable'
450
+
451
+ # pivote que ayuda a definir el nombre de la variable
452
+ before_keyword, keyword, after_keyword = instruccion.partition('nombre')
453
+ after_keyword_list = after_keyword.strip().split(' ')
454
+ # [india igual a numero uno]
455
+ name_variable = after_keyword_list[0]
456
+
457
+ # Como sabemos que despues del nombre va seguido de "igual a"
458
+ tipo_dato = after_keyword_list[3]
459
+ #print(after_keyword_list[4:]) -> lista
460
+ valor = tipos_datos[tipo_dato](after_keyword_list[4:])
461
+
462
+ # Verificamos si es una palabra fonetica
463
+ if diccionario_fonetico.get(name_variable,False):
464
+ name_variable=diccionario_fonetico[name_variable]
465
+
466
+ codigo_generado = f'{name_variable} = {valor}\n'+ '\t' * indentacion + '|'
467
+ return codigo_generado
468
+
469
+
470
+
471
+ def asignar_variable(instruccion):
472
+ """
473
+ Asigna una variable (eg. indio = indio + 1)
474
+
475
+ Parametros
476
+ ----------
477
+ instrucion: str
478
+ La intruccion de voz en texto.
479
+
480
+ Regresa
481
+ ---------
482
+ output: str
483
+ Codigo generado (indio = indio + 1)
484
+
485
+ Testing
486
+ --------
487
+ >>>'asignar variable india con india suma uno',
488
+ >>>'asignar variable contador con contador menos uno',
489
+ >>>'asignar variable contador con alfa',
490
+ >>>'asignar variable india con india',
491
+
492
+ """
493
+
494
+ before_keyword, keyword, after_keyword = instruccion.partition('variable')
495
+ after_keyword_list = after_keyword.strip().split(' ')
496
+ name_variable = after_keyword_list[0]
497
+ start = after_keyword_list.index('con') + 1
498
+ operacion = after_keyword_list[start:]
499
+ if len(operacion) != 1:
500
+ operacion_str = crear_operacion(keyword + ' ' + ' '.join(operacion))
501
+ else:
502
+ operacion_str = operacion[0]
503
+ # Verificamos si es una palabra fonetica para lado derecho de la
504
+ # asignacion
505
+ if diccionario_fonetico.get(operacion_str,False):
506
+ operacion_str=diccionario_fonetico[operacion_str]
507
+
508
+ # Verificamos si es una palabra fonetica
509
+ if diccionario_fonetico.get(name_variable,False):
510
+ name_variable=diccionario_fonetico[name_variable]
511
+
512
+ codigo_generado = f'{name_variable} = {operacion_str}\n'+ '\t' * indentacion + '|'
513
+ return codigo_generado
514
+
515
+
516
+
517
+ def crear_for(instruccion):
518
+ """
519
+ Crea el template de la estructura de un ciclo for.
520
+
521
+ Parámetros
522
+ ----------
523
+ instrucción: str
524
+ La intrucción de voz en texto.
525
+
526
+ Regresa
527
+ ---------
528
+ output: str
529
+ Estructura del ciclo for
530
+ recomendacion: str
531
+ Una sugerencia o error
532
+ """
533
+ global bloque
534
+ global indentacion
535
+ global recomendacion
536
+
537
+ bloque='for'
538
+ vocabulario_basico = ['iteracion', 'rango']
539
+
540
+ # verificamos si la frase cumple los requisitos
541
+ instruccion_tokens = instruccion.strip().split(' ')
542
+
543
+ for i in vocabulario_basico:
544
+ try:
545
+ instruccion_tokens.index(i)
546
+ except:
547
+ recomendacion = 'Parece que quieres una iteración pero no reconozco tus comandos, inténtalo de nuevo'
548
+ return f'', recomendacion
549
+
550
+ # guarda los avisos o recomendaciones que el programa te hace
551
+ recomendacion = ''
552
+
553
+ # guarda la línea de código
554
+ output = ''
555
+
556
+ # pivote que ayuda a definir el rango e iterador
557
+ before_keyword, keyword, after_keyword = instruccion.partition('iteracion')
558
+
559
+ if after_keyword.strip().split(' ')[1] in diccionario_fonetico:
560
+ iterador = diccionario_fonetico[after_keyword.strip().split(' ')[1]]
561
+
562
+ else:
563
+ iterador = after_keyword.strip().split(' ')[1]
564
+
565
+ before_keyword, keyword, after_keyword = instruccion.partition('rango')
566
+
567
+ limites = []
568
+
569
+
570
+ for i, item in enumerate(after_keyword.strip().split(' ')):
571
+ try:
572
+ limites.append(dict_numeros[item])
573
+ except:
574
+ continue
575
+
576
+ if len(limites) == 0:
577
+ for i, item in enumerate(after_keyword.strip().split(' ')):
578
+ try:
579
+ limites.append(diccionario_fonetico[item])
580
+ except:
581
+ continue
582
+
583
+ indentacion += 1
584
+
585
+ if len(limites) == 0:
586
+ return f'', 'No encontré los límites del rango, vuelve a intentarlo'
587
+
588
+ elif len(limites) == 1:
589
+ return f'for {iterador} in range({limites[-1]}):\n' + '\t' * indentacion + '|'
590
+
591
+ elif len(limites) == 2:
592
+ return f'for {iterador} in range({limites[0]}, {limites[1]}):\n' + '\t' * indentacion + '|'
593
+
594
+ elif len(limites) >= 2:
595
+ recomendacion = 'Me dictaste más de un número en el rango pero tomé los dos primeros'
596
+ return f'for {iterador} in range({limites[0]}, {limites[1]}):\n' + '\t' * indentacion + '|'
597
+
598
+
599
+
600
+ def crear_comentario(instruccion):
601
+ """
602
+ Agrega el comentario de la intrucción en una línea de código
603
+
604
+ Parámetros
605
+ ----------
606
+ instrucción: str
607
+ La intrucción de voz en texto.
608
+
609
+ Regresa
610
+ ---------
611
+ output: str
612
+ Comentario
613
+ """
614
+
615
+ global bloque
616
+ global indentacion
617
+
618
+ # guarda los avisos o recomendaciones que el programa te hace
619
+ recomendacion = ''
620
+
621
+ # guarda la línea de código
622
+ output = ''
623
+
624
+ before_keyword, keyword, after_keyword = instruccion.partition('comentario')
625
+
626
+ return '# ' + after_keyword + '\n' + '\t' * indentacion + '|'
627
+
628
+
629
+
630
+ def fin_de_bloque(transcripcion):
631
+ """
632
+ Función auxiliar que es llamada por otras funciones.
633
+ """
634
+
635
+ global indentacion
636
+ global bloque
637
+
638
+ bloque = 'fin'
639
+ indentacion = indentacion - 1
640
+
641
+ return ''
models/variables_globales.py ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ def numero(text):
2
+ """Convierte un texto de numero en numero entero (int)
3
+
4
+ Parametros
5
+ ----------
6
+ text: list
7
+ Serie de valores
8
+
9
+ Regresa
10
+ ---------
11
+ dict_numeros: int
12
+ El número correspondiente
13
+ """
14
+ global dict_numeros
15
+ # Como sabemos que siempre sera el primer elemento el valor despues
16
+ # de número (eg. cuatro or veintecinco)
17
+ numero_str = text[0]
18
+ return dict_numeros[numero_str]
19
+
20
+ def flotante(text):
21
+ """Convierte un texto de numero en numero floatante (float)
22
+
23
+ Parametros
24
+ ----------
25
+ text: list
26
+ Serie de valores
27
+
28
+ Regresa
29
+ ---------
30
+ dict_numeros: float
31
+ El número correspondiente en floatante (eg 3.4)
32
+ """
33
+ global dict_numeros
34
+ text = " ".join(text)
35
+ before_keyword, keyword, after_keyword = text.partition('punto')
36
+ print(before_keyword)
37
+ print(after_keyword)
38
+
39
+ # Obtenemos los dos numeros antes y despues del punto
40
+ before_num = before_keyword.strip().split(' ')[0]
41
+ after_num = after_keyword.strip().split(' ')[0]
42
+
43
+ # Hacemos el mapeo uno -> 1
44
+ num1_int = dict_numeros[before_num]
45
+ num2_int = dict_numeros[after_num]
46
+
47
+ return float(str(num1_int) + '.' + str(num2_int))
48
+
49
+ def cadena(text):
50
+ """Convierte un texto de numero en string (str)
51
+
52
+ Parametros
53
+ ----------
54
+ text: list
55
+ Serie de valores
56
+
57
+ Regresa
58
+ ---------
59
+ string: str
60
+ Una cadena con el contenido del texto
61
+ """
62
+ numero_str = text[:]
63
+ return ' '.join(text)
64
+
65
+ def lista(text):
66
+ """Convierte un texto de numero en string (str)
67
+
68
+ Parametros
69
+ ----------
70
+ text: list
71
+ Serie de valores
72
+
73
+ Regresa
74
+ ---------
75
+ lista: list
76
+ Una lista vacia
77
+ """
78
+ return []
79
+
80
+
81
+ diccionario_fonetico={'alfa':'a',
82
+ 'bravo':'b',
83
+ 'carlos':'c',
84
+ 'delta':'d',
85
+ 'eduardo':'e',
86
+ 'fernando':'f',
87
+ 'garcia':'g',
88
+ 'hotel':'h',
89
+ 'india':'i',
90
+ 'julieta':'j',
91
+ 'kilo':'k',
92
+ 'lima':'l',
93
+ 'miguel':'m',
94
+ 'noviembre':'n',
95
+ 'oscar':'o',
96
+ 'papa':'p',
97
+ 'queretaro':'q',
98
+ 'romero':'',
99
+ 'sierra':'s',
100
+ 'tango':'t',
101
+ 'uniforme':'u',
102
+ 'victor':'v',
103
+ 'wafle':'w',
104
+ 'equis':'x',
105
+ 'yarda':'y',
106
+ 'llarda':'y',
107
+ 'espacio':' '}
108
+
109
+ # Separa en operadores comunes
110
+
111
+ # si esto se lematiza puedes agarrar todas las frases de la forma suma, sumar, etc.
112
+ dict_operaciones={
113
+ 'producto':'*','mas':'+','menos':'-','concatena':'+','entre':'/','modulo':'%'
114
+ }
115
+
116
+ dict_numeros = {
117
+ 'cero':0,
118
+ 'uno': 1,
119
+ 'dos': 2,
120
+ 'tres': 3,
121
+ 'cuatro':4,
122
+ 'cinco': 5,
123
+ 'seis': 6,
124
+ 'siete': 7,
125
+ 'ocho': 8,
126
+ 'nueve': 9,
127
+ 'diez': 10,
128
+ 'once': 11,
129
+ 'doce': 12,
130
+ 'trece': 13,
131
+ 'catorce': 14,
132
+ 'quince': 15,
133
+ 'dieciseis': 16,
134
+ 'diecisiete': 17,
135
+ 'dieciocho': 18,
136
+ 'diecinueve': 19,
137
+ 'veinte': 20,
138
+ 'treinta': 30,
139
+ 'cuarenta': 40,
140
+ 'cicuenta': 50,
141
+ }
142
+
143
+ # Diccionario de funciones
144
+ tipos_datos ={
145
+ 'numero': numero,
146
+ 'flotante': flotante,
147
+ 'cadena': cadena,
148
+ 'lista': lista,
149
+ }
requirements.txt ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ transformers==4.18.0
2
+ huggingsound
3
+ ipywebrtc
4
+ ipywidgets==7.7.0
5
+ ipywidgets==7.7.0
6
+ torchaudio==0.11.0
7
+ gradio
8
+ huggingsound
9
+ unidecode
10
+ ipywebrtc