Guia
Porque é que a sua transcrição repete a mesma frase vezes sem conta
Não é a sua gravação, e não é uma transferência corrompida. É o que o Whisper faz quando ninguém está a falar — e há formas concretas de o travar.
Transcreve uma gravação longa, abre a transcrição e, algures a meio, ela transforma-se nisto:
[ Silence ]
[ Silence ]
[ Silence ]
[ Silence ]
Ou, pior, escolhe uma frase real de um ponto anterior do ficheiro e repete-a quarenta vezes, com marcações de tempo plausíveis, como se alguém tivesse mesmo dito "obrigado por assistir" uma vez por segundo durante um minuto.
Esta é a queixa mais comum sobre a transcrição automática, e quase todas as ferramentas construídas sobre o Whisper da OpenAI têm alguma versão dela. Vale a pena perceber a causa, porque a solução não é "comprar um modelo maior".
O que está de facto a acontecer #
O Whisper é um modelo de linguagem. Não "ouve palavras e escreve-as" — prevê o próximo bloco de texto mais provável, dado o áudio e tudo o que já escreveu até ali.
Este enquadramento explica o problema. Quando o áudio contém fala, o texto seguinte mais provável são as palavras que estão a ser ditas. Quando o áudio não contém fala — uma pausa, o som ambiente da sala, música de espera, aplausos, um docente a caminhar até ao quadro — o modelo continua a ter de produzir alguma coisa. Não existe um símbolo para "aqui não aconteceu nada".
Por isso recorre ao que os modelos de linguagem fazem na ausência de sinal: repete-se. Acabou de escrever uma frase, a continuação estatisticamente mais provável dessa frase é uma frase parecida, e sem nada no áudio que contrarie esse palpite, entra num ciclo. O Whisper processa o áudio em janelas de 30 segundos, por isso, assim que uma janela entra em ciclo, obtém a mesma linha durante toda a janela, e depois a janela seguinte começa de novo e muitas vezes repete o mesmo.
É por isto que o problema surge num padrão muito específico:
- Gravações longas, porque contêm mais silêncio.
- O meio e o fim dos ficheiros, depois de a parte interessante ter acabado mas com o gravador ainda a correr.
- Música e aplausos, que são áudio denso sem palavras lá dentro.
- Gravações com um orador baixo e uma sala barulhenta, em que o modelo não consegue separar os dois.
Uma entrevista de cinco minutos feita perto do microfone quase nunca faz isto. Uma reunião de duas horas em que o gravador ficou a correr vinte minutos depois de toda a gente sair quase sempre faz.
Porque é que "[ Silence ]" e "[BLANK_AUDIO]" são um sintoma distinto da mesma coisa #
Os dados de treino do Whisper incluíam transcrições com anotações entre parênteses retos — [ Silence ], [BLANK_AUDIO], (music), ♪♪♪. Por isso, quando encontra algo que não é fala, uma das saídas prováveis é um desses marcadores, repetido sem parar.
Esta é a versão mais benigna: pelo menos a transcrição é honesta quanto a não haver ali nada. Continua a encher o seu documento com centenas de linhas inúteis, e continua a significar que a ferramenta está a gastar tempo real a descodificar silêncio.
Quatro formas de resolver #
Por ordem aproximada de eficácia.
1. Deteção de atividade vocal (a verdadeira solução) #
A deteção de atividade vocal — VAD — é um modelo pequeno e separado que corre antes da transcrição e assinala que partes do áudio contêm fala humana. Só essas partes são depois entregues ao transcritor.
Isto resolve o problema na origem, porque o ciclo só acontece quando se dá ao Whisper áudio sem fala. Se o silêncio nunca chegar ao modelo, não há nada sobre que alucinar. Também torna os ficheiros longos mais rápidos, porque deixa de pagar por descodificar vinte minutos de sala vazia.
O mais usado é o Silero VAD, e as versões recentes do whisper.cpp suportam-no diretamente. Se a sua aplicação oferecer uma opção de VAD ou "ignorar silêncio", ative-a. Se não oferecer, é algo razoável para pedir ao programador.
2. Cortar o silêncio você mesmo #
Se a sua ferramenta não tiver opção de VAD, pode fazer uma versão rudimentar à mão: corte o início e o fim da gravação antes de a transcrever, para que os vinte minutos de barulho de arrumação nunca cheguem a ser processados.
Qualquer editor de áudio faz isto. É maçador, e não resolve nada para o silêncio a meio de um ficheiro, mas para o caso muito comum de "o gravador ficou a correr no fim" leva trinta segundos e elimina o pior.
3. Filtrar os marcadores depois #
Se a sua transcrição estiver cheia de [ Silence ] e ♪♪♪, isso é fácil de remover com uma substituição, porque são linhas inteiras com uma forma reconhecível.
Cuidado com uma coisa: apague apenas as linhas que sejam inteiramente um marcador. Uma linha como "e depois — (risos) — lançámos" é fala real e quer mantê-la. É exatamente esta a regra que uma boa aplicação deve aplicar por si.
4. Dividir o ficheiro #
Como o ciclo está limitado pela janela do Whisper, cortar uma gravação longa em pedaços mais curtos limita os danos — uma janela má estraga um minuto em vez de se fundir numa parede de repetição. Algumas aplicações fazem isto internamente.
Isto é um contorno e não uma solução. Reduz o raio de destruição; não impede o modelo de alucinar sobre silêncio.
O que não resolve #
Um modelo maior. Passar do Base para o Large custa-lhe muito tempo e disco e não elimina o ciclo, porque a causa não é falta de capacidade — é pedir-lhe que transcreva algo que não contém fala. Os modelos grandes também entram em ciclo. (Mais sobre o compromisso de tamanho.)
Um serviço na nuvem. As boas ferramentas na nuvem correm VAD e pós-processamento nos seus fluxos, e é por isso que embatem nisto com menos frequência. O mecanismo por baixo é o mesmo, e muitas continuam a produzir "obrigado" cinquenta vezes num ficheiro silencioso. Pagar ao minuto não lhe compra um descodificador diferente.
Voltar a processar. A amostragem do Whisper não é totalmente determinística, por isso uma segunda tentativa pode entrar em ciclo noutro sítio. Isso não é uma solução, é atirar uma moeda ao ar.
O que fazemos quanto a isto #
Sendo específico, já que uma resposta vaga seria inútil aqui.
O Offline Transcription corre o Silero VAD antes de transcrever, para que os trechos silenciosos e sem fala nunca cheguem ao descodificador. Além disso, marcadores que ocupam um segmento inteiro, como [ Silence ] e glifos musicais isolados, são filtrados do resultado, enquanto as linhas que apenas contêm um aparte entre parênteses são mantidas, porque essas são fala real.
Para ficheiros longos, transcreve também por janelas e corta cada janela no ponto mais silencioso do áudio, para que a fronteira caia entre frases e não a meio de uma.
A ressalva honesta: isto torna o problema da frase repetida muito raro, não impossível. Qualquer ferramenta baseada em Whisper, incluindo a nossa, é um modelo de linguagem a fazer previsões, e um modelo que prevê pode enganar-se. Se estiver a transcrever algo em que a exatidão importa, leia a transcrição contra o áudio nas partes em que tenciona basear-se — o nosso guia de entrevistas explica uma forma rápida de o fazer.
A versão curta #
O ciclo é o Whisper a prever texto para áudio que não contém fala. A deteção de atividade vocal remove a causa ao nunca lhe mostrar esse áudio. Cortar o silêncio e filtrar marcadores ajudam se a sua ferramenta não tiver VAD. Um modelo maior não ajuda nada.
Obter o Offline Transcription
Transcreva áudio e vídeo inteiramente no seu Mac. Nada é enviado, não há conta e não há contador ao minuto.