DHEIVER commited on
Commit
8ed95c5
·
verified ·
1 Parent(s): 0bdc6fb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -283
app.py CHANGED
@@ -6,31 +6,49 @@ import nltk
6
  from nltk.tokenize import word_tokenize
7
  from nltk.corpus import stopwords
8
  from collections import Counter
 
 
9
 
10
  class GeradorTrilhaAprendizado:
11
  def __init__(self):
12
- self.device = 0 if torch.cuda.is_available() else -1
13
- self.transcriber = pipeline("automatic-speech-recognition",
14
- model="openai/whisper-base",
15
- device=self.device)
16
- self.generator = pipeline("text-generation",
17
- model="gpt2-large",
18
- device=self.device)
19
- self.historico = []
20
- # Inicializa NLTK
21
- nltk.download('punkt')
22
- nltk.download('stopwords')
23
- self.stop_words = set(stopwords.words('portuguese'))
 
 
 
 
 
 
 
 
 
 
24
 
25
- def processar_audio(self,
26
- audio_path: str,
27
  nome_trilha: str,
28
  nivel: str = "intermediário",
29
  area: str = "geral",
30
  duracao: str = "3 meses",
31
- incluir_recursos: bool = True) -> tuple:
 
 
 
32
  try:
33
  transcricao = self.transcriber(audio_path)["text"]
 
 
 
34
  analise = self._gerar_trilha_personalizada(transcricao, nivel, area, duracao)
35
 
36
  if incluir_recursos:
@@ -39,7 +57,7 @@ class GeradorTrilhaAprendizado:
39
 
40
  self.historico.append({
41
  "data": datetime.now().strftime("%d/%m/%Y %H:%M"),
42
- "nome": nome_trilha,
43
  "nivel": nivel,
44
  "area": area,
45
  "duracao": duracao,
@@ -47,279 +65,36 @@ class GeradorTrilhaAprendizado:
47
  "analise": analise
48
  })
49
 
50
- return (
51
- transcricao,
52
- analise,
53
- self._formatar_historico(),
54
- "✅ Trilha gerada com sucesso!"
55
- )
56
  except Exception as e:
