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.
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.
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:
| Arquivo | Tamanho | Fica 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 MB | O 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 MB | O cache comum do navegador |
| O motor, versão WebGPU (só se a página achar uma GPU utilizável) | 3,4 MB | O cache comum do navegador |
| O modelo menor, Whisper base (o padrão) | 59,7 MB, em 3 partes | Cache 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 partes | Cache Storage, após a verificação SHA-256 de cada parte |
| O detector de voz, Silero VAD | 0,9 MB, em 1 parte | Cache Storage, após a verificação SHA-256 |
| O leitor de mídia (parte dos scripts da página) | 0,3 MB | O 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.