CoolFace
Datasetpublic

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.

sourceHugging Faceotherupdated 27d agoView on Hugging Face
1likes442downloads
Dataset Card

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 carries arquivo + sha256 + pagina + bbox_figura + dpi_render, so reconstruir_imagens.py can 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

python
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á decodificada

A 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:

bash
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 \
    --baixar

O 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

CampoDescrição
idchave única; sufixo p/t indica origem PDF ou .txt DOSVOX
descricaoaudiodescrição profissional do INEP (o padrão-ouro)
preambuloparte comum às cinco alternativas: deve ser concatenado, ver abaixo
imagea figura, com os bytes embutidos (PIL.Image); null quando o caderno substitui a figura pela descrição
imagemcaminho do mesmo PNG em imgs/, para uso em disco
enunciadotexto da questão; é o contexto que torna a descrição funcional
alternativas, gabaritopermitem avaliação ancorada na resposta correta
rotulorótulo original (Descrição do gráfico:, do heredograma:…): classificação de tipo feita por humano, de graça; 95 rótulos distintos
generoagrupamento dos 95 rótulos em 6 gêneros visuais (genero.py), derivado e opinativo; rotulo é a fonte de verdade
classefigura (845), alternativa (116, uma opção descrita), alternativas (16, o preâmbulo)
letra_alternativaA–E, quando classe = alternativa
ano, dia, aplicacao, caderno, questao, idiomaprocedência (idioma só nas questões de língua estrangeira)
arquivo, sha256, pagina, bbox_figura, dpi_renderreprodução determinística a partir do PDF original
objeto_rasterfalse = figura vetorial (313 das 666)
fontepdf (724), pdf+txt (231), txt (83)
descricao_txt, simil_pdf_txtquando há as duas fontes, o texto do .txt e a concordância entre elas
charscomprimento de descricao

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

  1. 1.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_fundidos guarda 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_*):

campoconteúdo
figura do enunciado (classe: figura)rampa, posições A/B/C, operários, vetores P e N
preâmbulo (classe: alternativas)"Todos os vetores estão na mesma inclinação da rampa, mudando apenas o sentido."
alternativa A (classe: alternativa)"vetor fA rampa abaixo, vetor fB rampa acima, vetor fC rampa abaixo."
… B a Esó a combinação de sentidos que muda

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:

python
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 .txt conter.
  • —Renderização da região da página, não extração de objeto de imagem: ~40% das figuras são vetoriais e pdfimages retorna 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 /ToUnicode incompleto (concentrado em 2021), combinando /Differences + ordem real de glifos da Arial com o /ToUnicode do próprio arquivo. Sem OCR, e por isso o ouro segue humano.
  • —Consolidação PDF + `.txt`: o .txt tem 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.

amostraresultadoIC 95%
Aleatória (n=100), pares incorretos00 % – 3,6 % (Clopper-Pearson)
Aleatória (n=100), corte de margem52,2 % – 11,2 % (Wilson)
Dirigida (n=52), apontada por triagem, não aleatória0 incorretos—
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_render vai gravado por registro, e o reconstrutor o utiliza.
  • —5 registros com caractere de controle residual em descricao (15 em enunciado, 22 em alternativas), 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 rotulo dá 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.

camadao que étermos
Anotações e código deste projetoalinhamento, bbox_figura, classe, simil_pdf_txt, todos os scriptsMIT
Conteúdo do INEPenunciados, alternativas, gabaritos, audiodescriçõesredistribuído com atribuição, conforme a nota da ficha catalográfica das publicações do INEP, "É permitida a reprodução total ou parcial desta publicação, desde que citada a fonte", e a política de dados abertos (LAI 12.527/2011; Decreto 8.777/2016)
Figuras (`imgs/`)recortes das provas; parte contém charges, fotografias e obras de arte de terceirosIncluídas, recortadas de provas públicas do INEP. Cada figura mantém autoria de seu criador original; os créditos constam nas provas de origem. Distribuídas para pesquisa e acessibilidade, sob a política de takedown abaixo

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 origem

Reproduçã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

bibtex
@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.