GuillermoPuma commited on
Commit
a6e1429
1 Parent(s): 9b458b6
Files changed (1) hide show
  1. app.py +864 -3
app.py CHANGED
@@ -2,9 +2,870 @@
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
  from transformers import pipeline
10
  import gradio as gr
 
2
  import re
3
  import unidecode
4
  #from huggingsound import SpeechRecognitionModel
5
+ #from models.model import *
6
+ def sim_jac(s1, s2):
7
+
8
+ bigrams_s1 = []
9
+ bigrams_s2 = []
10
+
11
+ for i in range(len(s1) - 1):
12
+ bigrams_s1.append(s1[i:i+2])
13
+
14
+ for i in range(len(s2) - 1):
15
+ bigrams_s2.append(s2[i:i+2])
16
+
17
+ c_common = 0
18
+
19
+ for i in bigrams_s1:
20
+ if bigrams_s2.count(i) > 0:
21
+ c_common += 1
22
+
23
+ return c_common / ((len(s1) - 1) + (len(s2) - 1) - c_common)
24
+
25
+ def encontrar_palabras(transcript,cjto_palabras):
26
+ '''
27
+ Toma un string (en minúsculas) y un conjunto de palabras. Busca el primer match
28
+ de cjto_palabras en transcript y particiona el string en:
29
+ 1. El slice de la cadena antes del primer match (antes_palabra)
30
+ 2. La cadena del primer match (coincidencia de cjto_palabras)
31
+ 3. El slice de la cadena después del match (despues_palabra)
32
+ '''
33
+ inicio,final=list(re.finditer(r'|'.join(cjto_palabras),transcript))[0].span()
34
+ antes_palabra=transcript[:inicio].strip()
35
+ despues_palabra=transcript[final:].strip()
36
+ palabra=transcript[inicio:final]
37
+ return antes_palabra,palabra,despues_palabra
38
+
39
+
40
+ def agregar_adentro(codigo, transcipcion):
41
+ codigo2 = main(transcipcion)
42
+
43
+ return codigo[:-1] + codigo2
44
+
45
+
46
+ import numpy as np
47
+
48
+ def main(instruccion):
49
+ global bloque
50
+
51
+ plantillas = [
52
+ crear_funcion,
53
+ crear_condicional,
54
+ crear_condicional,
55
+ asignar_variable,
56
+ crear_variable,
57
+ crear_llamada,
58
+ crear_for,
59
+ fin_de_bloque,
60
+ crear_comentario,
61
+ crear_regresa
62
+ ]
63
+
64
+ comandos = [set(['definir', 'funcion', 'parametros']),
65
+ set(['mientras']),
66
+ set(['si']), # si se cumple / mientras se cumpla
67
+ set(['asignar', 'con']),
68
+ set(['definir', 'variable']),
69
+ set(['ejecuta', 'argumentos']),
70
+ set(['para', 'rango']),
71
+ set(['terminar','bloque']),
72
+ set(['comentario']),
73
+ set(['regresa'])
74
+
75
+ ]
76
+
77
+ J = []
78
+ for comando in comandos:
79
+ J.append(len(set(instruccion.strip().split(' ')).intersection(comando)) / len(set(instruccion.strip().split(' ')).union(comando)))
80
+ # print(J,np.argmax(J))
81
+ pos_func=np.argmax(J)
82
+ # print(pos_func)
83
+ return plantillas[pos_func](instruccion)
84
+
85
+ #------------------------------------------------
86
+ #from models.plantillas_codigo import *
87
+ import re
88
+
89
+ def crear_funcion(instruccion):
90
+ """
91
+ Crea el template de la estructura de una función
92
+
93
+ Parametros
94
+ ----------
95
+ instrucion: str
96
+ La intruccion de voz en texto.
97
+
98
+ Regresa
99
+ ---------
100
+ output: str
101
+ Codigo generado
102
+ recomendacion: str
103
+ Una sugerencia o fallo
104
+ """
105
+
106
+ global indentacion
107
+ global recomendacion
108
+ global bloque
109
+
110
+ bloque='funcion'
111
+
112
+ # guarda los avisos o recomendaciones que el programa te hace
113
+ recomendacion = ''
114
+
115
+ # guarda la línea de código
116
+ output = ''
117
+
118
+ # pivote que ayuda a definir el nombre de una función
119
+ before_keyword, keyword, after_keyword = instruccion.partition('nombre')
120
+
121
+ # verifica que haya o esté escrita la frase "nombre"
122
+ if len(after_keyword) == 0:
123
+ recomendacion = f'¡No me dijiste el nombre de la función!'
124
+
125
+ # de otro modo, si tiene nombre la función
126
+ else:
127
+
128
+ # obtenemos el nombre de la función por el usuario
129
+ name_func = after_keyword.split(' ')[1]
130
+
131
+ # verificamos si no desea poner parametros
132
+ if instruccion.strip().split(' ')[-1] == name_func:
133
+ parametros = ''
134
+
135
+ # de otro modo, si desea una función con parámetros
136
+ else:
137
+ before_keyword, keyword, after_keyword = instruccion.partition('parametros')
138
+
139
+ # verifica que si exista el nombre de los parámetros
140
+ if len(after_keyword) == 0:
141
+ parametros = ''
142
+ recomendacion = f'¡No me dijiste el nombre de los parámetros!'
143
+
144
+ # escribe como parámetros todo lo que está después de "parámetros"
145
+ else:
146
+ candidatos = []
147
+ cadena_separada = after_keyword.strip().split(' ')
148
+
149
+ for palabra in cadena_separada:
150
+ try:
151
+ candidatos.append(diccionario_fonetico[palabra])
152
+ except:
153
+ continue
154
+
155
+ if len(candidatos) == 0:
156
+ parametros = after_keyword.split(' ')[1:]
157
+ parametros = ', '.join(parametros)
158
+
159
+ else:
160
+ parametros = ', '.join(candidatos)
161
+
162
+ # indenta aunque marque que detecte que no le dije parámetros
163
+ if not recomendacion or recomendacion == '¡No me dijiste el nombre de los parámetros!':
164
+ indentacion += 1
165
+
166
+ # concatenación del nombre y parámetros de la función
167
+ output = f'<span style="color: #008000; font-weight: bold">def</span> <span style="color: #0066bb; font-weight: bold">{name_func}</span>({parametros}):<br>' + '&emsp;' * indentacion + '|'
168
+ return output
169
+
170
+ import re
171
+ def encontrar_palabras(transcript,cjto_palabras):
172
+
173
+ """
174
+ Toma un string (en minúsculos) y un conjunto de palabras. Busca el primer match
175
+ de cjto_palabras en transcript y particiona el string
176
+
177
+ Parametros
178
+ ----------
179
+ transcript: str
180
+ La intruccion de voz en texto ya en minúsculas.
181
+ cjto_palabras: list(str)
182
+ Lista de strings donde se comienza a dividir el transcript original
183
+
184
+ Regresa
185
+ ---------
186
+ output: list(str)
187
+ [antes_palabra,palabra,despues_palabra]
188
+
189
+ antes_palabra: string que está antes de la palabra de interés (de cjto_palabras)
190
+ palabra: string que da la palabra clave donde dividimos
191
+ despues_palabra: string que está después de la palabra
192
+
193
+ Ejemplo
194
+ --------
195
+ encontrar_palabras('variable india producto variable alfa',['producto','suma','menos','entre'])
196
+ >> ['variable india','producto',' variable alfa]
197
+ """
198
+ inicio,final=list(re.finditer(r'|'.join(cjto_palabras),transcript))[0].span()
199
+ antes_palabra=transcript[:inicio].strip()
200
+ despues_palabra=transcript[final:].strip()
201
+ palabra=transcript[inicio:final]
202
+ return antes_palabra,palabra,despues_palabra
203
+
204
+ def crear_condicional(transcript):
205
+ '''
206
+ Toma el transcript de un enunciado condicional y regresa su traducción a código en Python
207
+
208
+ Parametros
209
+ ----------
210
+ transcript: str
211
+ La intruccion de voz en texto ya en minúsculas.
212
+
213
+
214
+ Regresa
215
+ ---------
216
+ output: str
217
+ Cadena con el código en python, tiene una línea al final y un pipe
218
+ que representa el prompt donde se seguirá escribiendo
219
+
220
+ Ejemplo
221
+ --------
222
+ crear_condicional('mientras variable india sea menor igual a numero seis')
223
+ >> while (i<=6):
224
+ >> |
225
+ '''
226
+ global indentacion
227
+ global bloque
228
+
229
+ keyword_mapeo={'mientras':'while','si':'if','contrario':'else'}
230
+ antes_keyword,keyword,desp_keyword=encontrar_palabras(transcript,keyword_mapeo.keys())
231
+ cadena=keyword_mapeo[keyword]
232
+ bloque = keyword
233
+
234
+ if cadena=='else':
235
+ indentacion=indentacion+1
236
+ return 'else:'+'\n' +'\t'* indentacion+'|'
237
+
238
+ # Primera división
239
+ condicional_mapeo={'menor estricto':'<','menor o igual':'<=','igual':'==','diferente':'!='
240
+ ,'mayor estricto':'>','mayor o igual':'>='}
241
+ cjto_condicional=condicional_mapeo.keys()
242
+ antes_condicional,palabra_condicional,despues_condicional=encontrar_palabras(transcript,cjto_condicional)
243
+
244
+
245
+ # Buscar antes en la lista de variables
246
+ a_var,var,d_var=encontrar_palabras(antes_condicional,['variable'])
247
+ nombre_var=d_var.split(' ')[0]
248
+
249
+ if diccionario_fonetico.get(nombre_var,False):
250
+ nombre_var=diccionario_fonetico[nombre_var]
251
+
252
+
253
+ cadena+=' '+nombre_var+' ' +condicional_mapeo[palabra_condicional]
254
+
255
+ # Buscar en despues_condicional el número
256
+
257
+ valor=despues_condicional.split(' ')[-1]
258
+
259
+ if dict_numeros.get(valor,False):
260
+ valor=str(dict_numeros[valor])
261
+
262
+ indentacion+=1
263
+ #t = f'<span style="text-indent:{20 * indentacion}px";> <span>'
264
+ return f'<span style="color: #008000; font-weight: bold">{keyword_mapeo[keyword]} </span> {nombre_var} {condicional_mapeo[palabra_condicional]} {valor}:'+'<br>' +'&emsp;'* indentacion+'|'
265
+
266
+
267
+
268
+ def crear_cadena(transcript):
269
+ """
270
+ Toma el transcript de un enunciado que contiene una cadena y regresa el código en Python.
271
+ Para usarse cuando ya se sabe que transcript sólo es los límites de la cadena
272
+
273
+ Parametros
274
+ ----------
275
+ transcript: str
276
+ La intruccion de voz en texto ya en minúsculas.
277
+
278
+
279
+ Regresa
280
+ ---------
281
+ output: list(str)
282
+ antes_palabra:parte del transcript que va antes de las comillas
283
+ palabra: Cadena con el código en python de las comillas y lo que está adentro
284
+ despues_palabra:parte del transcript que va antes de las comillas
285
+
286
+ Ejemplo
287
+ --------
288
+ crear_cadena('ejecuta print con argumentos variable India producto cadena guion cadena')[1]
289
+ >> ['ejecuta print con argumentos variable India producto','"guion"','']
290
+ """
291
+ try:
292
+ inicio,final=list(re.finditer(r"cadena (.+) cadena",transcript))[0].span()
293
+ except:
294
+ return ''
295
+ antes_palabra=transcript[:inicio].strip()
296
+ despues_palabra=transcript[final:].strip()
297
+ palabra=list(re.finditer(r"cadena (.+) cadena",transcript))[0].group(1)
298
+ return antes_palabra,f'"{palabra}"',despues_palabra
299
+
300
+ def crear_var_existente(transcript):
301
+ """
302
+ Toma el transcript de un enunciado que contiene la mención de una variable
303
+ y devuelve dicha variable
304
+
305
+ Parametros
306
+ ----------
307
+ transcript: str
308
+ La intruccion de voz en texto ya en minúsculas.
309
+
310
+
311
+ Regresa
312
+ ---------
313
+ output: str
314
+ palabra: Cadena con el código en python del nombre de la variable
315
+
316
+ Ejemplo
317
+ --------
318
+ crear_var_existente('ejecuta print con argumentos variable india producto cadena guión cadena')
319
+ >> i
320
+ """
321
+ try:
322
+ antes_var,var,desp_var=encontrar_palabras(transcript,['variable'])
323
+ except:
324
+ return ''
325
+
326
+ nombre_var=desp_var.split(' ')[0]
327
+ if diccionario_fonetico.get(nombre_var,False):
328
+ nombre_var=diccionario_fonetico[nombre_var]
329
+
330
+ return nombre_var
331
+
332
+
333
+ # TODO: Hay que ver:
334
+ # Si es otra operación hay que llamar la función recursivamente en cada pedazo
335
+ # 1. si es cadena
336
+ # 2. si es otra operación. Para esto, hay que regresar error o algo así cuando no se encuentre
337
+ def crear_operacion(transcript):
338
+ '''
339
+
340
+ Toma el transcript de una operación binaria y la traduce a código de Python.
341
+ Para traducir las variables que se usan en la operación binaria busca
342
+ si son cadenas o sólo menciones de variables usando las funciones
343
+ crear_cadena y crear_var_existente
344
+
345
+ Parametros
346
+ ----------
347
+ transcript: str
348
+ La intruccion de voz en texto ya en minúsculas.
349
+
350
+
351
+ Regresa
352
+ ---------
353
+ output: str
354
+ Cadena con el código en python
355
+
356
+ Ejemplo
357
+ --------
358
+ crear_operacion('variable India producto cadena guión cadena')
359
+ >> i*'-'
360
+ '''
361
+ global dict_operaciones
362
+
363
+
364
+ try:
365
+ antes_op,op,desp_op=encontrar_palabras(transcript,dict_operaciones.keys())
366
+ except:
367
+ return ''
368
+
369
+ # Buscamos la información en la cadena detrás del operador
370
+ cadena_izq=crear_var_existente(antes_op)
371
+ try:
372
+ cadena_izq+=f'{crear_cadena(antes_op)[1]}'
373
+ except:
374
+ cadena_izq+=''
375
+
376
+ if len(cadena_izq)==0:
377
+ nombre_var=antes_op.split(' ')[-1]
378
+ if dict_numeros.get(nombre_var,False):
379
+ nombre_var=dict_numeros[nombre_var]
380
+ cadena_izq+=str(nombre_var)
381
+
382
+ # Buscamos la información en la cadena después del operador
383
+ cadena_der=crear_var_existente(desp_op)
384
+ try:
385
+ cadena_der+=f'{crear_cadena(desp_op)[1]}'
386
+ except:
387
+ cadena_der+=''
388
+
389
+ if len(cadena_der)==0:
390
+ nombre_var=desp_op.split(' ')[0]
391
+ if dict_numeros.get(nombre_var,False):
392
+ nombre_var=dict_numeros[nombre_var]
393
+ if diccionario_fonetico.get(nombre_var,False):
394
+ nombre_var=diccionario_fonetico[nombre_var]
395
+ cadena_der+=str(nombre_var)
396
+
397
+
398
+ return f'{cadena_izq} {dict_operaciones[op]} {cadena_der}'
399
+
400
+
401
+ def crear_llamada(transcript):
402
+ """
403
+ Toma el transcript de la llamada de una función y la convierte en código de Python
404
+ Hace uso de las funciones que detectan operaciones, variables y comillas
405
+ ,para cada argumento de la función
406
+
407
+ Parametros
408
+ ----------
409
+ transcript: str
410
+ La intruccion de voz en texto ya en minúsculas.
411
+
412
+
413
+ Regresa
414
+ ---------
415
+ output: str
416
+ Cadena con el código en python
417
+
418
+ Ejemplo
419
+ --------
420
+ crear_llamada(ejecuta print con argumentos variable India producto cadena guión cadena
421
+ coma cadena hola cadena')
422
+ >> print(i*'-','hola')
423
+
424
+ """
425
+ global bloque
426
+ global indentacion
427
+
428
+ bloque='llamada'
429
+ try:
430
+ antes_ej,ej,desp_ej=encontrar_palabras(transcript,['ejecuta'])
431
+ except:
432
+ return ''
433
+ funcion_nombre=desp_ej.split(' ')[0]
434
+ # Aquí tal vez valdría la pena tener un registro de las funciones previamente definidas para
435
+ # poder buscar en un directorio con Jaccard y no aproximar
436
+
437
+ antes_arg,keyword,desp_arg=encontrar_palabras(desp_ej,['argumentos','parametros'])
438
+
439
+ argumentos=desp_arg.split('coma')
440
+ lista_cadenas=[]
441
+ for arg in argumentos:
442
+ arg=arg.strip()
443
+ cadena_arg=''
444
+ # print('arg',arg)
445
+ # Caso cuando es operacion
446
+ cadena_op=crear_operacion(arg)
447
+ cadena_var=crear_var_existente(arg)
448
+ cadena_cadena=crear_cadena(arg)
449
+ if len(cadena_op)!=0:
450
+ lista_cadenas.append(cadena_op)
451
+ elif len(cadena_var)!=0:
452
+ lista_cadenas.append(cadena_var)
453
+ elif len(cadena_cadena)!=0:
454
+ lista_cadenas.append(cadena_cadena[1])
455
+ else:
456
+ nombre_var=arg
457
+ if dict_numeros.get(nombre_var,False):
458
+ nombre_var=str(dict_numeros[nombre_var])
459
+
460
+ lista_cadenas.append(nombre_var)
461
+
462
+ # Caso cuando es variable
463
+
464
+ cadena_final=','.join(lista_cadenas)
465
+ cadena=f'{funcion_nombre}({cadena_final})<br>'+'&emsp;'*indentacion+'|'
466
+
467
+ return cadena
468
+
469
+ def crear_regresa(transcript):
470
+ antes_reg,reg,desp_reg=encontrar_palabras(transcript,['regresa'])
471
+
472
+ arg=desp_reg.strip()
473
+ cadena_arg=''
474
+
475
+ # Si es llamada
476
+ cadena_llamada=crear_llamada(arg)
477
+ # Caso cuando es operacion
478
+ cadena_op=crear_operacion(arg)
479
+ cadena_var=crear_var_existente(arg)
480
+ cadena_cadena=crear_cadena(arg)
481
+
482
+ cadena_final=''
483
+ if len(cadena_llamada)!=0:
484
+ cadena_final+=cadena_llamada[:-2]
485
+ elif len(cadena_op)!=0:
486
+ cadena_final+=cadena_op
487
+ elif len(cadena_var)!=0:
488
+ cadena_final+=cadena_var
489
+ elif len(cadena_cadena)!=0:
490
+ cadena_final+=cadena_cadena[1]
491
+ else:
492
+ nombre_var=arg
493
+ if dict_numeros.get(nombre_var,False):
494
+ nombre_var=str(dict_numeros[nombre_var])
495
+
496
+ cadena_final+=nombre_var
497
+ global indentacion
498
+ indentacion-=1
499
+ return f'<span style="color: #AA22FF; font-weight: bold">return</span> {cadena_final}<br>'+'&emsp;'*indentacion+'|'
500
+
501
+
502
+ def crear_variable(instruccion):
503
+ """
504
+ Estructura:
505
+ definir variable con nombre [nombre_variable] igual a /*objeto_basico* valor/
506
+
507
+ Parametros
508
+ ----------
509
+ instrucion: str
510
+ La intruccion de voz en texto.
511
+
512
+ Regresa
513
+ ---------
514
+ output: str
515
+ Codigo generado
516
+ recomendacion: str
517
+ Una sugerencia o fallo
518
+
519
+ Testing
520
+ -------
521
+ >>> definir variable con nombre india igual a numero uno
522
+ >>> definir variable con nombre i igual a numero 1 (int)
523
+ >>> definir variable con nombre i igual a flotante tres punto cinco (float)
524
+ >>> definir variable con nombre i igual a cadena hola (string)
525
+ >>> definir variable con nombre i igual a lista/dic (string)
526
+ """
527
+ global indentacion
528
+ global bloque
529
+
530
+ bloque='variable'
531
+
532
+ # pivote que ayuda a definir el nombre de la variable
533
+ before_keyword, keyword, after_keyword = instruccion.partition('nombre')
534
+ after_keyword_list = after_keyword.strip().split(' ')
535
+ # [india igual a numero uno]
536
+ name_variable = after_keyword_list[0]
537
+
538
+ # Como sabemos que despues del nombre va seguido de "igual a"
539
+ tipo_dato = after_keyword_list[3]
540
+ #print(after_keyword_list[4:]) -> lista
541
+ valor = tipos_datos[tipo_dato](after_keyword_list[4:])
542
+
543
+ # Verificamos si es una palabra fonetica
544
+ if diccionario_fonetico.get(name_variable,False):
545
+ name_variable=diccionario_fonetico[name_variable]
546
+
547
+ codigo_generado = f'{name_variable} = {valor}<br>'+ '&emsp;' * indentacion + '|'
548
+ return codigo_generado
549
+
550
+
551
+ def asignar_variable(instruccion):
552
+ """
553
+ Asigna una variable (eg. indio = indio + 1)
554
+
555
+ Parametros
556
+ ----------
557
+ instrucion: str
558
+ La intruccion de voz en texto.
559
+
560
+ Regresa
561
+ ---------
562
+ output: str
563
+ Codigo generado (indio = indio + 1)
564
+
565
+ Testing
566
+ --------
567
+ >>>'asignar variable india con india suma uno',
568
+ >>>'asignar variable contador con contador menos uno',
569
+ >>>'asignar variable contador con alfa',
570
+ >>>'asignar variable india con india',
571
+
572
+ """
573
+ global bloque
574
+ bloque = "asignar"
575
+
576
+ before_keyword, keyword, after_keyword = instruccion.partition('variable')
577
+ after_keyword_list = after_keyword.strip().split(' ')
578
+ name_variable = after_keyword_list[0]
579
+ start = after_keyword_list.index('con') + 1
580
+ operacion = after_keyword_list[start:]
581
+ if len(operacion) != 1:
582
+ operacion_str = crear_operacion(keyword + ' ' + ' '.join(operacion))
583
+ else:
584
+ operacion_str = operacion[0]
585
+ # Verificamos si es una palabra fonetica para lado derecho de la
586
+ # asignacion
587
+ if diccionario_fonetico.get(operacion_str,False):
588
+ operacion_str=diccionario_fonetico[operacion_str]
589
+
590
+ # Verificamos si es una palabra fonetica
591
+ if diccionario_fonetico.get(name_variable,False):
592
+ name_variable=diccionario_fonetico[name_variable]
593
+
594
+ codigo_generado = f'{name_variable} = {operacion_str}<br>'+ '&emsp;' * indentacion + '|'
595
+ return codigo_generado
596
+
597
+
598
+ def crear_for(instruccion):
599
+ """
600
+ Crea el template de la estructura de un ciclo for.
601
+
602
+ Parámetros
603
+ ----------
604
+ instrucción: str
605
+ La intrucción de voz en texto.
606
+
607
+ Regresa
608
+ ---------
609
+ output: str
610
+ Estructura del ciclo for
611
+ recomendacion: str
612
+ Una sugerencia o error
613
+ """
614
+ global bloque
615
+ global indentacion
616
+ global recomendacion
617
+
618
+ bloque='for'
619
+ vocabulario_basico = ['iteracion', 'rango']
620
+
621
+ # verificamos si la frase cumple los requisitos
622
+ instruccion_tokens = instruccion.strip().split(' ')
623
+
624
+ for i in vocabulario_basico:
625
+ try:
626
+ instruccion_tokens.index(i)
627
+ except:
628
+ recomendacion = 'Parece que quieres una iteración pero no reconozco tus comandos, inténtalo de nuevo'
629
+ return f'', recomendacion
630
+
631
+ # guarda los avisos o recomendaciones que el programa te hace
632
+ recomendacion = ''
633
+
634
+ # guarda la línea de código
635
+ output = ''
636
+
637
+ # pivote que ayuda a definir el rango e iterador
638
+ before_keyword, keyword, after_keyword = instruccion.partition('iteracion')
639
+
640
+ if after_keyword.strip().split(' ')[1] in diccionario_fonetico:
641
+ iterador = diccionario_fonetico[after_keyword.strip().split(' ')[1]]
642
+
643
+ else:
644
+ iterador = after_keyword.strip().split(' ')[1]
645
+
646
+ before_keyword, keyword, after_keyword = instruccion.partition('rango')
647
+
648
+ limites = []
649
+
650
+
651
+ for i, item in enumerate(after_keyword.strip().split(' ')):
652
+ try:
653
+ limites.append(dict_numeros[item])
654
+ except:
655
+ continue
656
+
657
+ if len(limites) == 0:
658
+ for i, item in enumerate(after_keyword.strip().split(' ')):
659
+ try:
660
+ limites.append(diccionario_fonetico[item])
661
+ except:
662
+ continue
663
+
664
+ indentacion += 1
665
+
666
+ if len(limites) == 0:
667
+ return f''
668
+
669
+ elif len(limites) == 1:
670
+ return f'<span style="color: #008000; font-weight: bold">for</span> {iterador} in <span style="color: #0066bb; font-weight: bold">range</span>({limites[-1]}):<br>' + '&emsp;' * indentacion + '|'
671
+
672
+ elif len(limites) == 2:
673
+ return f'<span style="color: #008000; font-weight: bold">for</span> {iterador} in <span style="color: #0066bb; font-weight: bold">range</span>({limites[0]}, {limites[1]}):<br>' + '&emsp;' * indentacion + '|'
674
+
675
+ elif len(limites) >= 2:
676
+ recomendacion = 'Me dictaste más de un número en el rango pero tomé los dos primeros'
677
+ return f'<span style="color: #008000; font-weight: bold">for</span> {iterador} in <span style="color: #0066bb; font-weight: bold">range</span>({limites[0]}, {limites[1]}):<br>' + '&emsp;' * indentacion + '|'
678
+
679
+ def crear_comentario(instruccion):
680
+ """
681
+ Agrega el comentario de la intrucción en una línea de código
682
+
683
+ Parámetros
684
+ ----------
685
+ instrucción: str
686
+ La intrucción de voz en texto.
687
+
688
+ Regresa
689
+ ---------
690
+ output: str
691
+ Comentario
692
+ """
693
+
694
+ global bloque
695
+ global indentacion
696
+
697
+ # guarda los avisos o recomendaciones que el programa te hace
698
+ recomendacion = ''
699
+ bloque = 'comentario'
700
+ # guarda la línea de código
701
+ output = ''
702
+
703
+ before_keyword, keyword, after_keyword = instruccion.partition('comentario')
704
+
705
+ return '<span style="color: #888888">' + '# ' + after_keyword + '</span>' + '<br>' + '&emsp;' * indentacion + '|'
706
+
707
+ def fin_de_bloque(transcripcion):
708
+ global indentacion
709
+ global bloque
710
+ bloque='fin'
711
+ indentacion=indentacion-1
712
+ return '|'
713
+
714
+
715
+ #------------------------------------
716
+ #from models.variables_globales import *
717
+ def numero(text):
718
+ """Convierte un texto de numero en numero entero (int)
719
+
720
+ Parametros
721
+ ----------
722
+ text: list
723
+ Serie de valores
724
+
725
+ Regresa
726
+ ---------
727
+ dict_numeros: int
728
+ El número correspondiente
729
+ """
730
+ global dict_numeros
731
+ # Como sabemos que siempre sera el primer elemento el valor despues
732
+ # de número (eg. cuatro or veintecinco)
733
+ numero_str = text[0]
734
+ return dict_numeros[numero_str]
735
+
736
+ def flotante(text):
737
+ """Convierte un texto de numero en numero floatante (float)
738
+
739
+ Parametros
740
+ ----------
741
+ text: list
742
+ Serie de valores
743
+
744
+ Regresa
745
+ ---------
746
+ dict_numeros: float
747
+ El número correspondiente en floatante (eg 3.4)
748
+ """
749
+ global dict_numeros
750
+ text = " ".join(text)
751
+ before_keyword, keyword, after_keyword = text.partition('punto')
752
+ print(before_keyword)
753
+ print(after_keyword)
754
+
755
+ # Obtenemos los dos numeros antes y despues del punto
756
+ before_num = before_keyword.strip().split(' ')[0]
757
+ after_num = after_keyword.strip().split(' ')[0]
758
+
759
+ # Hacemos el mapeo uno -> 1
760
+ num1_int = dict_numeros[before_num]
761
+ num2_int = dict_numeros[after_num]
762
+
763
+ return float(str(num1_int) + '.' + str(num2_int))
764
+
765
+ def cadena(text):
766
+ """Convierte un texto de numero en string (str)
767
+
768
+ Parametros
769
+ ----------
770
+ text: list
771
+ Serie de valores
772
+
773
+ Regresa
774
+ ---------
775
+ string: str
776
+ Una cadena con el contenido del texto
777
+ """
778
+ numero_str = text[:]
779
+ return ' '.join(text)
780
+
781
+ def lista(text):
782
+ """Convierte un texto de numero en string (str)
783
+
784
+ Parametros
785
+ ----------
786
+ text: list
787
+ Serie de valores
788
+
789
+ Regresa
790
+ ---------
791
+ lista: list
792
+ Una lista vacia
793
+ """
794
+ return []
795
+
796
+
797
+
798
+ diccionario_fonetico={'andrea':'a',
799
+ 'bravo':'b',
800
+ 'carlos':'c',
801
+ 'delta':'d',
802
+ 'eduardo':'e',
803
+ 'fernando':'f',
804
+ 'garcia':'g',
805
+ 'hotel':'h',
806
+ 'india':'i',
807
+ 'julieta':'j',
808
+ 'kilo':'k',
809
+ 'lima':'l',
810
+ 'miguel':'m',
811
+ 'noviembre':'n',
812
+ 'oscar':'o',
813
+ 'papa':'p',
814
+ 'queretaro':'q',
815
+ 'romero':'',
816
+ 'sierra':'s',
817
+ 'tango':'t',
818
+ 'uniforme':'u',
819
+ 'victor':'v',
820
+ 'wafle':'w',
821
+ 'equis':'x',
822
+ 'yarda':'y',
823
+ 'llarda':'y',
824
+ 'espacio':' '}
825
+
826
+ # Separa en operadores comunes
827
+
828
+ # si esto se lematiza puedes agarrar todas las frases de la forma suma, sumar, etc.
829
+ dict_operaciones={
830
+ 'producto':'*','mas':'+','menos':'-','concatena':'+','entre':'/','modulo':'%'
831
+ }
832
+
833
+ dict_numeros = {
834
+ 'cero':0,
835
+ 'uno': 1,
836
+ 'dos': 2,
837
+ 'tres': 3,
838
+ 'cuatro':4,
839
+ 'cinco': 5,
840
+ 'seis': 6,
841
+ 'siete': 7,
842
+ 'ocho': 8,
843
+ 'nueve': 9,
844
+ 'diez': 10,
845
+ 'once': 11,
846
+ 'doce': 12,
847
+ 'trece': 13,
848
+ 'catorce': 14,
849
+ 'quince': 15,
850
+ 'dieciseis': 16,
851
+ 'diecisiete': 17,
852
+ 'dieciocho': 18,
853
+ 'diecinueve': 19,
854
+ 'veinte': 20,
855
+ 'treinta': 30,
856
+ 'cuarenta': 40,
857
+ 'cicuenta': 50,
858
+ }
859
+
860
+ # Diccionario de funciones
861
+ tipos_datos ={
862
+ 'natural': numero,
863
+ 'flotante': flotante,
864
+ 'cadena': cadena,
865
+ 'lista': lista,
866
+ }
867
+
868
+ #--------------------------
869
 
870
  from transformers import pipeline
871
  import gradio as gr