Todo mundo que grava reunião, atendimento ou aula acumula um acervo que ninguém consegue consultar. Mil horas de áudio é um arquivo morto: existe, ocupa espaço e não responde nada. Transcrito, vira uma base pesquisável — e a partir daí dá para perguntar coisas a ela.
A boa notícia é que isso ficou barato de um jeito que ainda surpreende. A conta fechada deste texto, para mil horas em português, fica abaixo de R$ 100 de GPU. A parte difícil não é o custo — é montar o pipeline sem os três erros que multiplicam o tempo por cinco.
Escolha do modelo: grande nem sempre
A família Whisper tem tamanhos que vão de 39 milhões a 1,5 bilhão de parâmetros. Para português, a diferença entre eles é real, mas não é onde se imagina.
| Tamanho | VRAM | Velocidade relativa | Quando usar |
|---|---|---|---|
small | ~2 GB | ~12× o tempo real | Áudio limpo, um locutor, você só quer o assunto |
medium | ~5 GB | ~6× o tempo real | Bom equilíbrio para reunião com áudio decente |
large-v3 | ~10 GB | ~2,5× o tempo real | Padrão para português com sotaque, ruído ou jargão |
large-v3-turbo | ~6 GB | ~8× o tempo real | A escolha padrão hoje: quase a qualidade do large, muito mais rápido |
"12× o tempo real" quer dizer que uma hora de áudio sai em cinco minutos. Com large-v3-turbo numa RTX 4090, mil horas saem em algo perto de 2 horas e meia de máquina, se o pipeline estiver certo.
Números, siglas e nomes próprios são onde o Whisper mais erra em português — "CNPJ" vira "cnpg", "R$ 1.500" vira "mil e quinhentos reais" ou "1500". Se esses campos importam para você, não tente resolver no modelo de áudio: rode um passo de correção com um LLM sobre o texto final, que é barato e funciona bem melhor.
Os três erros que multiplicam o tempo
Erro 1: transcrever o silêncio
Gravação de reunião tem uma quantidade absurda de silêncio, respiração e ruído de fundo. O modelo processa tudo isso com o mesmo esforço que processa fala — e, pior, tende a alucinar nos trechos mudos, produzindo aquelas frases fantasma do tipo "Legendas pela comunidade" que aparecem do nada.
A solução é um detector de voz antes do modelo. Ele recorta só os pedaços com fala e joga o resto fora. Em áudio de reunião real, corta entre 20% e 40% do material — tempo e alucinação, de uma vez.
Erro 2: processar um arquivo de cada vez
Carregar o modelo na GPU leva mais tempo que transcrever um áudio de cinco minutos. Se o seu laço faz "carrega, transcreve, descarrega" para cada arquivo, você está pagando o carregamento mil vezes. Carregue uma vez, processe a lista inteira.
Erro 3: usar a biblioteca de referência em vez da rápida
A implementação original é a de referência, não a otimizada. A versão faster-whisper faz a mesma coisa de quatro a cinco vezes mais rápido e com menos VRAM, usando o mesmo modelo e produzindo praticamente o mesmo texto. Não há motivo para não usá-la em lote.
O pipeline
pip install faster-whisper
from faster_whisper import WhisperModel
from pathlib import Path
import json, time
modelo = WhisperModel(
"large-v3-turbo",
device="cuda",
compute_type="float16", # em placa mais antiga, use "int8_float16"
)
audios = sorted(Path("audios").glob("*.*"))
saida = Path("transcricoes"); saida.mkdir(exist_ok=True)
t0 = time.time()
for i, arq in enumerate(audios, 1):
destino = saida / f"{arq.stem}.json"
if destino.exists(): # retomável: já fez, pula
continue
segmentos, info = modelo.transcribe(
str(arq),
language="pt", # NÃO deixe detectar: erra e custa tempo
vad_filter=True, # corta o silêncio
vad_parameters=dict(min_silence_duration_ms=500),
beam_size=5,
condition_on_previous_text=False, # evita alucinação em cadeia
)
linhas = [{"inicio": s.start, "fim": s.end, "texto": s.text.strip()}
for s in segmentos]
destino.write_text(json.dumps({
"arquivo": arq.name,
"duracao": info.duration,
"segmentos": linhas,
}, ensure_ascii=False, indent=2), encoding="utf-8")
print(f"[{i}/{len(audios)}] {arq.name} — {info.duration/60:.1f} min")
print(f"total: {(time.time()-t0)/60:.1f} min")
language="pt": sem isso, o modelo tenta adivinhar o idioma nos primeiros 30 segundos. Em áudio que começa com ruído, ele às vezes decide que é espanhol e transcreve a hora inteira errado.
condition_on_previous_text=False: por padrão o modelo usa o texto anterior como contexto. Quando ele alucina uma vez, a alucinação vira contexto e contamina os segmentos seguintes. Desligar custa um pouco de coerência e evita um desastre que só se descobre lendo.
Separar quem fala
Transcrição sem identificar o falante serve para busca, mas não serve para ata de reunião nem para análise de atendimento. Separar os falantes (diarização) é um passo à parte, que roda sobre o mesmo áudio e depois se cruza com os tempos da transcrição.
É também o passo que mais consome tempo depois da transcrição em si — some algo entre 30% e 60% ao total. Só faça se você for realmente usar a informação.
Se a sua fonte for atendimento telefônico gravado em dois canais (um para cada lado), você tem a separação de graça: transcreva cada canal separadamente. É o caminho mais confiável e ninguém lembra dele.
A conta de mil horas
| Etapa | Tempo estimado | Placa | Custo |
|---|---|---|---|
| Transcrição com turbo + corte de silêncio | ~2,5 h | RTX 4090 (R$ 2,78/h) | R$ 7 |
Com large-v3 em vez do turbo | ~8 h | RTX 4090 | R$ 22 |
| Separação de falantes (opcional) | +1,5 h | mesma placa | +R$ 4 |
| Correção de números e siglas por LLM | ~3M tokens | API (R$ 0,49/1M entrada) | ~R$ 5 |
Preços de agosto de 2026, para uma GPU avulsa, sem interrupção programada. O catálogo muda: confira a vitrine antes de fechar a conta.
Somando tudo, com folga para erro e uma passada de revisão: menos de R$ 50 para mil horas. O custo dominante do projeto vai ser o armazenamento do áudio e o tempo de quem confere a saída, não a GPU.
Transcreva o acervo numa madrugada
Suba a máquina, rode a lista inteira e desligue. Você paga as horas que a fila levou — não um plano mensal.
Criar conta →Vale a pena ir mais rápido?
Numa placa maior, o Whisper não acelera proporcionalmente: o modelo é pequeno e o gargalo passa a ser o carregamento do áudio e a decodificação, não o cálculo. Trocar uma RTX 4090 por uma A100 costuma render menos de 40% de ganho por três vezes o preço — é uma das poucas cargas em que a placa cara não compensa.
Se você precisa de mais velocidade, o caminho é outro: rode dois ou três processos na mesma placa (o modelo turbo ocupa ~6 GB, cabem três numa de 24 GB) ou suba duas máquinas baratas e divida a lista de arquivos entre elas. Escala horizontal, aqui, é mais barata que escala vertical.
Depois da transcrição
O texto cru raramente é o produto. O que costuma dar valor:
- Resumo por reunião, com decisões e responsáveis — um pedido de LLM por arquivo, alguns centavos cada.
- Busca sobre o acervo, indexando os segmentos com o tempo — assim a busca devolve "minuto 14 da reunião de março", não só o arquivo.
- Alertas, procurando termos que importam (nome de concorrente, palavra de risco, promessa de prazo) em atendimento.
Guarde sempre os tempos de início e fim de cada segmento, como no exemplo. Quem salva só o texto corrido descobre depois que precisava voltar ao áudio e não consegue — e transcrever de novo é barato, mas re-alinhar é chato.
Conclusão
Transcrever acervo grande deixou de ser um projeto e virou uma tarefa de uma noite. Use large-v3-turbo com faster-whisper, ligue o corte de silêncio, fixe o idioma, desligue o condicionamento pelo texto anterior e torne o laço retomável.
O erro caro não é escolher a placa errada — é rodar mil horas com a configuração padrão, descobrir na terceira hora que metade transcreveu em espanhol e recomeçar. Teste em dez arquivos representativos, leia a saída com os próprios olhos e só então solte a fila inteira.
Continue: Whisper em 1 clique · trabalho em lote · busca sobre o resultado