57
- return (
58
- f"Erro: {str(e)}",
59
- "Não foi possível gerar a análise.",
60
- self._formatar_historico(),
61
- "❌ Ocorreu um erro"
62
- )
63
-
64
- def _gerar_trilha_personalizada(self, transcricao: str, nivel: str, area: str, duracao: str) -> str:
65
- palavras_chave = self._extrair_palavras_chave(transcricao)
66
-
67
- modulos_por_area = {
68
- "programação": {
69
- "iniciante": [
70
- "Lógica de Programação Básica",
71
- "Introdução a Algoritmos",
72
- "Fundamentos de HTML/CSS",
73
- "JavaScript Básico"
74
- ],
75
- "intermediário": [
76
- "Estruturas de Dados",
77
- "Programação Orientada a Objetos",
78
- "Frameworks Front-end",
79
- "Banco de Dados"
80
- ],
81
- "avançado": [
82
- "Arquitetura de Software",
83
- "DevOps e CI/CD",
84
- "Microsserviços",
85
- "Segurança e Performance"
86
- ]
87
- },
88
- "data science": {
89
- "iniciante": [
90
- "Estatística Básica",
91
- "Python para Análise de Dados",
92
- "SQL Fundamental",
93
- "Visualização de Dados"
94
- ],
95
- "intermediário": [
96
- "Machine Learning Básico",
97
- "Deep Learning Fundamentos",
98
- "Big Data Analytics",
99
- "Feature Engineering"
100
- ],
101
- "avançado": [
102
- "MLOps",
103
- "Análise Avançada",
104
- "IA Generativa",
105
- "Pesquisa Aplicada"
106
- ]
107
- },
108
- "design": {
109
- "iniciante": [
110
- "Teoria das Cores",
111
- "Tipografia",
112
- "UI Básica",
113
- "Ferramentas de Design"
114
- ],
115
- "intermediário": [
116
- "Design Systems",
117
- "UX Research",
118
- "Prototipagem",
119
- "Design Visual"
120
- ],
121
- "avançado": [
122
- "Design Leadership",
123
- "Design Estratégico",
124
- "Design para Produto",
125
- "Design Thinking Avançado"
126
- ]
127
- }
128
- }
129
-
130
- # Usa módulos padrão se a área não estiver mapeada
131
- if area not in modulos_por_area:
132
- modulos_por_area[area] = {
133
- "iniciante": [
134
- "Fundamentos Básicos",
135
- "Introdução à Área",
136
- "Ferramentas Essenciais",
137
- "Práticas Iniciais"
138
- ],
139
- "intermediário": [
140
- "Conceitos Avançados",
141
- "Técnicas Especializadas",
142
- "Projetos Práticos",
143
- "Metodologias"
144
- ],
145
- "avançado": [
146
- "Especialização Profissional",
147
- "Gestão de Projetos",
148
- "Inovação na Área",
149
- "Liderança Técnica"
150
- ]
151
- }
152
-
153
- duracao_meses = int(duracao.split()[0])
154
- tempo_por_modulo = duracao_meses / 4
155
-
156
- template = f"""
157
- 🎯 Objetivos Identificados:
158
- {self._formatar_objetivos(palavras_chave)}
159
-
160
- 📚 Trilha Personalizada para {area.title()} - Nível {nivel}:
161
- {self._formatar_modulos(modulos_por_area[area][nivel], tempo_por_modulo)}
162
-
163
- 🚀 Projetos Práticos Sugeridos:
164
- {self._gerar_projetos(area, nivel, palavras_chave)}
165
-
166
- 📅 Cronograma ({duracao}):
167
- {self._gerar_cronograma(duracao_meses, modulos_por_area[area][nivel])}
168
-
169
- 🎖️ Marcos de Avaliação:
170
- {self._gerar_marcos_avaliacao(nivel)}
171
- """
172
-
173
- return template
174
-
175
- def _extrair_palavras_chave(self, texto: str) -> list:
176
- tokens = word_tokenize(texto.lower())
177
- palavras = [palavra for palavra in tokens
178
- if palavra.isalnum() and
179
- palavra not in self.stop_words]
180
- return [palavra[0] for palavra in Counter(palavras).most_common(5)]
181
-
182
- def _formatar_objetivos(self, palavras_chave: list) -> str:
183
- objetivos = {
184
- "programação": [
185
- "Desenvolver habilidades técnicas em {}",
186
- "Criar projetos práticos usando {}",
187
- "Dominar conceitos de {}"
188
- ],
189
- "data science": [
190
- "Analisar dados usando {}",
191
- "Construir modelos de {}",
192
- "Implementar soluções com {}"
193
- ],
194
- "design": [
195
- "Criar interfaces usando {}",
196
- "Desenvolver projetos de {}",
197
- "Aplicar princípios de {}"
198
- ]
199
- }
200
-
201
- return "\n".join([
202
- f"• {objetivo.format(palavra)}"
203
- for palavra, objetivo in zip(palavras_chave, objetivos.get("geral", objetivos["programação"]))
204
- ])
205
-
206
- def _formatar_modulos(self, modulos: list, tempo: float) -> str:
207
- return "\n".join([
208
- f"Módulo {i+1}: {modulo} ({tempo:.1f} meses)"
209
- for i, modulo in enumerate(modulos)
210
- ])
211
 
