Communitygithub.com

Estilização de legendas e subtítulos

Estiliza, temporiza e posiciona legendas e subtítulos para que sejam lidas em um telefone com o som desligado. Define comprimento de linha, velocidade de leitura, duração do quadro, tamanho, contraste e zonas seguras da plataforma, e verifica arquivos SRT ou VTT em relação a esses parâmetros.

O que é Estilização de legendas e subtítulos?

Esta skill é voltada para a criação e estilização de legendas e subtítulos otimizados para visualização em dispositivos móveis, com foco em acessibilidade e plataformas de vídeo curto como TikTok, Reels, Shorts e YouTube. Ela aplica padrões da indústria — como no máximo 2 linhas por quadro, 42 caracteres por linha em paisagem e velocidade de leitura de 17 caracteres por segundo — e oferece um fluxo de trabalho completo que inclui segmentação de falas, verificação de conformidade com ferramenta de script e entrega de versões com queima de texto e arquivos SRT/VTT. A skill também trata de casos complexos como estimativas de largura de fonte, diferenças de grid do ffmpeg, placas de fundo opacas em ASS e falhas silenciosas de fontes. É útil para qualquer cenário onde o usuário deseje adicionar, corrigir, estilizar ou tornar acessíveis legendas e subtítulos, especialmente quando menciona que estão muito rápidas, pequenas ou escondidas sob elementos da interface do aplicativo.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/vidmoat/skills/tree/HEAD/skills/core/caption-styling

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que Estilização de legendas e subtítulos faz?

Uma legenda é lida em cerca de dois segundos, em um telefone, com o som desligado, sobre imagens em movimento, sob botões de aplicativos. Cada padrão abaixo atende a esse leitor. Trabalhe no editor do usuário se ele tiver um; os números são os mesmos em todos os lugares. Quando não houver editor, use as receitas do ffmpeg em references/ffmpeg-burn-in.md.

Padrões

Use estes a menos que o usuário ou seu guia de estilo diga o contrário.

ConfiguraçãoPadrãoPor quê
Linhas por quadroNo máximo 2Uma terceira linha cobre o assunto e não é lida a tempo.
Caracteres por linha42 em paisagem 16:9; em vertical 9:16, o que couber na largura segura no seu tamanho: cerca de 32 a 64 px, 28 a 72 px (caixa mista)Linhas mais longas forçam o movimento dos olhos e, em vertical, saem do quadro.
Velocidade de leituraNo máximo 17 caracteres por segundo (cerca de 160 a 180 palavras por minuto)Prática de transmissão; WCAG não define velocidade, então este é o padrão de trabalho.
Duração do quadroMínimo de 1 s, máximo de 6 sAbaixo de 1 s é um piscar; acima de 6 s os espectadores releem.
Intervalo entre quadros0 ou pelo menos 2 quadrosUm intervalo de 1 quadro parece um flash.
PosiçãoCentro inferior, dentro da zona segura; em 1080x1920, o texto fica acima dos 420 px inferiores (22% da altura)Isso libera tanto o TikTok quanto o Reels. Mova para o topo quando o terço inferior contiver um rosto, texto queimado ou IU do aplicativo.
Tamanho, legendas de frasesPaisagem: 4,5 a 5% da altura do quadro (49 a 54 px em 1080p). Vertical: 64 a 72 px em 1080x1920Legível à distância do braço e os comprimentos de linha acima ainda cabem na largura segura de 900 px.
Tamanho, legendas curtas e chamativas (1 a 3 palavras)Cerca de 140 a 150 px em 1080x1920, no máximo cerca de 14 caracteres por linha em caixa mista, 11 em maiúsculasSão elementos gráficos, não legendas.

| Cor | Off-white #F2F2F2 sobre uma placa escura de 70 a 80% de opacidade, ou um contorno escuro de 3 a 5 px mais sombra suave | O contraste contra imagens em movimento não pode ser medido quadro a quadro; uma placa garante WCAG 4.5:1. | | Fontes | Uma sans-serif pesada (negrito ou seminegrito); nunca mais de duas famílias em um vídeo | Pesos finos desaparecem após a compressão. | | Destaque de palavra (karaokê) | Uma cor de destaque apenas na palavra ativa, e ela também deve atender 4.5:1 | Uma segunda cor para "ênfase" faz com que os espectadores procurem o significado. |

Verificação de ajuste antes de renderizar. Uma sans-serif do tipo Arial em negrito e caixa mista média 0,44 do tamanho da fonte por caractere (medido, espaços incluídos); todas maiúsculas média 0,55; faces condensadas cerca de 0,35. Portanto, uma linha tem aproximadamente caracteres x fator x px_fonte de largura, e deve caber na largura segura (900 px em 1080x1920, 90% da largura em paisagem), não no quadro. A 96 px, uma linha de 27 caracteres em caixa mista tem cerca de 27 x 0,44 x 96 = 1.140 px: mais larga que todo o quadro de 1080 px. Os fatores são médias para as faces em que foram medidos (veja Pegadinhas), então confirme com um quadro renderizado.

As zonas seguras de pixels da plataforma e como derivar a caixa segura para qualquer tela estão em references/platform-safe-zones.md. Leia-o antes de colocar legendas em vídeo vertical.

