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ção | Padrão | Por quê |
|---|---|---|
| Linhas por quadro | No máximo 2 | Uma terceira linha cobre o assunto e não é lida a tempo. |
| Caracteres por linha | 42 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 leitura | No 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 quadro | Mínimo de 1 s, máximo de 6 s | Abaixo de 1 s é um piscar; acima de 6 s os espectadores releem. |
| Intervalo entre quadros | 0 ou pelo menos 2 quadros | Um intervalo de 1 quadro parece um flash. |
| Posição | Centro 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 frases | Paisagem: 4,5 a 5% da altura do quadro (49 a 54 px em 1080p). Vertical: 64 a 72 px em 1080x1920 | Legí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úsculas | Sã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
-
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.
-
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).
-
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.
-
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.
-
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. -
Estilize e posicione usando os padrões e a caixa segura para esta tela.
-
Verifique o arquivo, depois corrija todos os erros que ele relatar:
python scripts/check_captions.py legendas.srt --fps 30 --max-chars 32Ele 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
--jsonpara 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 42para legendas em paisagem. -
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.
-
Entregue ambos uma versão queimada para redes sociais e um arquivo
.srtou.vttlateral 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=...,FontSizeeMarginVsão medidos em relação a um script de 384x288, entãoFontSize=24renderiza como uma fonte de 90 px em vídeo de 1080 linhas e 160 px em vídeo de 1920 linhas. Converta comFontSize = px * 288 / altura_do_quadro, ou escreva um arquivo ASS cujoPlayResXePlayResYsejam iguais ao tamanho do vídeo para que as unidades sejam pixels (a receita faz). - Uma placa em ASS assume
OutlineColour. ComBorderStyle=3, a cor da caixa vem deOutlineColour, não deBackColour, e as cores ASS são&HAABBGGRRonde alfa00é opaco.&H40000000é preto com 75% de opacidade. - Mudanças de cor inline quebram uma placa ASS. Um destaque
{\c...}dentro de uma linhaBorderStyle=3desenha 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 passefontsdir=. - 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.