Como funciona

Transcrever áudio com Whisper, dentro do seu navegador

A página roda um modelo aberto de reconhecimento de fala, o Whisper, dentro da aba do seu navegador. Veja o que ela baixa, como lê um arquivo longo sem carregar tudo de uma vez, como os parágrafos são montados e por que o tempo muda de um dispositivo para outro.

Três passos, todos dentro do seu navegador

1. Seu navegador lê o arquivo

Onde o navegador consegue, um worker da sua aba pega a faixa de som em pedaços de 30 segundos e converte no som mono a 16 kHz que o modelo espera.

2. O Whisper transcreve em janelas

O motor, whisper.cpp compilado para WebAssembly, transcreve uns três minutos de som por vez e entrega à página o texto de cada janela.

3. A página organiza o texto

As palavras são agrupadas em parágrafos nas pausas, com uma marcação de tempo em cada um se você quiser, prontas para pesquisar, copiar ou salvar em TXT.

O modelo: Whisper, base ou small

O Whisper é um modelo de reconhecimento de fala que a OpenAI publicou em 2022, com código e pesos sob a licença MIT. Ele escuta o som em trechos de 30 segundos e escreve as palavras, com os tempos de cada segmento. Este site oferece dois tamanhos:

  • O modelo menor (o padrão) é o Whisper base, guardado com 5 bits por peso. É o download mais leve.
  • O modelo maior é o Whisper small, guardado com 8 bits por peso: um download maior, que precisa de mais memória.

Guardar os pesos com menos bits (quantização) diminui o modelo em troca de um pouco de precisão. Ainda não publicamos como os dois tamanhos se comparam neste motor, idioma por idioma: primeiro medimos, depois descrevemos. O menu de idiomas lista os idiomas que podem ser indicados ao Whisper; na detecção automática, o motor escolhe o idioma na primeira janela que tem fala e mantém para o resto do arquivo.

O motor: whisper.cpp compilado para WebAssembly

O modelo roda no whisper.cpp, uma versão de código aberto do Whisper escrita em C/C++, que compilamos para WebAssembly (um formato de programa que qualquer navegador atual executa) com uma pequena interface nossa. Existem três versões, e a página tenta nesta ordem:

  • WebGPU, se o seu navegador oferece um adaptador gráfico com os recursos que o motor precisa. Ainda não medimos essa versão em uma placa de vídeo de verdade, então não afirmamos nada sobre ela.
  • WebAssembly em várias threads, uma por núcleo lógico que o navegador informa. As threads exigem que a aba esteja isolada de outras origens, e os cabeçalhos do site garantem isso.
  • WebAssembly em uma thread, quando não há threads disponíveis ou o navegador informa dois núcleos lógicos ou menos. O resultado é do mesmo tipo.

Se uma versão não inicia, ou se a versão WebGPU falha no meio do trabalho, a página reinicia o motor na versão seguinte e continua. A linha acima da transcrição mostra qual versão fez o trabalho.

O que a página baixa, e quando

Ao abrir a página, só são baixados a página e os arquivos dela. O motor e um modelo chegam deste site quando você adiciona o primeiro arquivo:

Arquivos que a transcrição baixa deste site (tamanhos dos arquivos publicados)
ArquivoTamanhoQuando
Motor, versão com várias threads ou com uma thread (uma das duas)cerca de 1,5 MBSeu primeiro arquivo
Modelo menor (Whisper base, 5 bits), o padrão59,7 MB em 3 partesSeu primeiro arquivo com ele
Modelo maior (Whisper small, 8 bits)264,5 MB em 13 partesSó se você escolher
Detector de voz (Silero VAD)0,9 MBSeu primeiro arquivo
Leitor de mídia (Mediabunny), parte dos scripts da páginacerca de 0,3 MBSeu primeiro arquivo
Motor, versão WebGPUcerca de 3,4 MBSó se o navegador oferecer um adaptador WebGPU utilizável

Os modelos chegam em partes de no máximo 20 MiB, porque a hospedagem não serve nenhum arquivo acima de 25 MiB. Antes de o motor usar uma parte, o navegador confere a impressão digital SHA-256 dela, então um download corrompido é recusado em vez de gerar uma transcrição errada. As partes verificadas ficam no Cache Storage do navegador quando ele tem espaço para elas, e assim o próximo arquivo, e a próxima visita, não baixam de novo.

Por que sua gravação nunca é enviada

Cada passo acontece dentro da sua aba, o site não tem nenhum endereço que possa receber um arquivo e a página só pode se conectar a este site. A verificação de que sua gravação não é enviada fica na página de privacidade e segurança, com os passos para você mesmo acompanhar as requisições.

Diagrama do caminho da sua gravação: o navegador lê o arquivo, um leitor de mídia em um worker decodifica o som em pedaços de 30 segundos, o motor Whisper em WebAssembly transcreve em janelas de uns 3 minutos e a sua aba mostra os parágrafos para você copiar ou salvar em TXT. A gravação nunca é enviada ao servidor do site, que só envia a página, o motor e o modelo (uns 60 MB no primeiro arquivo, depois guardados pelo navegador).
Sua gravação fica na aba do navegador: só entram a página, o motor e o modelo, e nada do seu arquivo sai.

Como um arquivo longo é lido e transcrito