Fluxo de trabalho

  1. Comece a partir de temporizações reais. As legendas precisam de uma transcrição com tempos de segmento ou palavra. Sem transcrição, não há legendas para fazer: diga isso, ou transcreva primeiro. Nunca invente texto.

  2. Reajuste os tempos para a edição. As transcrições são temporizadas em relação ao arquivo de origem. Após cortar, aparar ou alterar a velocidade, desloque e escale cada quadro para a linha do tempo (veja Pegadinhas).

  3. Segmente em quadros. Quebre nos limites das orações: após pontuação, antes de conjunções e preposições. Nunca separe um artigo de seu substantivo, um nome próprio de seu sobrenome ou um número de sua unidade. De duas quebras possíveis, escolha a que torna as duas linhas mais próximas em comprimento.

  4. Aplique a velocidade de leitura. Um quadro acima de 17 caracteres por segundo é dividido ou estendido para o silêncio após ele. Nunca reduza o tipo para caber.

  5. Marque falantes e som. Em uma mudança de falante, inicie a linha com - (ou nomeie-os entre colchetes na primeira vez). Coloque sons significativos não-fala entre colchetes: [porta bate], [música tensa]. Não legendem palavras de preenchimento que foram cortadas do áudio.

  6. Estilize e posicione usando os padrões e a caixa segura para esta tela.

  7. Verifique o arquivo, depois corrija todos os erros que ele relatar:

    python scripts/check_captions.py legendas.srt --fps 30 --max-chars 32
    

    Ele verifica número de linhas, comprimento de linha, caracteres por segundo, duração, intervalos e sobreposições, e sai com código diferente de zero em caso de erros. Adicione --json para um relatório legível por máquina. Seu limite de linha padrão é 32 caracteres, o valor para vertical e acessibilidade; passe --max-chars 42 para legendas em paisagem.

  8. Olhe para quadros renderizados, não para configurações: o primeiro quadro, o quadro mais longo, e um quadro sobre o fundo mais movimentado. Confirme que nada está cortado, nada fica sob a IU do aplicativo e o texto é legível no tamanho do telefone.

  9. Entregue ambos uma versão queimada para redes sociais e um arquivo .srt ou .vtt lateral para acessibilidade e upload na plataforma, a menos que o usuário tenha solicitado apenas um.

Pegadinhas

  • Estimativas de largura mentem em faces condensadas. As estimativas de largura média de glifo já erraram em mais de 3x: uma verificação de estouro relatou uma linha saindo 127 px de cada lado quando na verdade renderizou 270 px de largura em um quadro de 1080 px. Reduzir o tipo para atender a essa estimativa produziu legendas de 76 px em 1080x1920 onde o estilo chamativo pedia cerca de 150 px, muito pequeno para ler em um telefone. Renderize um quadro e meça.
  • Os tempos da transcrição são relativos à origem. Se um clipe começa 12,4 s após o início de sua origem, subtraia 12,4 s de cada quadro e adicione o início da linha do tempo do clipe. Em velocidade 2x, as durações reduzem pela metade, então os quadros podem cair abaixo de 1 s; re-segmentar em vez de manter os limites antigos do quadro.
  • ffmpeg queima SRT em uma grade de 288 linhas, não em pixels. Com subtitles=file.srt:force_style=..., FontSize e MarginV são medidos em relação a um script de 384x288, então FontSize=24 renderiza como uma fonte de 90 px em vídeo de 1080 linhas e 160 px em vídeo de 1920 linhas. Converta com FontSize = px * 288 / altura_do_quadro, ou escreva um arquivo ASS cujo PlayResX e PlayResY sejam iguais ao tamanho do vídeo para que as unidades sejam pixels (a receita faz).
  • Uma placa em ASS assume OutlineColour. Com BorderStyle=3, a cor da caixa vem de OutlineColour, não de BackColour, e as cores ASS são &HAABBGGRR onde alfa 00 é opaco. &H40000000 é preto com 75% de opacidade.
  • Mudanças de cor inline quebram uma placa ASS. Um destaque {\c...} dentro de uma linha BorderStyle=3 desenha uma caixa separada por execução de cor, e as caixas semitransparentes se sobrepõem em bordas escuras. Desenhe a placa como sua própria camada com texto invisível e coloque o texto visível em uma camada acima (a receita mostra como).
  • Fontes ausentes falham silenciosamente. libass recorre a outra fonte sem erro. Verifique a linha fontselect: no log do ffmpeg ou passe fontsdir=.
  • Caminhos do Windows quebram o filtro de legendas. Escape o dois-pontos da unidade: subtitles='C\:/clipes/legendas.srt'.
  • Letras de música cantadas são temporizadas por frase. O reconhecimento de fala sob música perde palavras (um teste perdeu 4 de 17) e retorna tempos de frase, não tempos de palavra. Não construa karaokê palavra por palavra a partir disso sem verificar o áudio.
  • Um preset pode colorir a palavra ativa em mais de um lugar. Um preset neon de um editor desenhou o destaque a partir de uma cor de destaque e de um brilho, então sobrescrever apenas um campo que não existe não mudou nada, sem erro. Sobrescreva todos os campos que carregam a cor, pelo seu nome real, e confirme em um quadro renderizado.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

Habilidades Relacionadas