mTEDx PTBR: do alinhamento de palestras ao treinamento de ASR em português
O acesso à parcela portuguesa do mTEDx exigia trabalhar com a distribuição original e sua estrutura multilíngue. Para simplificar tarefas de ASR, publiquei em 2023 um empacotamento no Hugging Face com as colunas audio e transcription. Minha contribuição é essa camada de acesso; Salesky et al. criaram o corpus científico, publicado no Interspeech 2021 e distribuído como SLR100 pelo OpenSLR [1][2][3].
No meu pacote, preservei áudio e transcrição para facilitar download, decodificação e treinamento, mas não incluí identificador da palestra, locutor, tempos, idioma-alvo ou tradução. Por isso, ele serve diretamente para reconhecimento automático de fala (ASR); para tradução de fala (SLT/ST), fornece apenas o lado de fala e, no máximo, a transcrição intermediária de uma cascata. O corpus original continua sendo a referência para a coleta, a segmentação, os alinhamentos e as divisões por palestra.
Duas camadas de proveniência
Renderizando diagrama...
No trabalho original, as fontes eram palestras TEDx, eventos independentes que seguem o formato TED. Os autores descrevem falas preparadas de aproximadamente dez minutos, com transcrições e traduções voluntárias. O áudio bruto era armazenado em WAV, a 44,1 ou 48 kHz, e as legendas em WebVTT. Havia metadados de idioma, título, palestrante, duração, palavras-chave e descrição, embora nem toda palestra tivesse todos os campos [2]. O mTEDx inicial reuniu oito idiomas de origem: espanhol, francês, português, italiano, russo, grego, árabe e alemão. A tabela do artigo atribui ao português aproximadamente 164 horas e 93 mil enunciados para ASR; subconjuntos traduzidos somavam cerca de 59 horas/34 mil sentenças para inglês e 26 horas/15 mil para espanhol [2]. Esses números arredondados descrevem a versão científica, não devem substituir as contagens exatas da ficha HF.
O OpenSLR publicou arquivos separados por idioma e par. mtedx_pt.tgz, anunciado com 29 GB, contém fala e transcrições em português; mtedx_pt-en.tgz e mtedx_pt-es.tgz acrescentam traduções alinhadas; mtedx_iwslt2021.tgz contém os testes da tarefa multilíngue do IWSLT 2021 [3]. No meu empacotamento, incluí fala e transcrição em português, mas não incorporei as traduções nem preservei uma chave para juntá-las posteriormente.
Como legendas viraram segmentos alinhados
Uma linha de legenda não é uma sentença. As legendas TEDx eram formatadas para a tela, com linhas de até 42 caracteres; uma sentença podia atravessar várias linhas e idiomas diferentes podiam escolher fronteiras diferentes. Tratar cada cue WebVTT como exemplo produziria textos truncados, cortes no meio de palavras e pares de tradução inconsistentes.
O pipeline original resolveu primeiro o alinhamento textual. O detector não supervisionado Punkt segmentou a transcrição do idioma de origem em sentenças. Essa segmentação ficou fixa. Para cada idioma-alvo, o Vecalign comparou embeddings LASER em uma programação dinâmica. No lado traduzido, ele avaliou janelas sobrepostas formadas pela concatenação de 1 a 20 trechos de legenda; no lado de origem, não permitiu as mesmas fusões, preservando uma segmentação comum entre ASR e os diferentes pares de tradução. A penalidade de deleção foi ajustada para que nenhuma sentença de origem terminasse sem alinhamento. Treze palestras sem pontuação forte, identificadas manualmente como canto, foram filtradas [2].
Isso contrasta com pipelines que permitem fusões independentes em cada par linguístico. No mTEDx, manter a sentença de origem fixa criou avaliações paralelas em múltiplas direções. Como não havia gabarito humano de fronteiras para medir precisão intrínseca, os autores avaliaram indiretamente o método: realinharam saídas de Vecalign e Gargantua às referências e compararam BLEU de tradução. Vecalign melhorou todos os pares da comparação, de ganhos inferiores a 1 BLEU a ganhos superiores a 5, e gerou em média cinco mil segmentos a mais, normalmente mais curtos [2]. BLEU, nesse caso, valida utilidade downstream; não me permite concluir que cada fronteira temporal esteja correta.
Depois veio o alinhamento fala-texto. Para cada idioma, os autores treinaram no Kaldi um ASR HMM-GMM adaptado a locutor, com MFCC. Os léxicos fonêmicos vieram do WikiPron; pronúncias ausentes foram previstas com Phonetisaurus e fonemas IPA foram convertidos para X-SAMPA. O modelo forçou o alinhamento das transcrições ao áudio e gerou CTM: uma linha por palavra, com gravação, início e duração [2][4].
As palavras do CTM foram então alinhadas às sentenças. Em termos simples, o tempo da primeira e da última palavra alinhadas definiu o corte. Uma variante de Viterbi, com símbolos especiais de fronteira, tolerou “buracos”: fala sem texto, texto sem fala, ruído não verbal, rótulos de locutor, texto exibido na tela e trechos em outro idioma. Cerca de 0,1% dos segmentos falhou no alinhamento; essas ocorrências foram reportadas para exclusão opcional. Duas palestras em que a maioria falhou foram removidas porque as supostas transcrições eram traduções dialetais [2]. Assim, “alinhado automaticamente” não significa “revisado manualmente” nem “sem ruído”.
Splits e relação com o IWSLT 2021
Os criadores selecionaram palestras com alta sobreposição entre idiomas-alvo e reservaram palestras inteiras para validação e avaliação até atingir aproximadamente mil enunciados, ou duas horas, em cada split. As mesmas palestras foram usadas nas avaliações de ASR e tradução, evitando que áudio de treino reaparecesse na avaliação de ST [2]. Essa decisão é mais importante que uma divisão aleatória por segmento: dezenas de trechos da mesma voz, microfone, palco e assunto são fortemente correlacionados.
No IWSLT 2021, a tarefa Multilingual Speech Translation usou fala e transcrições em espanhol, francês, português e italiano, com traduções em um subconjunto de inglês, espanhol, francês, português e italiano. Havia condições supervisionadas e zero-shot, além de trilhas constrained e unconstrained. A avaliação usava SacreBLEU para tradução e WER para ASR; o WER oficial era calculado após converter para minúsculas e remover pontuação [5]. O arquivo de teste do OpenSLR é a referência para essa campanha. Os splits validation e test do pacote HF têm contagens parecidas com o objetivo de aproximadamente mil segmentos, mas sua ficha não documenta nominalmente que test seja o blind test do IWSLT. Não se deve assumir equivalência sem conferir os IDs originais, que o pacote não expõe.
O que existe no Hugging Face
Publiquei o seguinte esquema e as seguintes contagens [1]:
| Split | Segmentos | Fração do total |
|---|---|---|
train | 90.244 | 97,797% |
validation | 1.013 | 1,098% |
test | 1.020 | 1,105% |
| Total | 92.277 | 100% |
O cálculo exato é
segmentos; validação e teste juntos têm
Cada segmento é uma linha independente. O esquema lógico é:
audio: Audio
transcription: stringDistribuí os dados em 225 shards Parquet: 219 de treino, 3 de validação e 3 de teste, além de README.md e .gitattributes. O download soma 93.176.985.982 bytes e o tamanho decodificado/Arrow é de aproximadamente 111,58 GB [1]. A categoria automática 1K<n<10K e o contador parcial do visualizador entram em conflito com os 92.277 exemplos; use as contagens de dataset_info, não a paginação do preview. A API de linhas pode carregar só uma fração dos shards e marcar a resposta como partial.
A coluna Audio encapsula bytes ou caminho e decodifica sob demanda. Ela não garante por si só 16 kHz nem mono. O material original tinha 44,1/48 kHz e múltiplos canais; uma amostra inspecionada no Hub permanece WAV estéreo a 48 kHz. Para os baselines do artigo, os autores converteram para mono e 16 kHz [2]. Faça a conversão explicitamente para que modelo, duração e batching tenham semântica estável.
Carregamento, streaming e reamostragem
Com datasets recente, as dependências de áudio usam TorchCodec/FFmpeg e retornam um AudioDecoder. Streaming evita baixar dezenas de gigabytes antes do primeiro exemplo [6]:
from datasets import Audio, load_dataset
corpus = load_dataset(
"dominguesm/mTEDx-ptbr",
streaming=True,
)
# Decodificação sob demanda, reamostrada a 16 kHz e convertida para mono.
corpus = corpus.cast_column(
"audio",
Audio(sampling_rate=16_000, num_channels=1),
)
example = next(iter(corpus["train"]))
decoded = example["audio"].get_all_samples()
waveform = decoded.data.squeeze(0) # tensor [num_samples]
print(decoded.sample_rate) # 16000
print(waveform.shape)
print(example["transcription"])Em versões antigas de datasets, example["audio"] pode ser um dicionário com array e sampling_rate; registre as versões do ambiente e teste a interface. Reamostragem não deve sobrescrever o original. Registre a distribuição dominguesm/mTEDx-ptbr, a data de acesso, a edição SLR100, a taxa, o número de canais e a normalização textual. Para um treino distribuído, embaralhe o IterableDataset com buffer conhecido e controle a semente; streaming não produz a mesma ordem que materializar e indexar todos os exemplos.
ASR, SLT e o que cada alvo permite
Para ASR, audio -> transcription é um par supervisionado completo. O corpus pode ajustar CTC, RNN-T, Whisper ou encoder-decoder, avaliar robustez a fala de palco e pré-treinar um encoder acústico. A referência contém pontuação e caixa; decida se o modelo deve produzi-las ou se serão removidas no scoring. Eventos como aplausos, música, alternância de idioma e hesitações podem estar no áudio sem representação literal no texto.
Para SLT direta, seria necessário audio em português -> tradução no idioma-alvo. Essa coluna não existe no pacote. Três usos ainda são válidos: treinar o ASR de uma cascata ASR+MT; pré-treinar o encoder acústico antes do fine-tuning com pares traduzidos; ou recuperar no OpenSLR mtedx_pt-en.tgz/mtedx_pt-es.tgz e reconstruir junções por IDs originais. Não tente juntar pela posição das linhas: filtragem e empacotamento podem alterar ordem e cardinalidade. Também não chame transcription de tradução; ela é texto no idioma da fala.
O baseline original ajuda a calibrar dificuldade, não a certificar um modelo atual. No teste português, o sistema híbrido Kaldi LF-MMI obteve 20,2% WER; o arquivo de resultados da receita registra 20,19% no conjunto de sentença. O Transformer sem pré-treinamento obteve 54,8% [2][4]. Configuração, normalização e split precisam coincidir antes de comparar números.
Validação da separação de locutores
Renderizando diagrama...
O artigo informa separação por palestra, mas não incluí talk_id nem speaker_id na tabela do Hugging Face; por isso, com apenas esse pacote, ainda não consigo confirmar a ausência de vazamento. Para uma validação mais forte, recomendo recuperar os metadados do SLR100 e associar cada clip ao segmento original por nome, tempos ou fingerprint acústico. Em seguida, verifique se a interseção de IDs de palestra entre splits é vazia. Comparação de PCM normalizado ou fingerprint ajuda a detectar duplicatas exatas e quase duplicatas.
Separar palestras ainda não garante separar pessoas: um palestrante pode participar de eventos diferentes. Extraia embeddings de locutor, agregue-os por palestra e compare cosseno entre treino e avaliação. Um limiar automático gera candidatos, não identidades verdadeiras; ruído, música e domínio podem aproximar ou afastar vetores. Revise manualmente colisões de alta similaridade e reporte quantidade de palestras recuperadas, duplicatas, candidatos de mesma voz e casos sem metadados. Se a recuperação for inviável, descreva o risco como não auditado e não crie novos splits aleatórios por linha.
WER e qualidade do alinhamento
WER é (substituições + deleções + inserções) / palavras da referência. Calcule-o no corpus concatenado, não como média simples dos WERs por segmento, e publique a transformação de texto. Um exemplo próximo ao protocolo IWSLT, preservando diacríticos portugueses, é:
import re
import unicodedata
from jiwer import process_words
def normalize(text: str) -> str:
text = unicodedata.normalize("NFKC", text).casefold()
text = re.sub(r"[^\w\s]", " ", text, flags=re.UNICODE)
text = text.replace("_", " ")
return " ".join(text.split())
references = [normalize(x) for x in reference_texts]
hypotheses = [normalize(x) for x in predicted_texts]
score = process_words(references, hypotheses)
print({
"wer": score.wer,
"substitutions": score.substitutions,
"deletions": score.deletions,
"insertions": score.insertions,
"reference_words": score.hits + score.substitutions + score.deletions,
})WER mede reconhecimento e mistura erro acústico, erro linguístico e referência imperfeita; sozinho, não mede fronteiras. Para uma validação de alinhamento, reporte pelo menos: taxa de segmentos não decodificáveis; durações mínima, mediana, p95 e máxima; palavras por segundo; clips vazios; proporção de silêncio; duplicatas; e amostra humana estratificada. Em uma amostra, marque início cortado, fim cortado, fala extra, texto ausente, idioma divergente e correspondência correta. Se CTM e tempos originais forem recuperados, meça cobertura de palavras alinhadas e desvios de início/fim contra fronteiras revisadas. Sem um gabarito temporal, chame essas medidas de diagnósticos, não de “acurácia de alinhamento”.
Limites de domínio, generalização e privacidade
TEDx é fala pública e preparada, mas não homogênea: há sotaques, reverberação de auditório, microfones variados, aplausos, música, slides e alternância de código. O conteúdo privilegia apresentações narrativas e vocabulário temático. Desempenho nesse corpus não estima automaticamente call center, conversa espontânea, ditado clínico, reunião remota, fala infantil, idosos, baixa largura de banda ou ambientes domésticos. Faça avaliação externa por domínio, região, gênero percebido, duração, relação sinal-ruído e taxa de fala, quando houver base ética e metadados adequados.
O nome “PTBR” é do empacotamento; o corpus original rotula o idioma apenas como pt, e o esquema HF não contém país, variedade ou sotaque. Uma amostra brasileira não me permite concluir que todos os locutores sejam brasileiros. Evite alegações de cobertura representativa do português do Brasil sem uma anotação regional independente.
Publicação na internet também não elimina riscos de privacidade. Voz é um identificador biométrico; palestras podem conter nomes, locais, experiências médicas ou outros dados pessoais. A ficha não oferece mecanismo por exemplo para consentimento, retirada, anonimização ou proveniência. Não use o conjunto para identificação de locutor, clonagem de voz ou inferência sensível sem base jurídica e análise ética próprias. Modelos podem memorizar frases e características vocais; controle acesso a checkpoints, teste memorização e mantenha um processo de remoção quando aplicável.
Diferenças entre versões da licença
A ficha do Hugging Face marca CC BY-NC 4.0 [1]. Nessa licença, compartilhar e adaptar é permitido com atribuição, indicação de mudanças e uso não comercial; direitos de imagem, privacidade e direitos morais podem continuar limitando o uso [7]. Entretanto, tanto o artigo quanto a página oficial SLR100 declaram o corpus original como CC BY-NC-ND 4.0 [2][3]. O elemento ND proíbe distribuir material adaptado, embora mera mudança de formato não crie necessariamente uma adaptação [8].
O rótulo mais permissivo do repositório secundário não me permite concluir que o uploader tenha autoridade para remover ND dos áudios e textos originais. Para gestão conservadora de risco, preserve atribuição aos criadores e ao TEDx, enlace a licença, documente transformações, limite-se a uso não comercial e trate CC BY-NC-ND 4.0 como o piso aplicável ao material original até obter esclarecimento dos titulares. Treinar e, sobretudo, distribuir datasets modificados ou modelos derivados pode exigir análise jurídica específica; “NonCommercial” depende da finalidade, não apenas de cobrar pelo arquivo. Esta seção é orientação técnica de proveniência, não aconselhamento jurídico.
Checklist de uso responsável
- Registre a edição SLR100, a distribuição HF, a data de acesso e as versões de
datasets, TorchCodec e FFmpeg. - Confirme as 92.277 linhas e registre limitações observadas de decodificação.
- Converta explicitamente para taxa e canais esperados pelo modelo.
- Não reorganize segmentos aleatoriamente antes de recuperar grupos de palestra.
- Audite duplicatas, palestra e locutor entre splits.
- Publique normalização, contagens de erros e WER de corpus.
- Faça revisão humana estratificada de alinhamento e conteúdo sensível.
- Use o OpenSLR, não junção por posição, quando precisar de tradução.
- Avalie em fala externa ao domínio TEDx antes de alegar generalização.
- Resolva a divergência BY-NC versus BY-NC-ND antes de redistribuir ou usar comercialmente.
Conclusão
Com este empacotamento, aproximei a parcela portuguesa do mTEDx de pipelines de ASR sem reivindicar a criação do corpus original. Facilitei o acesso a áudio e transcrição e aprendi que metadados de proveniência, separação de locutores, privacidade e licenças continuam essenciais em qualquer reutilização.
Referências
- Domingues, M. mTEDx-ptbr: Multilingual TEDx (Portuguese speech and transcripts). Hugging Face, 2023. Ficha e arquivos.
- Salesky, E. et al. The Multilingual TEDx Corpus for Speech Recognition and Translation. Interspeech 2021, p. 3655-3659. DOI: 10.21437/Interspeech.2021-11.
- Open Speech and Language Resources. SLR100: Multilingual TEDx. OpenSLR 100.
- Wiesner, M.; Salesky, E. Kaldi recipes for TEDx ASR and sentence-driven speech alignment. Repositório
m-wiesner/tedx. - IWSLT. IWSLT 2021 Multilingual Speech Translation. Descrição da tarefa.
- Hugging Face. Datasets: Load audio data. Documentação.
- Creative Commons. Attribution-NonCommercial 4.0 International. CC BY-NC 4.0.
- Creative Commons. Attribution-NonCommercial-NoDerivatives 4.0 International. CC BY-NC-ND 4.0.
BibTeX
@inproceedings{salesky2021mtedx,
title = {The Multilingual TEDx Corpus for Speech Recognition and Translation},
author = {Salesky, Elizabeth and Wiesner, Matthew and Bremerman, Jacob and
Cattoni, Roldano and Negri, Matteo and Turchi, Marco and
Oard, Douglas W. and Post, Matt},
booktitle = {Interspeech 2021},
pages = {3655--3659},
year = {2021},
doi = {10.21437/Interspeech.2021-11}
}
@misc{domingues2023mtedxptbr,
title = {mTEDx-ptbr: Multilingual TEDx Portuguese Speech and Transcripts},
author = {Domingues, Maicon},
year = {2023},
howpublished = {Hugging Face dataset},
url = {https://huggingface.co/datasets/dominguesm/mTEDx-ptbr},
note = {Empacotamento da parcela portuguesa do corpus mTEDx}
}