Uma gravação de uma hora ocupa uns 115 MB de som depois de decodificada em mono a 16 kHz (3.600 segundos x 16.000 amostras x 2 bytes, ou o dobro nos números de 32 bits com que o motor trabalha). Por isso, sempre que o navegador permite, a página não decodifica o arquivo inteiro de uma vez. Um segundo worker abre o arquivo com o Mediabunny, decodifica a faixa de som com o decodificador do próprio navegador, 30 segundos por vez, e só entrega o pedaço seguinte quando o motor está pronto para ele.

Os pedaços se juntam em janelas de uns três minutos. Cada janela termina no meio segundo mais silencioso dos seus últimos 15 segundos, para que um corte raramente caia no meio de uma palavra, e as janelas se seguem sem buracos nem sobreposição. Um pequeno detector de voz marca os trechos com fala de cada janela, e assim o modelo pula o silêncio em vez de escrever palavras por cima dele. Cada janela é transcrita com o final do texto anterior como contexto, o que ajuda uma frase partida por um corte, e os tempos voltam para o relógio do arquivo.

Quando uma janela termina, os parágrafos dela aparecem na página, então você já pode ler e pesquisar enquanto o resto continua. Se o seu navegador não tem decodificador para o som de um arquivo, a página passa a decodificar o arquivo inteiro de uma vez, e aí recusa os que passam de 500 MB ou de 1 hora.

Quatro passos de um arquivo longo até os parágrafos: a faixa de som é lida em pedaços de 30 segundos como mono a 16 kHz; os pedaços formam janelas de uns 3 minutos, cada uma cortada no meio segundo mais silencioso; o detector de voz pula o silêncio e o Whisper escreve as palavras de cada janela com seus tempos; uma pausa de 2 segundos ou mais entre duas palavras começa um parágrafo novo, que pode trazer a marcação de tempo como [hh:mm:ss].
Sempre que o navegador permite, uma gravação longa não é decodificada de uma vez: ela passa pela página pedaço por pedaço e janela por janela. Os números são ajustes do motor.

Como os parágrafos e as marcações de tempo são feitos

O Whisper devolve segmentos de texto com tempo de início e de fim, e um tempo para cada palavra. A página junta esses segmentos em parágrafos: um novo começa numa pausa de 2 segundos ou mais, medida pelos tempos das palavras de cada lado, e um parágrafo que passa de uns 600 caracteres termina no próximo fim de frase. Não há identificação de falantes, então uma quebra de parágrafo indica uma pausa ou um trecho longo de fala, nunca uma troca de voz.

A marcação de tempo de um parágrafo é o tempo de início da primeira palavra, escrito como [hh:mm:ss] e arredondado para baixo no segundo. Ela é aproximada: serve para achar um trecho na gravação, não para legendas. Copiar o texto e Baixar TXT escrevem os mesmos parágrafos, separados por uma linha em branco e com as marcações de tempo quando elas estão visíveis.

Por que o tempo varia

Quem faz o trabalho é o seu processador, então o mesmo arquivo leva um tempo em um notebook novo e outro em um antigo, e o modelo e a duração da gravação também pesam. Por isso a página não promete velocidade. Assim que o motor informa o primeiro progresso, a página mede quantos segundos de trabalho cada segundo de som custa no seu dispositivo, suaviza isso entre as janelas para que um momento lento não distorça a conta, e mostra o tempo que falta.

O que o seu dispositivo precisa

  • Um navegador atual com WebAssembly. Chrome, Edge, Firefox e Safari têm; nosso teste automático roda no Chromium.
  • Memória livre suficiente para o modelo e uma janela de som. O modelo maior precisa de mais; vamos publicar números medidos quando os tivermos.
  • Conexão para o primeiro arquivo. O modelo fica guardado no armazenamento do navegador quando há espaço, e as próximas visitas não o baixam de novo.

Os componentes de código aberto do motor, os modelos e o leitor de mídia aparecem com suas licenças na página de créditos.

Perguntas sobre o motor

É o mesmo Whisper que a OpenAI publicou?

É o mesmo modelo: a OpenAI publicou o código e os pesos do Whisper sob a licença MIT. Esta página usa esses pesos no formato de arquivo do projeto de código aberto whisper.cpp, quantizados (guardados com menos bits por peso) para o download ficar menor. O motor é o whisper.cpp compilado para WebAssembly, não o código Python da OpenAI, e nenhuma requisição vai para a OpenAI.

Ele usa minha placa de vídeo?

Ele tenta. Se o seu navegador oferece WebGPU com os recursos que o motor precisa, a página inicia primeiro a versão WebGPU e, se ela falhar, passa sozinha para as versões de CPU. Nossas máquinas de teste não têm placa de vídeo, então da versão WebGPU só conferimos que ela cede a vez sem problemas. A linha acima da transcrição mostra qual versão fez o trabalho.

Por que o modelo foi baixado de novo?

Seu navegador guarda o modelo no Cache Storage deste site até você apagar os dados do site, ou até o próprio navegador apagar para liberar espaço. Depois disso, o próximo arquivo baixa o modelo de novo. O que o seu navegador guarda e como apagar explica em detalhes.

O que acontece quando eu clico em Cancelar?

A página para o motor na hora, fechando o worker em que ele roda, e descarta os parágrafos feitos até ali. O próximo arquivo inicia um motor novo e pega o modelo do armazenamento do navegador, então o modelo não é baixado de novo.

Fontes

Teste com uma gravação

A transcrição acontece no seu navegador. Seu arquivo nunca sai do seu dispositivo.

Abrir a ferramenta de transcrição