DHEIVER commited on
Commit
550b28b
1 Parent(s): 8ed95c5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +225 -5
app.py CHANGED
@@ -21,7 +21,6 @@ class GeradorTrilhaAprendizado:
21
  device=self.device)
22
  self.historico: List[Dict] = []
23
 
24
- # Download NLTK data only if not already present
25
  for resource in ['punkt', 'stopwords']:
26
  try:
27
  nltk.data.find(f'tokenizers/{resource}')
@@ -71,6 +70,33 @@ class GeradorTrilhaAprendizado:
71
  logging.error(f"Processing error: {str(e)}")
72
  return ("", "", self._formatar_historico(), f"❌ Erro: {str(e)}")
73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  def _extrair_palavras_chave(self, texto: str) -> List[str]:
75
  try:
76
  tokens = word_tokenize(texto.lower())
@@ -83,6 +109,202 @@ class GeradorTrilhaAprendizado:
83
  logging.error(f"Keyword extraction error: {str(e)}")
84
  return ["erro ao extrair palavras-chave"]
85
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  def _formatar_historico(self) -> str:
87
  if not self.historico:
88
  return "Nenhuma trilha gerada ainda"
@@ -92,8 +314,6 @@ class GeradorTrilhaAprendizado:
92
  for h in self.historico[-5:]
93
  )
94
 
95
- # Rest of the methods remain the same, but with added error handling and type hints
96
-
97
  def criar_interface() -> gr.Blocks:
98
  with gr.Blocks(theme=gr.themes.Soft()) as app:
99
  gr.Markdown("""
@@ -157,10 +377,10 @@ def criar_interface() -> gr.Blocks:
157
  5. O histórico mostra suas últimas 5 trilhas geradas
158
  """)
159
 
160
- gerador = GeradorTrilhaAprendizado() # Create single instance
161
 
162
  processar_btn.click(
163
- fn=gerador.processar_audio, # Use instance method
164
  inputs=[audio_input, nome_trilha, nivel, area, duracao, incluir_recursos],
165
  outputs=[transcricao, analise, historico, status]
166
  )
 
21
  device=self.device)
22
  self.historico: List[Dict] = []
23
 
 
24
  for resource in ['punkt', 'stopwords']:
25
  try:
26
  nltk.data.find(f'tokenizers/{resource}')
 
70
  logging.error(f"Processing error: {str(e)}")
71
  return ("", "", self._formatar_historico(), f"❌ Erro: {str(e)}")
72
 
73
+ def _gerar_trilha_personalizada(self, transcricao: str, nivel: str, area: str, duracao: str) -> str:
74
+ try:
75
+ palavras_chave = self._extrair_palavras_chave(transcricao)
76
+ modulos = self._get_modulos_por_area(area, nivel)
77
+ duracao_meses = int(duracao.split()[0])
78
+ tempo_por_modulo = duracao_meses / len(modulos)
79
+
80
+ return f"""
81
+ 🎯 Objetivos Identificados:
82
+ {self._formatar_objetivos(palavras_chave, area)}
83
+
84
+ 📚 Trilha Personalizada para {area.title()} - Nível {nivel}:
85
+ {self._formatar_modulos(modulos, tempo_por_modulo)}
86
+
87
+ 🚀 Projetos Práticos Sugeridos:
88
+ {self._gerar_projetos(area, nivel)}
89
+
90
+ 📅 Cronograma ({duracao}):
91
+ {self._gerar_cronograma(duracao_meses, modulos)}
92
+
93
+ 🎖️ Marcos de Avaliação:
94
+ {self._gerar_marcos_avaliacao(nivel)}
95
+ """
96
+ except Exception as e:
97
+ logging.error(f"Error generating learning path: {str(e)}")
98
+ return "Erro ao gerar trilha de aprendizado"
99
+
100
  def _extrair_palavras_chave(self, texto: str) -> List[str]:
101
  try:
102
  tokens = word_tokenize(texto.lower())
 
109
  logging.error(f"Keyword extraction error: {str(e)}")
