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.

TamanhoVRAMVelocidade relativaQuando usar
small~2 GB~12× o tempo realÁudio limpo, um locutor, você só quer o assunto
medium~5 GB~6× o tempo realBom equilíbrio para reunião com áudio decente
large-v3~10 GB~2,5× o tempo realPadrão para português com sotaque, ruído ou jargão
large-v3-turbo~6 GB~8× o tempo realA 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.

💡 Português tem uma peculiaridade

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")
⚠️ Os dois parâmetros que quase ninguém ajusta — e deveria

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

EtapaTempo estimadoPlacaCusto
Transcrição com turbo + corte de silêncio~2,5 hRTX 4090 (R$ 2,78/h)R$ 7
Com large-v3 em vez do turbo~8 hRTX 4090R$ 22
Separação de falantes (opcional)+1,5 hmesma placa+R$ 4
Correção de números e siglas por LLM~3M tokensAPI (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:

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