tardellirs/enem-audiodescricao
Audiodescrição profissional de imagens do ENEM: corpus em português para acessibilidade e avaliação de modelos de visão Professional audio descriptions of ENEM exam figures: a Brazilian Portuguese corpus for accessibility research and vision-language model evaluation. Corpus de audiodescrições escritas por profissionais para as figuras do ENEM, extraídas dos cadernos "ledor" que o INEP publica para participantes com deficiência visual, alinhadas à figura, ao enunciado, às… See the full description on the dataset page: https://huggingface.co/datasets/tardellirs/enem-audiodescricao.
Audiodescrição profissional de imagens do ENEM: corpus em português para acessibilidade e avaliação de modelos de visão
Professional audio descriptions of ENEM exam figures: a Brazilian Portuguese corpus for accessibility research and vision-language model evaluation.
Corpus de audiodescrições escritas por profissionais para as figuras do ENEM, extraídas dos cadernos "ledor" que o INEP publica para participantes com deficiência visual, alinhadas à figura, ao enunciado, às alternativas e ao gabarito.
English summary. 977 professional audio descriptions (human-written, no OCR, no model output) of figures from the Brazilian national exam ENEM, 2019–2025, regular and PPL re-application, aligned with question stem, options and answer key. 666 records carry a deterministic reference to a figure. The 794 figure PNGs are included (imgs/), and every record also carriesarquivo+sha256+pagina+bbox_figura+dpi_render, soreconstruir_imagens.pycan regenerate them from the public INEP PDFs, verified, 665 of 666 byte-for-byte identical. Some questions embed third-party cartoons, photographs and artworks; see the takedown notice in the licence section. The card below is in Portuguese.
- Idioma: português do Brasil
- Cobertura: ENEM 2019–2025, aplicação regular, reaplicação PPL e reaplicação 2025 (P2)
- Registros: 977 descrições · 794 com figura pareada · 762 questões distintas
- Distribuição por ano: 2019 114 · 2020 96 · 2021 139 · 2022 150 · 2023 141 · 2024 162 · 2025 175
- Figuras por ano: 2019 72 · 2020 46 · 2021 111 · 2022 145 · 2023 129 · 2024 136 · 2025 155
- O texto das descrições é 100% humano. Nenhum OCR, nenhuma transcrição por modelo.
Por que existe
Audiodescrição profissional de imagem didática em português praticamente só existe em prova de larga escala. O material didático do dia a dia (apostila, slide, livro, lista de exercício) não tem nenhuma. Este corpus reúne o que existe, para servir de referência ao avaliar se modelos conseguem produzir audiodescrição em escala.
Trabalho relacionado, não fonte. Este corpus foi extraído de forma independente dos PDFs públicos do INEP; não deriva de nenhum dataset anterior. O maritaca-ai/enem (145 pares, 2022–2024, apenas aplicação regular) foi usado somente como referência de validação: a extração aqui reproduz as descrições que ele contém, o que serviu de teste de regressão. Este corpus cobre 2019–2025 mais os cadernos PPL, com figuras extraídas por renderização de região, que captura também as figuras vetoriais, invisíveis a pdfimages e responsáveis por cerca de 40% do total (313 das 666).
Como carregar
from datasets import load_dataset
ds = load_dataset("tardellirs/enem-audiodescricao", split="train") # 977 registros
print(ds[0]["descricao"])
# só os registros com figura pareada
com_figura = ds.filter(lambda r: r["image"] is not None) # 666
com_figura[0]["image"] # PIL.Image, já decodificadaA figura vem em duas formas, para dois usos diferentes: `image` carrega os bytes do PNG e é o que load_dataset decodifica e o que o visualizador do Hugging Face renderiza; `imagem` é o caminho relativo (imgs/…png) para quem trabalha com os arquivos em disco. São a mesma figura: os bytes de image são os do arquivo, sem recodificação.
Os 666 registros com figura vêm primeiro, e os 372 sem figura depois; dentro de cada bloco o ano é crescente. A ordem existe porque nos cadernos de 2019 a descrição substitui a figura na página, e a ordem cronológica pura abriria o visualizador em 131 células de imagem vazias. corpus/registros.jsonl mantém a ordem do pipeline, que é a que reproduzir.sh regenera.
Como reconstruir as figuras a partir das provas
Os PNGs já vêm no pacote, em imgs/. Este script serve para auditar essa proveniência: ele regenera cada figura a partir dos PDFs públicos do INEP, baixando o que faltar, conferindo o SHA-256 de cada PDF e recortando a região de bbox_figura no dpi_render gravado no registro:
pip install pymupdf
hf download tardellirs/enem-audiodescricao --repo-type dataset --local-dir enem-audiodescricao
cd enem-audiodescricao
python reconstruir_imagens.py \
--registros corpus/registros.jsonl \
--pdfs fontes/pv \
--out corpus/imgs \
--baixarO caminho de saída de cada PNG é exatamente o valor do campo imagem, de modo que o resultado pode ser comparado diretamente com os arquivos distribuídos. A nomenclatura dos arquivos no servidor do INEP muda de ano para ano; se --baixar falhar para algum caderno, baixe-o manualmente e coloque em fontes/pv/ com o nome que consta no campo arquivo.
Verificação de fidelidade (medida, não prometida): rodando o script sobre os 22 cadernos, 665 das 666 figuras saem byte a byte idênticas às originais. A única exceção (2023_regular_d2_q97_p3_002) sai com a mesma dimensão (1053×609) e difere apenas no conteúdo de pixel, que é não-determinismo de renderização daquela página, não erro de geometria.
Campos
Registros gêmeos
Quando a mesma prova existe como PDF ledor e como transcrição DOSVOX, as duas extrações precisam virar um registro só. Fundir pela chave derivada do nome de arquivo falha quando os dois nomes codificam a mesma prova de formas diferentes, que é o caso da segunda aplicação de
- Por isso a fusão final é por conteúdo: mesmo ano e questão, arquivos distintos, descrição com similaridade acima de 0,90. Foram 61 pares; a figura sobrevive do lado do PDF e a atestação do lado do texto, e o campo
ids_fundidosguarda o id do registro absorvido.
O invariante duplicatas_entre_arquivos mantém isso em zero. Ele existe porque contagem nenhuma revela esse defeito: 977 descrições distintas e 1.038 registros com 61 repetições dão os mesmos totais por ano, por classe e por fonte. Só a comparação de descrição com descrição revela.
Campos ausentes num registro vêm como null: o Parquet tem esquema fixo, o JSONL de origem omitia a chave.
Descrições de alternativa: concatene `preambulo` + `descricao`
Em questões cujas cinco alternativas são figuras, o audiodescritor do INEP fatora o que é comum: escreve uma vez o que vale para todas e, em cada letra, apenas o que muda.
Exemplo real, ENEM 2023 PPL, dia 2, questão 122 (2023_PPL_d2_c11_q122_*):
Usar `descricao` sozinha nas classes `alternativa` produz texto incompleto: a alternativa A, isolada, não diz que os vetores acompanham a inclinação da rampa. O campo preambulo carrega essa informação e deve ser concatenado:
def texto_completo(r):
if r["classe"] == "alternativa" and r["preambulo"]:
return r["preambulo"] + " " + r["descricao"]
return r["descricao"]Escala: 116 registros de classe alternativa, dos quais 50 têm preâmbulo; 17 registros de classe alternativas são os preâmbulos em si. Nos registros de classe alternativa, concatenar leva a média de 135 para 219 caracteres; entre os 50 que realmente têm preâmbulo o texto disponível mais que dobra.
Essa fatoração é, ela própria, um dado sobre a prática profissional: o audiodescritor economiza repetição do mesmo modo que subespecifica; ver a seção de viés do padrão-ouro.
Como foi construído
extrair.py → enriquecer.py → verificar_pares.py, orquestrados por reproduzir.sh (todos incluídos no pacote).
Decisões que se provaram necessárias na prática, cada uma corrigindo um defeito medido:
- Fronteira por bloco de texto, não por delimitador: o PDF não contém
(Fim da descrição), apesar de o.txtconter. - Renderização da região da página, não extração de objeto de imagem: ~40% das figuras são vetoriais e
pdfimagesretorna zero para elas. - Limites de coluna clampados na divisa: a marca d'água atravessa a página e fazia o recorte invadir a coluna vizinha, capturando a questão seguinte.
- Reparo de fonte determinístico para cadernos com
/ToUnicodeincompleto (concentrado em 2021), combinando/Differences+ ordem real de glifos da Arial com o/ToUnicodedo próprio arquivo. Sem OCR, e por isso o ouro segue humano. - Consolidação PDF + `.txt`: o
.txttem delimitador explícito (texto mais confiável), o PDF tem a figura. A concordância entre as duas fontes é registrada como sinal de qualidade (simil_pdf_txt). - 57 invariantes de saída (
invariantes.py+invariantes.json) conferidas a cada reprocessamento. Existem porque uma correção já derrubou 210 registros, todo o ano de 2019 e três quartos de 2020, sem que o total parecesse errado, porque duas perdas independentes se compensavam.
Qualidade medida
Verificação de pareamento em 152 das 666 figuras, das quais 100 por amostragem aleatória com semente fixa (20260816) entre as figuras que nenhum revisor havia visto. É a aleatoriedade que permite extrapolar para o corpus.
Os dois estratos são reportados separados de propósito. Agrupar a amostra aleatória com a dirigida, que é enriquecida em casos suspeitos, inflaria artificialmente a precisão. O número que se pode extrapolar para o corpus é o da amostra aleatória: 0/100, limite superior de 3,6 %.
Os cortes de margem são marginais: perda de 1 a 3 pontos tipográficos na borda: uma letra final, o contorno de um botão, meia linha de legenda. Nunca perda estrutural.
Onde o recorte já encosta no bloco de texto vizinho, seja a primeira linha do enunciado ou a descrição da alternativa anterior, não há margem a recuperar: crescer inclui texto alheio, encolher corta o desenho. Esses casos permanecem.
O critério da auditoria é "correta E completa?". Perguntar apenas se a figura é a certa não detecta perda parcial: uma equação química pela metade continua sendo a figura certa.
Como ler estes números. Um juiz visual (VLM) foi usado apenas como peneira, para ordenar a fila de revisão. Das 20 acusações de par incorreto que ele produziu, 1 se confirmou. A precisão pontual é de 5 %, mas com apenas 1 positivo o IC 95% vai de 0,9 % a 23,6 %, então o valor pontual não deve ser citado isoladamente.
Não há concordância entre juízes neste corpus. O segundo modelo (Qwen) rodou exatamente nos 41 itens em que o primeiro (Kimi) falhou por timeout, e a sobreposição é zero. Ele foi fallback de cobertura, não segunda opinião independente.
Nenhum rótulo de modelo entrou nos dados publicados. Os vereditos que constam do corpus vieram de revisão humana; o juiz apenas definiu a ordem da fila.
Limitações, leia antes de usar
- 514 das 666 figuras não foram inspecionadas individualmente. O limite de 3,6 % acima é estatístico, não uma garantia caso a caso.
- Corte de margem em ~5 % das figuras (ver acima), sem solução geométrica em parte delas.
- 3 figuras compostas só de texto não são emitidas (semiequações, matriz, fórmulas em alternativas). Não há tinta vetorial nem raster, logo não há evidência geométrica de que existe figura ali. Optou-se por par ausente em vez de par errado.
- Contaminação menor do recorte: quando a descrição continua numa segunda caixa cinza, ou há legenda curta encostada, esse texto entra no recorte. A figura está inteira e correta, só com texto por cima.
- Cobertura de figura muito desigual por ano. Em *2019 e 2020 o caderno ledor substitui a figura pela descrição, então quase não há imagem pareada nesses anos: 2019 0 figuras, 2020 9*, contra 108–150 de 2021 em diante. É característica da fonte, não falha de extração, e significa que qualquer avaliação com imagem é, na prática, de 2021 para frente.
- Resolução mínima garantida: o DPI é adaptativo por figura (300 a 1200 dpi, alvo de 600 px no lado menor), porque parte das figuras ocupa poucos centímetros na página: a 300 dpi fixos, um rótulo de eixo sairia ilegível e o erro de leitura seria do recorte, não do modelo. A menor figura do corpus tem 567×492. Para as vetoriais, que são cerca de 40 % do total, o detalhe é real e não interpolado. O
dpi_rendervai gravado por registro, e o reconstrutor o utiliza. - 5 registros com caractere de controle residual em
descricao(15 emenunciado, 22 emalternativas), de fontes que não expõem informação suficiente no PDF. Recuperá-los exigiria OCR e quebraria a garantia de ouro humano. - Viés de subespecificação do padrão-ouro. A audiodescrição do INEP é escrita para leitura oral sob cronômetro e é deliberadamente subespecificada: o órgão precisa dar acesso equitativo sem facilitar a resposta. Se a descrição entrega o gabarito, aquele participante fez uma prova mais fácil que os demais. Isso define um alvo com teto e piso, não um máximo. Não trate estas descrições como teto de qualidade: um modelo verboso pode superá-las em métrica funcional sem ser melhor, e um modelo avaliado só por informatividade será premiado justamente por violar a restrição que o profissional respeita. Mediana de 298 caracteres no corpus todo, 334 na classe
figura. - Nenhuma pessoa cega avaliou estas descrições, nem sistematicamente, nem informalmente. O corpus é um recurso de pesquisa, não uma validação de adequação para leitores reais. Nenhuma afirmação sobre qualidade percebida por usuários finais pode se apoiar nele.
- Contaminação de treino. As provas do ENEM e seus gabaritos circulam abertamente na web e estão em datasets públicos desde 2023 (entre eles
maritaca-ai/enem). Modelos treinados depois disso provavelmente já viram os itens. Ao usar em avaliação, adote controles: condição só-alternativas (piso), permutação cíclica das alternativas, descrição descasada e recorte por ano. 2025 é a única fatia razoavelmente limpa (232 registros). - Composição. Domina gráfico, figura geométrica, esquema, quadro e estrutura química; charge, mapa e obra de arte são minoria. O campo
rotulodá a distribuição exata.
Usos previstos
- Referência (gold standard) para avaliar audiodescrição/alt text gerada por modelo em português.
- Estudo da audiodescrição sob restrição de não-divulgação: descrever o suficiente para dar acesso, sem entregar a resposta. É uma formulação de tarefa que quase não tem dado.
- Avaliação funcional ancorada: a descrição permite responder ao item? (usar
enunciado+alternativas+gabarito). - Taxonomia de tipo de figura didática, via
rotulo.
Usos desaconselhados
- Treinar um modelo para "descrever imagens em geral": o registro é específico de prova e deliberadamente subespecificado.
- Afirmar adequação para pessoas cegas: nenhuma avaliou (ver Limitações).
- Benchmark de raciocínio multimodal sem controle de contaminação: os itens estão na web desde antes do corte de treino da maioria dos modelos atuais.
- Redistribuir as figuras reconstruídas: elas contêm obra de terceiro (ver Licença).
Licença e proveniência
Licença em camadas; ver o arquivo `LICENSE` para o texto completo.
Por que as figuras estão incluídas. Um recurso de acessibilidade que exige baixar 107 MB de PDFs e executar um script é usado muito menos, e essa fricção recai justamente sobre quem tem menos recurso técnico, que é quem atende esses estudantes. As provas são documento público, o INEP autoriza reprodução com citação da fonte, e há precedente de que questão de prova não constitui, por si só, obra protegida (TJSP, Ap. 1112376-68.2021.8.26.0100). A reprodutibilidade continua garantida: o bbox_figura + sha256 + dpi_render permitem regenerar tudo do PDF original.
### Política de takedown Qualquer detentor de direito sobre uma figura pode solicitar a remoção, e o pedido é atendido sem contestação. Abra uma discussion neste repositório ou escreva ao mantenedor. A remoção não quebra o dataset: o registro permanece com a referência determinística, e quem precisar da figura pode regenerá-la do PDF público do INEP.
O reconstrutor verifica o SHA-256 de cada PDF, porque o INEP reedita os arquivos em silêncio (medido: o ModDate de um caderno de 2024 aponta para 2026). Hash divergente vira aviso explícito: os recortes podem não corresponder mais.
*Contato para takedown: abra uma discussion* neste repositório. Qualquer detentor de direito que identifique conteúdo indevido tem o pedido atendido.
Ver também o `Datasheet.md` (Gebru et al., Datasheets for Datasets), com motivação, composição, coleta, pré-processamento, distribuição e manutenção.
Conteúdo do pacote
README.md este card
Datasheet.md datasheet completo (Gebru et al.)
LICENSE licença em camadas
data/train-*.parquet os 977 registros (o que `load_dataset` carrega)
corpus/registros.jsonl os mesmos registros, JSONL canônico (entrada da reprodução)
corpus/manifest.jsonl manifesto de avaliação (666 itens com figura)
corpus/anomalias.jsonl anomalias registradas na extração
construir_parquet.py JSONL -> Parquet (ida e volta idêntica, verificada)
reconstruir_imagens.py regenera as figuras a partir dos PDFs do INEP
extrair.py, enriquecer.py o pipeline de extração
verificar_pares.py auditoria de pareamento
invariantes.py/.json 57 invariantes de saída
reproduzir.sh reprodução ponta a ponta
fontes/SHA256.json nome e hash dos 67 PDFs/txts de origemReprodução completa do corpus a partir do zero: baixe os cadernos listados em fontes/SHA256.json para fontes/pv, fontes/gb e fontes/txt, e rode ./reproduzir.sh. Rodar python3 invariantes.py --conferir --corpus corpus no pacote recém-baixado acusa uma divergência, imagens_em_disco: esperado 666, obtido 0, e as outras 56 invariantes conferem quando as figuras estão presentes. Se você baixar só os metadados, rode reconstruir_imagens.py com --out corpus/imgs, as 57 conferem.
Citação
@misc{enem_ad_2026,
title = {Audiodescri\c{c}\~ao profissional de imagens do ENEM: corpus em portugu\^es para acessibilidade e avalia\c{c}\~ao de modelos de vis\~ao},
author = {Stekel, Tardelli R. C.},
year = {2026},
note = {Corpus derivado dos cadernos ledor do ENEM 2019--2025 (INEP)},
url = {https://huggingface.co/datasets/tardellirs/enem-audiodescricao}
}Cite também a fonte primária: INEP/MEC, cadernos de prova do ENEM em versão ledor, 2019–2025, exigido pela nota de atribuição da ficha catalográfica do INEP.
