Skip to content

Como anotar legendas do YouTube

Como descarregar legendas com o yt-dlp e anotá-las no Potato, o que as legendas automáticas permitem e não permitem, como lidar com o vídeo e o que verificar antes de redistribuir conteúdos.

Descarregue as legendas com o yt-dlp e aponte o Potato para os ficheiros. O primeiro ponto a saber: as legendas geradas automaticamente não têm pontuação nem etiquetas de falante, e as suas quebras de linha não significam nada, o que limita o que pode anotar com sentido. O Potato lê todos os formatos de legenda que o yt-dlp produz. Consulte Formatos de transcrição para a lista completa.

As plataformas de vídeo são uma fonte ampla e cómoda de fala natural. A legendagem transforma essa fala em texto, e o texto é pequeno, fácil de mover e fácil de anotar. O problema é que nem todas as legendas são o mesmo tipo de objeto, e tratá-las como se fossem é onde a maioria dos projetos de anotação sobre legendas se desencaminha.

Como descarrego as legendas?

O yt-dlp obtém legendas com ou sem o conteúdo:

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, portanto qualquer --sub-format que escolha será analisado. Escolha em função do que quer preservar: json3 mantém os tempos por palavra, enquanto WebVTT e SubRip são mais fáceis de ler e editar à mão.

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

Num editor de texto parecem-se, e como material de anotação comportam-se de forma muito diferente:

Legendas humanasLegendas automáticas
PontuaçãoSimNão, ou pouco fiável
Fronteiras de fraseSignificativasArbitrárias
FalantesÀs vezes, através de etiquetas <v Name>Nunca
Tempos por palavraNãoSim, em json3
LiteralidadeMuitas vezes condensadas para leituraMais próximas do que foi dito

Nenhuma é melhor em termos absolutos. As legendas humanas leem-se bem mas são editadas para legibilidade, por isso cortam hesitações, comprimem repetições e às vezes reescrevem uma frase inteira. As automáticas estão mais perto do literal, que é o que quer para qualquer coisa sobre como as pessoas falam de facto, mas chegam como um fluxo sem pontuação.

O que posso anotar em legendas automáticas?

Não desenhe um esquema de anotação ao nível da frase sobre legendas automáticas. As suas fronteiras de bloco caem onde a janela de legenda se encheu, não onde uma frase terminou. Um bloco num ficheiro de legendas automáticas é um artefacto de apresentação, não uma unidade linguística. Peça aos anotadores que avaliem frases e cada um escolherá em silêncio fronteiras diferentes, e os seus números de concordância acabarão por medir isso em vez daquilo que lhe interessava.

Duas opções viáveis:

  • Anote os blocos de legenda tal como estão. Etiquete cada bloco com o que se lhe aplicar e aceite que a unidade é arbitrária mas consistente. Serve para tema, presença de um fenómeno, ou qualquer coisa que se possa julgar sobre um fragmento.
  • Volte a segmentar a montante. Passe um modelo de restauro de pontuação ou um sistema de reconhecimento de fala que pontue, e realinhe. Mais trabalho, mas obtém unidades reais.

Se tiver legendas humanas, este problema desaparece quase por completo. As fronteiras foram colocadas por alguém a ler, portanto costumam respeitar as orações.

E o vídeo?

As legendas são pequenas e fáceis de redistribuir. O vídeo normalmente não é. 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 conteúdo nenhum. As transcrições sem áudio anotam-se bem; os anotadores leem em vez de ouvir. Se for esse o plano, diga-o nas instruções, porque de outra forma os anotadores vão assumir que a falta de leitor é um erro e reportá-lo como tal.

Warning: Verifique os seus direitos antes de redistribuir seja o que for que não tenha criado. Descarregar legendas ou conteúdos para a sua própria investigação é uma questão diferente de servir esse conteúdo a um grupo de anotadores, e aí pesam os termos da plataforma, os direitos de autor e as regras da sua instituição. Resolva isto antes de montar o fluxo de trabalho, não depois.

Como monto a tarefa?

O conversor escreve um ficheiro 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 lhe dá. Esses turnos aparecem como Unassigned com um seletor, para que os anotadores os atribuam enquanto ouvem.

Três turnos de legendas automáticas com fundo cinzento tracejado, etiquetados como Unassigned com uma seta de menu e uma pergunta associada a cada turno.As legendas automáticas não trazem falantes, por isso cada bloco fica como Unassigned até um anotador escolher 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 do vídeo inteiro, que é a unidade certa quando os blocos são tudo o que tem. Execute:

bash
python potato/flask_server.py start config.yaml -p 8000

Também pode dispensar por completo o conversor e apontar um ficheiro de dados para os ficheiros de legendas em disco. Consulte Como anotar transcrições do Whisper, onde o resto do fluxo é igual.

Leituras adicionais