AulaForge é uma ferramenta de linha de comando, local-first, que transforma aulas gravadas em vídeo em uma base de conhecimento estruturada.
Dada uma pasta de curso com arquivos de vídeo, o AulaForge:
- extrai o áudio e transcreve com Whisper local;
- organiza o conteúdo em notas estruturadas com Ollama + qwen3:30b;
- extrai frames e detecta código/terminal com OCR local (opcional);
- integra transcrição e OCR em uma linha do tempo unificada;
- gera arquivos de contexto prontos para uso no Claude Code e Codex;
- sincroniza as notas com uma página do Notion (opcional);
- gera relatório de batch por curso.
Todo o processamento pesado (transcrição, notas, OCR) é local. Nenhuma API paga é usada.
| Componente | Versão mínima | Obrigatório |
|---|---|---|
| Python | 3.11+ | Sim |
| FFmpeg | qualquer | Sim |
| openai-whisper | qualquer | Sim (transcrição) |
| Ollama | qualquer | Sim (notas) |
| Modelo qwen3:30b | — | Sim (notas) |
| Tesseract OCR | 4+ | Não (OCR opt-in) |
| Token do Notion | — | Não (Notion opt-in) |
.mp4, .mov, .mkv, .avi, .webm
# 1. Clonar o repositório
git clone <url-do-repositório>
cd AulaForge
# 2. Criar ambiente virtual
python -m venv .venv
.venv\Scripts\Activate.ps1
# 3. Instalar dependências básicas + Whisper
pip install -e ".[transcription]"
# 4. (Opcional) Instalar dependências de OCR
pip install -e ".[ocr]"
# 5. (Opcional) Instalar dependências de desenvolvimento
pip install -e ".[dev]"Baixe em ffmpeg.org e adicione ao PATH do sistema.
Verifique com:
ffmpeg -versionInstale o Ollama em ollama.com e baixe o modelo:
ollama pull qwen3:30bVerifique com:
ollama listCopie o arquivo de exemplo e ajuste:
Copy-Item CONFIG_EXAMPLE.yaml aulaforge.yaml
aulaforge.yamlé um arquivo local de teste e está no.gitignore. Não será commitado.
project:
output_dir: "./output" # onde os arquivos gerados ficam
language: "pt-BR" # idioma das aulas para o Whisper
transcription:
model: "base" # modelos: tiny, base, small, medium, large
# "base" = mais rápido; "medium" = melhor qualidade
ocr:
enabled: false # OCR desativado por padrão; ative com true se quiser
notion:
enabled: false # Notion desativado por padrão; configure antes de ativar
database_name: "Aulas Processadas"
token_env_var: "NOTION_TOKEN" # nome da variável de ambiente com o token
processing:
retry_attempts: 3 # tentativas por step antes de marcar como FAILEDPara sincronizar com o Notion, defina o token como variável de ambiente:
$env:NOTION_TOKEN = "secret_xxxx..."E habilite no aulaforge.yaml:
notion:
enabled: true
auto_send: trueaulaforge process-course "C:\Aulas\MeuCurso" --config aulaforge.yamlO AulaForge descobre todos os vídeos dentro da pasta, ordena por número de aula detectado no nome do arquivo, e processa cada aula em sequência.
| Flag | Descrição |
|---|---|
--config <arquivo> |
Caminho para o arquivo YAML de configuração. Se omitido, procura ./aulaforge.yaml; se não existir, usa os defaults internos. |
--force |
Reprocessa todas as etapas mesmo que o vídeo e as entradas não tenham mudado. |
--resume |
Reprocessa apenas aulas cujo último status de algum step seja FAILED. Entradas antigas de falhas seguidas de sucesso não ativam o --resume. |
--force tem precedência sobre --resume.
| Código | Significado |
|---|---|
0 |
Tudo processado com sucesso |
1 |
Pelo menos um step falhou por erro de processamento |
2 |
Nenhuma falha de processamento, mas uma dependência local estava ausente (FFmpeg, Whisper, Ollama) |
# Primeira execução (processa tudo)
aulaforge process-course "C:\Aulas\MeuCurso" --config aulaforge.yaml
# Segunda execução (pula o que não mudou)
aulaforge process-course "C:\Aulas\MeuCurso" --config aulaforge.yaml
# Reprocessar apenas aulas com falhas recentes
aulaforge process-course "C:\Aulas\MeuCurso" --config aulaforge.yaml --resume
# Forçar reprocessamento completo
aulaforge process-course "C:\Aulas\MeuCurso" --config aulaforge.yaml --forceOs arquivos são gerados dentro de output/<NomeDoCurso>/.
| Arquivo | Fase | Descrição |
|---|---|---|
source_info.json |
1 | Fingerprint do vídeo (hash, tamanho, data) |
processing_log.json |
1 | Histórico de steps com status e timestamps |
01_TRANSCRICAO_BRUTA.txt |
2 | Transcrição bruta do Whisper |
02_TRANSCRICAO_COM_TIMESTAMPS.json |
2 | Segmentos com start, end, text |
03_TRANSCRICAO_LIMPA.md |
2 | Blocos de ~15 min sem sobreposição |
04_OCR_TELA.json |
5 | Resultado OCR por frame (somente se ocr.enabled: true) |
05_OCR_TELA.md |
5 | Resumo OCR legível (somente se ocr.enabled: true) |
06_CODIGOS_DETECTADOS.md |
5 | Blocos de código extraídos (somente se ocr.enabled: true) |
07_COMANDOS_TERMINAL.md |
5 | Comandos de terminal extraídos (somente se ocr.enabled: true) |
08_MERGE_AUDIO_VIDEO.md |
6 | Linha do tempo integrada: transcrição + OCR |
09_ANOTACAO_NOTION.md |
3 | Notas estruturadas geradas pelo Ollama |
10_CLAUDE_CODE_CONTEXT.md |
7 | Contexto para uso no Claude Code |
11_CODEX_CONTEXT.md |
7 | Contexto para uso no Codex |
12_PROMPTS_PRONTOS.md |
7 | Prompts gerados automaticamente |
13_AGENTES_SUGERIDOS.md |
7 | Sugestões de agentes derivados da aula |
14_SKILLS_SUGERIDAS.md |
7 | Sugestões de skills derivadas da aula |
15_IDEIAS_DE_PROJETOS.md |
7 | Ideias de projetos baseadas na aula |
16_IMPLEMENTATION_PLAN.md |
7 | Plano de implementação gerado |
| Arquivo | Descrição |
|---|---|
batch_report.md |
Tabela com status e timing de cada aula por step |
batch_log.json |
Log estruturado em JSON do batch |
COURSE_OVERVIEW.md |
Resumo executivo consolidado do curso |
COURSE_PROJECT_IDEAS.md |
Ideias de projetos agregadas de todas as aulas |
COURSE_AGENTS.md |
Agentes sugeridos agregados de todas as aulas |
COURSE_SKILLS.md |
Skills sugeridas agregadas de todas as aulas |
COURSE_PROMPTS.md |
Prompts prontos agregados de todas as aulas |
ocr:
enabled: true
notion:
enabled: true
auto_send: trueRequer: FFmpeg, Whisper, Ollama, Tesseract, token do Notion.
notion:
enabled: falseRequer: FFmpeg, Whisper, Ollama.
ocr:
enabled: falseOCR é opt-in pois pode ser lento em vídeos longos.
Se o Ollama não estiver disponível, o AulaForge processa normalmente até onde consegue. O step de notas é marcado como FAILED por dependência de Ollama. Os steps de merge e outputs continuam normalmente se a transcrição tiver sido concluída. O sistema não aborta — continua processando as demais aulas e retorna exit code 2.
O AulaForge detecta o número da aula pelo nome do arquivo:
| Nome do arquivo | Número detectado | Slug gerado |
|---|---|---|
Aula 01 - Introducao.mp4 |
1 | aula_01_introducao |
01 - Introducao.mp4 |
1 | aula_01_introducao |
Modulo T01 - Aula 6 - Título.mkv |
6 | aula_06_titulo |
introducao.mp4 |
nenhum | aula_introducao |
Arquivos sem número detectado são ordenados alfabeticamente e processados por último. Um aviso é emitido no log.
O AulaForge é idempotente: executar o mesmo comando duas vezes não reprocessa o que não mudou.
Cada aula mantém um source_info.json com o hash SHA-256 do vídeo. Se o vídeo não mudou e os arquivos de saída já existem, o step é marcado como SKIPPED_UNCHANGED.
O batch_report.md exibe o status e o tempo de cada step por aula após cada execução.
Mensagem normal do Whisper quando rodando em CPU (sem GPU). Não afeta o resultado — apenas usa mais memória e é mais lento. Pode ser ignorada.
Erro do FFmpeg ao extrair áudio. Corrigido na versão atual (audio.tmp.mp3 em vez de audio.mp3.tmp). Este bug foi corrigido na Fase 9. Se o erro aparecer, certifique-se de estar na branch master atualizada.
Comportamento corrigido na versão atual. O --resume agora considera apenas o último status de cada step, não falhas antigas no histórico. Se uma aula falhou em uma execução anterior mas foi reprocessada com sucesso depois, o --resume a ignora corretamente.
Use um modelo menor:
transcription:
model: "base" # ou "tiny" para máxima velocidadeVerifique se o Ollama está rodando:
ollama listSe o serviço não estiver iniciado, inicie-o antes de rodar o AulaForge.
O token deve ser definido como variável de ambiente, não no arquivo YAML:
$env:NOTION_TOKEN = "secret_xxxx..."Se o nome do arquivo não contiver um padrão de número reconhecível (Aula N, N - Título, etc.), a aula é ordenada alfabeticamente com um aviso no log. Renomear o arquivo para incluir o número resolve o problema.
.venv\Scripts\python.exe -m pytest -q.venv\Scripts\python.exe -m ruff check ..venv\Scripts\python.exe -m mypy srcsrc/aulaforge/
cli.py — Orquestrador e CLI (Typer)
config.py — Carregamento de configuração (YAML + Pydantic)
discovery.py — Descoberta e ordenação de vídeos
models.py — Modelos de dados (Pydantic)
checkpoints.py — Controle de checkpoints e processing_log.json
reports.py — Geração de batch_report.md e batch_log.json
audio.py — Extração de áudio via FFmpeg
transcription.py — Transcrição via Whisper local
chunking.py — Divisão da transcrição em blocos
notes.py — Geração de notas via Ollama
ollama_client.py — Cliente Ollama
notion.py — Sincronização com Notion
notion_client.py — Cliente REST do Notion
video_frames.py — Extração de frames de vídeo
ocr.py — OCR local via Tesseract
merge.py — Merge de transcrição + OCR por timestamp
outputs.py — Geração de outputs Claude Code / Codex
logging_setup.py — Configuração de logging
- Local-first: nenhuma API paga é usada.
- Processamento sequencial por padrão (estável para runs longas).
- Batch sem confirmações manuais (projetado para rodar à noite).
- Transcrição bruta e screenshots salvos localmente; não enviados ao Notion.
aulaforge.yamlé arquivo local e não deve ser commitado (.gitignorejá configurado).