110
  return ["erro ao extrair palavras-chave"]
111
 
112
+ def _get_modulos_por_area(self, area: str, nivel: str) -> List[str]:
113
+ modulos = {
114
+ "programação": {
115
+ "iniciante": [
116
+ "Lógica de Programação Básica",
117
+ "Introdução a Algoritmos",
118
+ "Fundamentos de HTML/CSS",
119
+ "JavaScript Básico"
120
+ ],
121
+ "intermediário": [
122
+ "Estruturas de Dados",
123
+ "Programação Orientada a Objetos",
124
+ "Frameworks Front-end",
125
+ "Banco de Dados"
126
+ ],
127
+ "avançado": [
128
+ "Arquitetura de Software",
129
+ "DevOps e CI/CD",
130
+ "Microsserviços",
131
+ "Segurança e Performance"
132
+ ]
133
+ },
134
+ "data science": {
135
+ "iniciante": [
136
+ "Estatística Básica",
137
+ "Python para Análise de Dados",
138
+ "SQL Fundamental",
139
+ "Visualização de Dados"
140
+ ],
141
+ "intermediário": [
142
+ "Machine Learning Básico",
143
+ "Deep Learning Fundamentos",
144
+ "Big Data Analytics",
145
+ "Feature Engineering"
146
+ ],
147
+ "avançado": [
148
+ "MLOps",
149
+ "Análise Avançada",
150
+ "IA Generativa",
151
+ "Pesquisa Aplicada"
152
+ ]
153
+ },
154
+ "design": {
155
+ "iniciante": [
156
+ "Teoria das Cores",
157
+ "Tipografia",
158
+ "UI Básica",
159
+ "Ferramentas de Design"
160
+ ],
161
+ "intermediário": [
162
+ "Design Systems",
163
+ "UX Research",
164
+ "Prototipagem",
165
+ "Design Visual"
166
+ ],
167
+ "avançado": [
168
+ "Design Leadership",
169
+ "Design Estratégico",
170
+ "Design para Produto",
171
+ "Design Thinking Avançado"
172
+ ]
173
+ }
174
+ }
175
+
176
+ if area not in modulos:
177
+ return [
178
+ "Fundamentos da Área",
179
+ "Conceitos Intermediários",
180
+ "Práticas Avançadas",
181
+ "Especialização"
182
+ ]
183
+
184
+ return modulos[area].get(nivel, modulos[area]["intermediário"])
185
+
186
+ def _formatar_objetivos(self, palavras_chave: List[str], area: str) -> str:
187
+ objetivos = {
188
+ "programação": [
189
+ "Desenvolver habilidades técnicas em {}",
190
+ "Criar projetos práticos usando {}",
191
+ "Dominar conceitos de {}"
192
+ ],
193
+ "data science": [
194
+ "Analisar dados usando {}",
195
+ "Construir modelos de {}",
196
+ "Implementar soluções com {}"
197
+ ],
198
+ "design": [
199
+ "Criar interfaces usando {}",
200
+ "Desenvolver projetos de {}",
201
+ "Aplicar princípios de {}"
202
+ ]
203
+ }
204
+
205
+ templates = objetivos.get(area, objetivos["programação"])
206
+ return "\n".join(
207
+ f"• {template.format(palavra)}"
208
+ for palavra, template in zip(palavras_chave[:3], templates)
209
+ )
210
+
211
+ def _formatar_modulos(self, modulos: List[str], tempo: float) -> str:
212
+ return "\n".join(
213
+ f"Módulo {i+1}: {modulo} ({tempo:.1f} meses)"
214
+ for i, modulo in enumerate(modulos)
215
+ )
216
+
217
+ def _gerar_projetos(self, area: str, nivel: str) -> str:
218
+ projetos = {
219
+ "iniciante": [
220
+ "Projeto Tutorial Guiado",
221
+ "Mini-Projeto Prático",
222
+ "Exercícios Fundamentais"
223
+ ],
224
+ "intermediário": [
225
+ "Projeto Individual",
226
+ "Projeto em Equipe",
227
+ "Case Study Prático"
228
+ ],
229
+ "avançado": [
230
+ "Projeto Complexo",
231
+ "Contribuição Open Source",
232
+ "Projeto de Pesquisa"
233
+ ]
234
+ }
235
+
236
+ return "\n".join(f"• {projeto}" for projeto in projetos.get(nivel, projetos["intermediário"]))
237
+
238
+ def _gerar_cronograma(self, duracao: int, modulos: List[str]) -> str:
239
+ meses_por_modulo = duracao / len(modulos)
240
+ return "\n".join(
241
+ f"Mês {i*meses_por_modulo+1:.1f}-{(i+1)*meses_por_modulo:.1f}: {modulo}"
242
+ for i, modulo in enumerate(modulos)
243
+ )
244
+
245
+ def _gerar_marcos_avaliacao(self, nivel: str) -> str:
246
+ marcos = {
247
+ "iniciante": [
248
+ "Quiz de Conceitos Básicos",
249
+ "Exercícios Práticos",
250
+ "Projeto Final Básico"
251
+ ],
252
+ "intermediário": [
253
+ "Avaliação Técnica",
254
+ "Projeto Individual",
255
+ "Apresentação de Resultados"
256
+ ],
257
+ "avançado": [
258
+ "Defesa de Projeto",
259
+ "Contribuição Técnica",
260
+ "Artigo/Publicação"
261
+ ]
262
+ }
263
+
264
+ return "\n".join(f"• {marco}" for marco in marcos.get(nivel, marcos["intermediário"]))
265
+
266
+ def _gerar_recursos(self, nivel: str, area: str, objetivo: str) -> str:
267
+ recursos = {
268
+ "iniciante": {
269
+ "cursos": ["Fundamentos Básicos", "Introdução Prática"],
270
+ "livros": ["Guia do Iniciante", "Primeiros Passos"],
271
+ "projetos": ["Projeto inicial guiado", "Mini-projetos práticos"]
272
+ },
273
+ "intermediário": {
274
+ "cursos": ["Especialização Prática", "Técnicas Avançadas"],
275
+ "livros": ["Guia Completo", "Estudos de Caso"],
276
+ "projetos": ["Projetos médios", "Desafios práticos"]
277
+ },
278
+ "avançado": {
279
+ "cursos": ["Masterclass", "Especialização Pro"],
280
+ "livros": ["Técnicas Avançadas", "Estado da Arte"],
281
+ "projetos": ["Projetos complexos", "Open-source"]
282
+ }
283
+ }
284
+
285
+ r = recursos.get(nivel, recursos["intermediário"])
286
+ return f"""
287
+ 📚 Recursos Recomendados:
288
+
289
+ 1. Cursos:
290
+ - {r['cursos'][0]}
291
+ - {r['cursos'][1]}
292
+
293
+ 2. Material:
294
+ - {r['livros'][0]}
295
+ - {r['livros'][1]}
296
+
297
+ 3. Projetos:
298
+ - {r['projetos'][0]}
299
+ - {r['projetos'][1]}
300
+
301
+ 4. Extras:
302
+ - Comunidades de prática
303
+ - Mentoria entre pares
304
+ - Workshops práticos
305
+ - Avaliações periódicas
306
+ """
307
+
308
  def _formatar_historico(self) -> str:
309
  if not self.historico:
310
  return "Nenhuma trilha gerada ainda"
 
314
  for h in self.historico[-5:]
315
  )
316
 
 
 
317
  def criar_interface() -> gr.Blocks:
318
  with gr.Blocks(theme=gr.themes.Soft()) as app:
319
  gr.Markdown("""
 
377
  5. O histórico mostra suas últimas 5 trilhas geradas
378
  """)
379
 
380
+ gerador = GeradorTrilhaAprendizado()
381
 
382
  processar_btn.click(
383
+ fn=gerador.processar_audio,
384
  inputs=[audio_input, nome_trilha, nivel, area, duracao, incluir_recursos],
385
  outputs=[transcricao, analise, historico, status]
386
  )