Como funciona

Como o seu vídeo vira legendas sem sair do seu dispositivo

O Subtitle Generator roda um modelo de reconhecimento de fala dentro da aba do navegador. Aqui está cada passo, do arquivo às legendas, o que o navegador baixa e guarda, e o que medimos e o que ainda não.

Cinco passos, todos dentro da aba

1. O navegador abre o arquivo

Você escolhe um arquivo de vídeo ou áudio, e o navegador entrega à página só esse arquivo. A página passa o arquivo ao motor dentro da aba. Nada é enviado.

2. O som é lido em partes

Onde o navegador consegue, um leitor de mídia em um Web Worker lê o som de 30 em 30 segundos com os decodificadores do navegador e o converte para 16 kHz mono, o formato que o modelo usa.

3. Janelas cortadas nos silêncios

O som é agrupado em janelas de cerca de 3 minutos. Cada corte cai no meio segundo mais silencioso perto da marca de 3 minutos, então quase nunca parte uma palavra.

4. O modelo escreve cada janela

Um detector de voz marca os trechos com fala, e o modelo de reconhecimento de fala os escreve, com um início e um fim para cada palavra.

5. As palavras viram legendas

As palavras são divididas em legendas que dá tempo de ler, as legendas aparecem na página e você as edita. O arquivo SRT ou VTT é escrito quando você clica em baixar.

Diagrama de para onde vai o seu arquivo: o vídeo ou áudio é aberto com a API de arquivos do navegador, um leitor de mídia em um Web Worker lê o som de 30 em 30 segundos e o modelo de reconhecimento de fala escreve cada janela de cerca de 3 minutos com WebGPU ou WebAssembly; a sua aba mostra as legendas, você as edita e salva um arquivo SRT ou VTT. O arquivo nunca é enviado. O único tráfego é a página, o motor, o modelo (cerca de 60 ou 264 MB) e um pequeno detector de voz, que vêm do servidor do site na primeira vez e depois ficam guardados.
O seu arquivo fica na aba do navegador: a página, o motor e o modelo entram, e nada sai.

O modelo: Whisper, em dois tamanhos

As palavras vêm do Whisper, um modelo de reconhecimento de fala que a OpenAI publicou em 2022 com os pesos sob a licença MIT. Ele roda por meio do whisper.cpp, uma versão de código aberto em C++, que compilamos para WebAssembly para rodar numa página web. Você escolhe entre dois tamanhos:

  • O modelo menor (o padrão) é o Whisper base, com os pesos arredondados para 5 bits: um download de 59,7 MB.
  • O modelo maior é o Whisper small, com pesos de 8 bits: um download de 264,5 MB que precisa de mais memória.

No artigo da OpenAI, os modelos Whisper maiores erraram menos em média, mas ainda não medimos como estes dois se comparam neste motor, então a página os chama de "menor" e "maior" em vez de prometer que um é mais preciso. Antes do modelo, um pequeno detector de voz, o Silero VAD, marca onde há fala, para o modelo gastar o tempo com a voz. Se você deixar o idioma no automático, o modelo identifica o idioma na primeira janela com fala, e a página mantém esse idioma no resto do arquivo.

Cada janela é escrita com as últimas palavras da anterior como contexto (cerca de 200 caracteres), então uma frase que atravessa um corte mantém as palavras e a pontuação. Assim que uma janela termina, as legendas dela aparecem na página e você pode editá-las enquanto a próxima é escrita. Gere legendas do seu vídeo para ver.

Como as palavras viram legendas

O modelo entrega segmentos de texto com um início e um fim para cada palavra. Um segmento pode ser uma frase longa, então a página o corta em legendas que dá tempo de ler:

  • No máximo duas linhas de 42 colunas por legenda; um caractere largo, como em chinês ou japonês, conta como duas colunas. As escritas sem espaços são divididas em palavras pelo segmentador de palavras do navegador.
  • No máximo 7 segundos na tela, e pelo menos 1 segundo quando o intervalo até a próxima permite.
  • Os cortes caem entre palavras: primeiro no fim de uma frase, depois numa vírgula ou numa pausa de meio segundo ou mais, senão onde as duas partes ficam equilibradas. Um sinal de fechamento fica com a palavra anterior.
  • O corte é cronometrado pelos tempos das palavras. Quando o modelo não os deu, o tempo é repartido conforme o texto.
  • As legendas nunca se sobrepõem, e nenhuma termina depois do fim do arquivo.
Quatro passos da fala às legendas: o som é cortado em janelas de cerca de 3 minutos no meio segundo mais silencioso; um detector de voz marca a fala e o modelo a escreve com um tempo para cada palavra; as últimas palavras de cada janela passam para a seguinte como contexto; as palavras viram legendas de no máximo duas linhas de 42 colunas e 7 segundos, cortadas no fim de uma frase, numa vírgula ou numa pausa.
Como a página transforma o som do seu arquivo em legendas. Os limites são os do código das legendas.

Os tempos são a estimativa do próprio modelo de onde cada palavra começa e termina, então uma legenda pode aparecer um pouco adiantada ou atrasada. Ainda não medimos quanto neste motor. Se uma legenda estiver fora do lugar, você pode corrigir à mão: mover o início ou o fim em 0,1 segundo, dividir ou juntar com a próxima.

Qual versão do motor roda

