Skip to content

Como anotar legendas do YouTube

Como baixar legendas do YouTube com o yt-dlp e anotá-las no Potato, o que as legendas geradas automaticamente permitem e o que verificar antes de compartilhar mídia.

Baixe as legendas com o yt-dlp e aponte o Potato para os arquivos. As legendas geradas automaticamente não têm pontuação nem rótulos de locutor, e as quebras de linha delas não significam nada, o que limita o que você pode anotar com sentido. O Potato lê todos os formatos de legenda que o yt-dlp gera. Veja Formatos de transcrição para a lista completa.

As plataformas de vídeo são uma fonte grande e conveniente de dados de fala naturalística. As legendas ocultas transformam essa fala em texto, e o texto é pequeno, fácil de transferir e fácil de anotar. O problema é que nem todas as legendas são o mesmo tipo de objeto, e um esquema pensado para um tipo quebra no outro.

Como baixo as legendas?

O yt-dlp busca as legendas com ou sem a mídia:

bash
# Human-written subtitles, if the uploader provided any
yt-dlp --write-subs --sub-langs en --skip-download <URL>
 
# Auto-generated captions
yt-dlp --write-auto-subs --sub-langs en --sub-format vtt --skip-download <URL>

O Potato lê vtt, srt, json3, ttml e as variantes srv1, srv2 e srv3, então qualquer --sub-format que você escolher será lido. Escolha pelo que você quer preservar: o json3 guarda os tempos por palavra, enquanto o WebVTT e o SubRip são mais fáceis de ler e de editar à mão.

Qual é a diferença entre legendas humanas e legendas automáticas?

Elas parecem iguais em um editor de texto e se comportam de modo muito diferente como entrada de anotação:

Legendas humanasLegendas automáticas
PontuaçãoSimNão, ou pouco confiável
Fronteiras de fraseSignificativasArbitrárias
LocutoresÀs vezes, com tags <v Name>Nunca
Tempos por palavraNãoSim, no json3
LiteralidadeMuitas vezes condensadas para leituraMais próximas do que foi dito

Nenhuma é melhor em tudo. As legendas humanas são agradáveis de ler, mas são editadas para facilitar a leitura, então cortam hesitações, comprimem repetições e às vezes reescrevem uma frase inteira. As legendas automáticas ficam mais perto do literal, que é o que você quer para qualquer estudo sobre como as pessoas realmente falam, mas chegam como um fluxo sem pontuação.

O que posso anotar em legendas automáticas?

Não projete um esquema de anotação por frase sobre legendas automáticas. As fronteiras dos blocos caem onde a janela de legenda encheu, e não onde uma frase terminou, o que faz de cada bloco uma unidade de exibição sem nenhum estatuto linguístico. Peça aos anotadores que avaliem frases e cada um vai escolher fronteiras de frase diferentes, de modo que os seus números de concordância acabam medindo essa variação em vez do julgamento que interessava.

Duas opções viáveis:

  • Anote as janelas de legenda como estão. Rotule cada bloco com o que se aplica a ele e aceite que a unidade é arbitrária, mas consistente. Serve para tópico, para a presença de um fenômeno ou para qualquer coisa que se possa julgar em um fragmento.
  • Segmente de novo antes. Rode um modelo de restauração de pontuação ou um sistema de ASR que pontue e depois refaça os tempos. Dá mais trabalho, mas você obtém unidades reais.

Se você tem legendas humanas, esse problema praticamente desaparece. As fronteiras dos blocos foram colocadas por alguém que acompanhava a leitura, então em geral respeitam as orações.

E o vídeo?

As legendas são pequenas e fáceis de redistribuir. O vídeo, em geral, não. Há três opções:

bash
# Media hosted somewhere your annotators can reach
potato transcripts ./captions --media-url-prefix https://cdn.example.org/video -o data/talks.json
 
# Media downloaded locally as audio only
yt-dlp -f 'ba' -x --audio-format mp3 -o './audio/%(id)s.%(ext)s' <URL>
potato transcripts ./captions --media-dir ./audio -o data/talks.json

A terceira opção é não ter mídia nenhuma. Transcrições sem mídia podem ser anotadas sem problema; os anotadores leem em vez de ouvir. Se esse for o seu plano, diga isso nas instruções, porque do contrário os anotadores supõem que o player ausente é um bug e o relatam como tal.

Aviso: verifique os seus direitos antes de redistribuir qualquer coisa que você não criou. Baixar legendas ou mídia para a sua própria pesquisa é uma questão diferente de servir essa mídia a um grupo de anotadores, e os termos da plataforma, os direitos autorais e as regras da sua instituição pesam nisso. Resolva isso antes de montar o pipeline, não depois.

Como configuro a tarefa?

O conversor grava um arquivo de dados com a transcrição já normalizada:

bash
potato transcripts ./captions --media-dir ./audio -o data/talks.json
json
{
  "id": "talk_01",
  "conversation": {
    "audio": "audio/talk_01.mp3",
    "turns": [
      {"turn_id": "t0", "speaker": null, "start": 0.0, "end": 4.2,
       "text": "so the thing about caption windows is"}
    ]
  }
}

speaker: null é o que uma legenda automática fornece. Esses turnos aparecem como Unassigned com um seletor, para que os anotadores possam atribuí-los enquanto ouvem.

Três turnos de legenda automática com fundo cinza hachurado, cada um rotulado como Unassigned com a seta de um menu suspenso e uma pergunta embutida associada a cada turno.As legendas automáticas não trazem locutores, então cada bloco fica como Unassigned até que um anotador escolha um

yaml
annotation_task_name: "Talk Annotation"
task_dir: .
data_files:
  - data/talks.json
 
item_properties:
  id_key: id
  text_key: conversation
 
instance_display:
  fields:
    - key: conversation
      type: audio_dialogue
      label: "Captions"
      span_target: true
      display_options:
        show_timestamps: true
        allow_speaker_assignment: auto
 
annotation_schemes:
  - annotation_type: radio
    name: cue_topic
    description: "What is this caption window about?"
    labels: [setup, argument, example, aside]
    turn_level: true
    turn_binding:
      field: conversation

turn_level: true associa a pergunta a cada bloco em vez de ao vídeo como um todo, e turn_binding.field nomeia o campo de exibição de onde vêm esses blocos. O bloco é a unidade certa para a pergunta quando os blocos são tudo o que você tem. Rode a tarefa:

bash
potato start config.yaml -p 8000

Você também pode pular o conversor por completo e apontar um arquivo de dados para os arquivos de legenda no disco. Veja Como anotar transcrições do Whisper, onde o restante deste fluxo é igual.

Leitura adicional