212
- def _gerar_projetos(self, area: str, nivel: str, palavras_chave: list) -> str:
213
- projetos = {
214
- "iniciante": [
215
- "Projeto Tutorial Guiado",
216
- "Mini-Projeto Prático",
217
- "Exercícios Fundamentais"
218
- ],
219
- "intermediário": [
220
- "Projeto Individual",
221
- "Projeto em Equipe",
222
- "Case Study Prático"
223
- ],
224
- "avançado": [
225
- "Projeto Complexo",
226
- "Contribuição Open Source",
227
- "Projeto de Pesquisa"
228
- ]
229
- }
230
-
231
- return "\n".join([
232
- f"• {projeto}" for projeto in projetos[nivel]
233
- ])
234
-
235
- def _gerar_cronograma(self, duracao: int, modulos: list) -> str:
236
- meses_por_modulo = duracao / len(modulos)
237
- cronograma = []
238
-
239
- for i, modulo in enumerate(modulos):
240
- inicio = i * meses_por_modulo + 1
241
- fim = (i + 1) * meses_por_modulo
242
- cronograma.append(
243
- f"Mês {inicio:.1f}-{fim:.1f}: {modulo}"
244
- )
245
-
246
- return "\n".join(cronograma)
247
-
248
- def _gerar_marcos_avaliacao(self, nivel: str) -> str:
249
- marcos = {
250
- "iniciante": [
251
- "Quiz de Conceitos Básicos",
252
- "Exercícios Práticos",
253
- "Projeto Final Básico"
254
- ],
255
- "intermediário": [
256
- "Avaliação Técnica",
257
- "Projeto Individual",
258
- "Apresentação de Resultados"
259
- ],
260
- "avançado": [
261
- "Defesa de Projeto",
262
- "Contribuição Técnica",
263
- "Artigo/Publicação"
264
- ]
265
- }
266
-
267
- return "\n".join([
268
- f"• {marco}" for marco in marcos[nivel]
269
- ])
270
 
271
  def _formatar_historico(self) -> str:
272
  if not self.historico:
273
  return "Nenhuma trilha gerada ainda"
274
 
275
- historico_fmt = "📋 Histórico de Trilhas:\n\n"
276
- for h in self.historico[-5:]:
277
- historico_fmt += f"• {h['data']} - {h['nome']} ({h['nivel']}, {h['area']})\n"
278
- return historico_fmt
279
-
280
- def _gerar_recursos(self, nivel: str, area: str, objetivo: str) -> str:
281
- recursos_por_nivel = {
282
- "iniciante": {
283
- "cursos": ["Fundamentos Básicos", "Introdução Prática"],
284
- "livros": ["Guia do Iniciante", "Primeiros Passos"],
285
- "projetos": ["Projeto inicial guiado", "Mini-projetos práticos"]
286
- },
287
- "intermediário": {
288
- "cursos": ["Especialização Prática", "Técnicas Avançadas"],
289
- "livros": ["Guia Completo", "Estudos de Caso"],
290
- "projetos": ["Projetos de média complexidade", "Desafios práticos"]
291
- },
292
- "avançado": {
293
- "cursos": ["Masterclass Avançada", "Especialização Profissional"],
294
- "livros": ["Técnicas Avançadas", "Estado da Arte"],
295
- "projetos": ["Projetos complexos", "Contribuições open-source"]
296
- }
297
- }
298
 
299
- recursos = recursos_por_nivel[nivel]
300
- return f"""
301
- 📚 Recursos Recomendados para {area} - Nível {nivel}:
302
-
303
- 1. Cursos Recomendados:
304
- - {recursos['cursos'][0]}
305
- - {recursos['cursos'][1]}
306
-
307
- 2. Material de Estudo:
308
- - {recursos['livros'][0]}
309
- - {recursos['livros'][1]}
310
-
311
- 3. Projetos Práticos:
312
- - {recursos['projetos'][0]}
313
- - {recursos['projetos'][1]}
314
-
315
- 4. Recursos Adicionais:
316
- - Comunidades de prática
317
- - Mentoria entre pares
318
- - Workshops práticos
319
- - Avaliações periódicas
320
- """
321
 
322
- def criar_interface():
323
  with gr.Blocks(theme=gr.themes.Soft()) as app:
