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 em pontos silenciosos

O som é agrupado em janelas de cerca de 3 minutos. Cada corte cai no centro do meio segundo mais silencioso dos 15 segundos antes da marca de 3 minutos, para cortar numa pausa e não no meio de 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 a sua própria estimativa de quando as palavras começam e terminam.

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; onde o navegador consegue, um leitor de mídia em um Web Worker lê o som de 30 em 30 segundos (se não, a página decodifica o arquivo inteiro); 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. Nada do arquivo é enviado. O único tráfego são downloads do servidor do site: a página e, com o primeiro arquivo, o motor, o leitor de mídia, o modelo (cerca de 60 ou 264 MB, em partes) e um pequeno detector de voz. O navegador guarda o modelo e o detector se tiver espaço, e a cada visita só pede de novo os arquivos pequenos que listam as partes deles.
O seu arquivo fica na aba do navegador: a página, o motor, o leitor de mídia, o modelo e o detector de voz entram, e nada do seu arquivo 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 se saíram melhor na maioria dos testes, com os menores ganhos no inglês, 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 antes dela, cerca de 200 caracteres, como contexto: o modelo as lê como o texto que vinha logo antes do corte. 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, cada um com um início e um fim, e a sua estimativa de quando as palavras dele começam e terminam. 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 deu nenhum que combine com o texto, 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, cada corte no meio segundo mais silencioso dos 15 segundos antes da marca; um detector de voz marca a fala e o modelo a escreve, com a sua estimativa de quando as palavras começam e terminam; as últimas palavras de cada janela, cerca de 200 caracteres, 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, e cronometradas pelos tempos das palavras ou, quando o modelo não deu nenhum que combine, conforme o texto.
Como a página transforma o som do seu arquivo em legendas. Os limites são os do código das legendas.

Os tempos vêm da estimativa do próprio modelo de onde as suas palavras começam e terminam, ou dessa repartição conforme o texto, 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 um único processador lógico.

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 dois ou mais 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 um único processador lógico)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, se o navegador tiver espaço
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, se o navegador tiver espaço
O detector de voz, Silero VAD0,9 MB, em 1 parteCache Storage, após a verificação SHA-256, se o navegador tiver espaço
O leitor de mídia (um script da página, baixado quando você adiciona o primeiro arquivo)0,3 MBO cache comum do navegador

O motor, o leitor de mídia, o modelo e o detector só são baixados quando você adiciona um arquivo, não ao abrir a página. A página nunca guarda o seu arquivo, o som dele nem as suas legendas no armazenamento do navegador: eles 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 a mesma frase a cada 10 segundos, processado com janelas de teste de 20 segundos em vez dos 3 minutos da ferramenta, as legendas aparecem em pelo menos três etapas, e em cada uma das seis marcas uma legenda com a frase inteira começa entre meio segundo antes da marca e 2 segundos depois;
  • 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. No artigo da OpenAI, a taxa de erro do Whisper variava de um idioma para outro, muito ligada à quantidade de fala de treinamento de cada idioma, e subia à medida que o ruído de fundo adicionado aumentava.
  • 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 mantém na memória 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