O motor tem três versões, e a página escolhe uma quando você adiciona o primeiro arquivo:

  • WebGPU, tentada primeiro quando o navegador oferece um adaptador gráfico que passa na verificação da página. Se ela falhar ao carregar ou ao escrever uma janela, a página troca para uma versão de processador e escreve essa janela de novo.
  • WebAssembly em várias threads, uma thread por processador lógico que o navegador informa. As threads exigem uma página isolada de outras origens, por isso o site envia os cabeçalhos COOP e COEP.
  • WebAssembly em uma thread, o último recurso para um navegador que não roda threads, e a versão usada quando o navegador informa dois processadores lógicos ou menos.

A linha abaixo da prévia diz qual versão rodou, por exemplo "WebAssembly em várias threads". Ainda não medimos a versão WebGPU numa placa de vídeo de verdade, então o site não afirma nada sobre a velocidade dela. Seja qual for a versão, o seu dispositivo faz o trabalho: a linha de status mostra uma estimativa do tempo restante, medida no seu dispositivo durante o processo, em vez de prometer uma velocidade.

O que o navegador baixa e o que ele guarda

Tudo vem deste site. Os modelos são divididos em partes de no máximo 20 MiB, porque a hospedagem serve arquivos estáticos de até 25 MiB, e cada parte é conferida com a sua impressão digital SHA-256 antes do uso, então um download corrompido é recusado em vez de gerar legendas erradas. Os tamanhos são os dos arquivos publicados, em megabytes de um milhão de bytes:

Arquivos que a página baixa deste site
ArquivoTamanhoFica em
O motor, versão WebAssembly com várias threads (quando o WebGPU não é usado e o navegador informa mais de dois processadores lógicos)1,6 MBO cache comum do navegador
O motor, versão com uma thread (quando não há threads ou o navegador informa dois processadores lógicos ou menos)1,5 MBO cache comum do navegador
O motor, versão WebGPU (só se a página achar uma GPU utilizável)3,4 MBO cache comum do navegador
O modelo menor, Whisper base (o padrão)59,7 MB, em 3 partesCache Storage, após a verificação SHA-256 de cada parte
O modelo maior, Whisper small (só se você escolher)264,5 MB, em 13 partesCache Storage, após a verificação SHA-256 de cada parte
O detector de voz, Silero VAD0,9 MB, em 1 parteCache Storage, após a verificação SHA-256
O leitor de mídia (parte dos scripts da página)0,3 MBO cache comum do navegador

O motor, o modelo e o detector só são baixados quando você adiciona um arquivo, não ao abrir a página. O seu arquivo, o som dele e as suas legendas nunca são guardados: vivem na aba aberta e somem quando você a fecha. Para remover o modelo guardado, limpe os dados deste site no navegador. O teste de rede passo a passo mostra como ver tudo isso nas ferramentas de desenvolvedor do navegador.

Como testamos

Um teste automático de navegador roda a cada mudança no site. Ele carrega uma cópia compilada do site no Chromium, o motor do Chrome e do Edge, com os cabeçalhos de segurança do próprio site, e confere, entre outras coisas, que:

  • uma frase em inglês de 3,5 segundos do corpus LibriSpeech, "Concorde returned to its place amidst the tents.", sai como legendas com no máximo duas palavras erradas, com o modelo menor, a partir de um arquivo WAV, de um vídeo MP4 e de um arquivo WebM;
  • depois de uma edição, um ajuste de 0,1 segundo e uma divisão, os arquivos SRT e VTT são lidos de volta exatamente como as legendas da página, e o leitor de legendas do próprio Chromium carrega o VTT;
  • num arquivo de 60 segundos com fala a cada 10 segundos, as legendas aparecem janela por janela e cada frase começa na sua marca;
  • Cancelar interrompe o processo, e o próximo arquivo reaproveita o modelo guardado, sem um novo download;
  • um trecho em silêncio não gera legendas, uma parte danificada de um arquivo mantém as legendas anteriores e um arquivo que não é de mídia é recusado;
  • toda requisição vai para este site, como GET ou HEAD sem corpo.

Esse teste usa uma frase curta de uma só pessoa, em um só idioma. Ele mostra que as peças funcionam juntas; não mede a precisão das legendas.

Limites que vale conhecer

  • Precisão e tempos ainda não foram medidos neste motor, então nenhuma página dá um número. Música, ruído e pessoas falando ao mesmo tempo causam mais erros. O português ainda não foi medido.
  • Sem nomes de quem fala, sem descrição de sons, sem tradução. As legendas são as palavras ditas, no idioma falado.
  • Arquivos longos demoram. Onde o navegador consegue, a página lê em partes e nunca guarda o som inteiro do arquivo de uma vez, mas cada minuto de áudio é trabalho para o seu processador. O arquivo mais longo que rodamos até agora tem 12 minutos.
  • Alguns arquivos são lidos inteiros. Quando o navegador não consegue decodificar o som em partes, a página o decodifica de uma vez e para em 500 MB ou 1 hora.
  • Não testado em celulares. O modelo maior pode precisar de mais memória do que um celular tem livre; a página avisa quando o navegador informa que ficou sem memória.

Os componentes de código aberto e as licenças estão na página de créditos de código aberto.

Teste com o seu próprio vídeo

Roda no seu navegador. O seu arquivo nunca sai do seu dispositivo.

Abrir o gerador de legendas