Sistema de análise multimodal para verificação de autenticidade em vídeos, combinando detecção de manipulação visual (deepfake), transcrição de áudio e verificação de fatos com busca em tempo real.
Identificar vídeos manipulados digitalmente (deepfakes) e verificar a veracidade do conteúdo falado, gerando um relatório estruturado com classificação de risco.
O sistema processa vídeos em três etapas sequenciais:
Detecta manipulações digitais em rostos:
- Extração de frames: Coleta 20 frames uniformemente distribuídos (pool de densidade)
- Detecção facial: Localiza rostos usando YuNet (OpenCV DNN)
- Agrupamento por identidade: Agrupa rostos similares usando embeddings FaceNet com clustering hierárquico (threshold ~0.6)
- Seleção inteligente: Escolhe os 5 melhores frames da pessoa principal por qualidade (área × confiança)
- Classificação: Analisa cada rosto com Vision Transformer (ViT) para detectar artefatos de manipulação
- Agregação: Se score máximo > 90%, usa o máximo; senão, média dos 3 maiores scores
Saída: fake_score (0-1), visual_status (REAL/AUTÊNTICO, SUSPEITO ou DEEPFAKE)
Extrai e transcreve o conteúdo falado:
- Extração: Separa áudio do vídeo usando FFmpeg (WAV 16kHz, mono)
- Transcrição: Usa Whisper (modelo small) para converter fala em texto português
Saída: Texto completo do áudio
Analisa o conteúdo textual e visual com busca em tempo real:
- Identificação: Identifica a pessoa no vídeo usando análise de imagem
- Busca na web: Consulta a internet em tempo real via Google Search Grounding
- Análise de interseção: Verifica se a pessoa tem histórico de falar sobre o assunto
- Verificação de afirmações: Classifica cada claim como VERDADEIRO, FALSO ou NAO_VERIFICAVEL
- Classificação de risco: Avalia perigo para saúde pública ou democracia (ALTO, MEDIO, BAIXO)
Saída: Veredito, confiança, afirmações verificadas, fontes citáveis
Combina análises visual e semântica:
- Score ponderado:
Score Final = (Visual × 0.6) + (Semântico × 0.4) - Lógica de segurança: Se conteúdo é FALSO e ALTO RISCO, o veredito prioriza o perigo (desinformação perigosa não é escudada por sátira)
Saída: Classificação final, score multimodal, análise completa
| Componente | Tecnologia | Função |
|---|---|---|
| Detecção de Deepfake | ViT (prithivMLmods/Deep-Fake-Detector-v2-Model) | Classificação de rostos como real ou manipulado |
| Detecção Facial | YuNet (OpenCV DNN) | Localização de rostos em frames |
| Agrupamento de Rostos | FaceNet (facenet-pytorch) | Extração de embeddings para clustering |
| Clustering | SciPy (linkage, fcluster) | Clustering hierárquico de embeddings |
| Transcrição de Áudio | Whisper (OpenAI) | Conversão de fala para texto |
| Verificação de Fatos | Gemini 2.0 Flash | Análise semântica com busca na web |
| Orquestração | Python | Coordenação do pipeline |
- Python 3.10+
- FFmpeg instalado no sistema
- Chave de API do Gemini (GEMINI_API_KEY)
# Clone o repositório
git clone <url-do-repositorio>
cd <nome-do-diretorio>
# Crie o ambiente virtual
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# ou .\venv\Scripts\Activate.ps1 no Windows
# Instale as dependências
pip install -r requirements.txtCrie um arquivo .env na raiz do projeto:
GEMINI_API_KEY=sua_chave_aqui
# Opcionais (valores padrão)
WHISPER_MODEL=small
DEEPFAKE_FRAMES=5
SAVE_FACES=true
DEEPFAKE_THRESHOLD=0.5
SKIP_TRANSCRIPTION=false
SKIP_FACTCHECK=false
SKIP_DEEPFAKE=falsepython main.py caminho/para/video.mp4🚀 Iniciando análise do vídeo: video.mp4
👁️ PASSO 1: Análise Visual (YuNet + Deepfake)...
📥 Extraindo pool de frames: 20 frames...
🔍 Escaneando pool para detecção facial... 20 rostos encontrados.
🧠 Extraindo embeddings de rosto para clustering... 2 identidade(s) detectada(s)
👤 Pessoa principal: 15 frames detectados
⚠️ Outras pessoas detectadas: 5 frames (ignorados)
✅ Selecionados 5 melhores frames da pessoa principal.
Frame 1 (1500ms): Fake 6.5%
Frame 2 (3000ms): Fake 6.7%
...
🎙️ PASSO 2: Transcrição (Whisper)...
✅ Texto extraído: 392 caracteres
🧠 PASSO 3: Checagem de Fatos (Gemini)...
✅ Veredito: VERDADEIRO
👤 Pessoa: Nome da Pessoa
📊 Confiança: 95.0%
============================================================
⚖️ RELATÓRIO DE ANÁLISE MULTIMODAL
============================================================
👁️ [VISUAL] Score: 7.1% (Peso 60%) -> Status: REAL/AUTÊNTICO
🧠 [SEMÂNT] Score: 0.0% (Peso 40%) -> Impersonation: 0/100
☢️ [RISCO ] Nível: BAIXO
------------------------------------------------------------
📊 SCORE FINAL: 4.3%
📢 VEREDITO: VERDADEIRO
💾 Resultado salvo em: results/analise_YYYYMMDD_HHMMSS.json
identities_detected: Número de identidades diferentes detectadasmain_identity_frames: Quantidade de frames da pessoa principalafirmacoes: Array com cada afirmação verificada (status + evidência)analise_intersecao: Análise de consistência entre pessoa, assunto e históricoimpersonation_score: 0-100 (0=pessoa real, 100=sósia/imitação)risk_level: ALTO/MEDIO/BAIXOfinal_classification: Veredito final unificadofontes_web: Fontes citáveis usadas na verificação
O sistema usa FaceNet (InceptionResnetV1 pré-treinado em VGGFace2) para extrair embeddings de 512 dimensões de cada rosto detectado. O clustering hierárquico com threshold de distância euclidiana ~0.6 agrupa rostos da mesma pessoa, permitindo focar a análise na pessoa principal do vídeo.
- Se o score máximo de deepfake > 90%, usa o valor máximo (alta confiança de manipulação)
- Caso contrário, usa a média dos 3 maiores scores (reduz falsos positivos)
Peso 60% para análise visual (ground truth técnico) e 40% para análise semântica (contexto). A lógica de segurança prioriza conteúdo perigoso sobre classificação de sátira.
O módulo de fact-checking usa maxOutputTokens de 4096 e implementa fallback via regex para extrair campos essenciais de respostas JSON truncadas ou malformadas.
.
├── main.py # Orquestrador principal
├── deepfake_detector_hf.py # Detecção de deepfake (ViT + YuNet + FaceNet)
├── gemini_checker.py # Verificação de fatos (Gemini + Google Search)
├── transcriber.py # Transcrição de áudio (Whisper)
├── face_detection_yunet_2023mar.onnx # Modelo YuNet (baixado automaticamente)
├── requirements.txt # Dependências
├── .env.example # Exemplo de configuração
└── results/ # Resultados das análises (JSON + imagens)
MIT