324
  gr.Markdown("""
325
  # 🎓 Gerador de Trilha de Aprendizado
@@ -337,7 +112,8 @@ def criar_interface():
337
 
338
  nome_trilha = gr.Textbox(
339
  label="Nome da Trilha",
340
- placeholder="Dê um nome para sua trilha"
 
341
  )
342
 
343
  nivel = gr.Dropdown(
@@ -370,7 +146,7 @@ def criar_interface():
370
  status = gr.Markdown()
371
  transcricao = gr.Textbox(label="Transcrição do Áudio", lines=4)
372
  analise = gr.Textbox(label="Sua Trilha de Aprendizado", lines=10)
373
- historico = gr.Markdown(label="Histórico")
374
 
375
  with gr.Accordion("ℹ️ Como usar"):
376
  gr.Markdown("""
@@ -380,9 +156,11 @@ def criar_interface():
380
  4. Revise a transcrição e a trilha gerada
381
  5. O histórico mostra suas últimas 5 trilhas geradas
382
  """)
 
 
383
 
384
  processar_btn.click(
385
- fn=GeradorTrilhaAprendizado().processar_audio,
386
  inputs=[audio_input, nome_trilha, nivel, area, duracao, incluir_recursos],
387
  outputs=[transcricao, analise, historico, status]
388
  )
@@ -390,6 +168,7 @@ def criar_interface():
390
  return app
391
 
392
  if __name__ == "__main__":
 
393
  app = criar_interface()
394
  app.queue()
395
  app.launch()
 
6
  from nltk.tokenize import word_tokenize
7
  from nltk.corpus import stopwords
8
  from collections import Counter
9
+ import logging
10
+ from typing import Dict, List, Tuple, Optional
11
 
12
  class GeradorTrilhaAprendizado:
13
  def __init__(self):
14
+ try:
15
+ self.device = "cuda" if torch.cuda.is_available() else "cpu"
16
+ self.transcriber = pipeline("automatic-speech-recognition",
17
+ model="openai/whisper-base",
18
+ device=self.device)
19
+ self.generator = pipeline("text-generation",
20
+ model="gpt2-large",
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}')
28
+ except LookupError:
29
+ nltk.download(resource)
30
+
31
+ self.stop_words = set(stopwords.words('portuguese'))
32
+
33
+ except Exception as e:
34
+ logging.error(f"Initialization error: {str(e)}")
35
+ raise
36
 
37
+ def processar_audio(self,
38
+ audio_path: Optional[str],
39
  nome_trilha: str,
40
  nivel: str = "intermediário",
41
  area: str = "geral",
42
  duracao: str = "3 meses",
43
+ incluir_recursos: bool = True) -> Tuple[str, str, str, str]:
44
+ if not audio_path:
45
+ return ("", "", self._formatar_historico(), "❌ Nenhum áudio fornecido")
46
+
47
  try:
48
  transcricao = self.transcriber(audio_path)["text"]
49
+ if not transcricao.strip():
50
+ return ("", "", self._formatar_historico(), "❌ Nenhum texto detectado no áudio")
51
+
52
  analise = self._gerar_trilha_personalizada(transcricao, nivel, area, duracao)
53
 
54
  if incluir_recursos:
 
57
 
58
  self.historico.append({
59
  "data": datetime.now().strftime("%d/%m/%Y %H:%M"),
60
+ "nome": nome_trilha.strip(),
61
  "nivel": nivel,
62
  "area": area,
63
  "duracao": duracao,
 
65
  "analise": analise
66
  })
67
 
68
+ return (transcricao, analise, self._formatar_historico(), "✅ Trilha gerada com sucesso!")
69
+
 
 
 
 
70
  except Exception as e:
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())
77
+ palavras = [palavra for palavra in tokens
78
+ if palavra.isalnum() and
79
+ len(palavra) > 2 and
80
+ palavra not in self.stop_words]
81
+ return [palavra[0] for palavra in Counter(palavras).most_common(5)]
82
+ except Exception as e:
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"
89
 
90
+ return "📋 Histórico de Trilhas:\n\n" + "\n".join(
91
+ f"• {h['data']} - {h['nome']} ({h['nivel']}, {h['area']})"
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("""
100
  # 🎓 Gerador de Trilha de Aprendizado
 
112
 
113
  nome_trilha = gr.Textbox(
114
  label="Nome da Trilha",
115
+ placeholder="Dê um nome para sua trilha",
116
+ value=""
117
  )
118
 
119
  nivel = gr.Dropdown(
 
146
  status = gr.Markdown()
147
  transcricao = gr.Textbox(label="Transcrição do Áudio", lines=4)
148
  analise = gr.Textbox(label="Sua Trilha de Aprendizado", lines=10)
149
+ historico = gr.Markdown()
150
 
151
  with gr.Accordion("ℹ️ Como usar"):
152
  gr.Markdown("""
 
156
  4. Revise a transcrição e a trilha gerada
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
  )
 
168
  return app
169
 
170
  if __name__ == "__main__":
171
+ logging.basicConfig(level=logging.INFO)
172
  app = criar_interface()
173
  app.queue()
174
  app.launch()