Phase 07 - Lesson 10

Transformers de Áudio — Arquitetura Whisper

This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.

O áudio é uma imagem de frequência ao longo do tempo. O Whisper é um ViT que consome espectrogramas mel e fala de volta.

Tipo: Aprender Linguagens: Python Pré-requisitos: Fase 7 · 05 (Full Transformer), Fase 7 · 08 (Encoder-Decoder), Fase 7 · 09 (ViT) Tempo: ~45 minutos

O Problema

Antes do Whisper (OpenAI, Radford et al. 2022), o estado da arte em reconhecimento automático de fala (ASR) significava wav2vec 2.0 e HuBERT — extratores de características auto-supervisionados combinados com um cabeçalho ajustado (fine-tuned head). Alta qualidade, pipelines de dados caros, sensíveis ao domínio. O reconhecimento de fala multilíngue exigia modelos separados por família de línguas.

O Whisper fez três apostas:

  1. Treinar em tudo. 680.000 horas de áudio com rotulação fraca (weakly-labeled) coletadas da internet em 97 idiomas. Sem corpus acadêmico limpo. Sem rótulos de fonemas.
  2. Modelo único multitarefa. Um decodificador treinado conjuntamente em transcrição, tradução, detecção de atividade de voz, identificação de idioma e marcação de tempo (timestamping) via tokens de tarefa.
  3. Transformer codificador-decodificador padrão. O codificador consome espectrogramas log-mel. O decodificador produz tokens de texto de forma autorregressiva. Sem vocoder, sem CTC, sem HMM.

O resultado: o Whisper large-v3 é robusto em diferentes sotaques, ruídos e idiomas que possuem zero dados rotulados limpos. Ele é o front-end de fala padrão para todos os assistentes de voz de código aberto e a maioria dos comerciais em 2026.

O Conceito

Pipeline do Whisper: áudio → mel → codificador → decodificador → texto

Passo 1 — reamostragem + janelamento

Áudio a 16 kHz. Cortar/preencher para 30 segundos. Calcular o espectrograma log-mel: 80 faixas de mel (mel bins), stride de 10 ms → ~3.000 frames × 80 características. Esta é a "imagem de entrada" que o Whisper vê.

Passo 2 — tronco convolucional

Duas camadas Conv1D com kernel 3 e stride 2 reduzem os 3.000 frames para 1.500. Isso reduz o comprimento da sequência pela metade sem adicionar muitos parâmetros.

Passo 3 — codificador

Um codificador transformer de 24 camadas (para a versão large) sobre 1.500 passos de tempo. Codificação posicional senoidal, auto-atenção, FFN com GELU. Produz 1.500 × 1.280 estados ocultos (hidden states).

Passo 4 — decodificador

Um decodificador transformer de 24 camadas. Ele produz tokens de forma autorregressiva a partir de um vocabulário BPE que é um superconjunto do vocabulário do GPT-2 com alguns tokens especiais específicos para áudio.

Passo 5 — tokens de tarefa

O prompt do decodificador começa com tokens de controle que dizem ao modelo o que fazer:

<|startoftranscript|>  <|en|>  <|transcribe|>  <|0.00|>

ou

<|startoftranscript|>  <|fr|>  <|translate|>   <|0.00|>

O modelo foi treinado sob essa convenção. Você controla a tarefa pelo prefixo. O equivalente em 2026 ao ajuste de instruções (instruction-tuning), mas aplicado à fala.

Passo 6 — saída

Busca em feixe (beam search com largura 5) com um limiar de log-probabilidade. As marcações de tempo (timestamps) são previstas a cada 0,02 segundos de áudio quando o token <|notimestamps|> está ausente.

Tamanhos do Whisper

Modelo Parâmetros Camadas d_model Cabeças VRAM (fp16)
Tiny 39M 4 384 6 ~1 GB
Base 74M 6 512 8 ~1 GB
Small 244M 12 768 12 ~2 GB
Medium 769M 24 1024 16 ~5 GB
Large 1550M 32 1280 20 ~10 GB
Large-v3 1550M 32 1280 20 ~10 GB
Large-v3-turbo 809M 32 1280 20 ~6 GB (decodificador de 4 camadas)

O Large-v3-turbo (2024) reduziu o decodificador de 32 para 4 camadas. Decodificação 8× mais rápida com uma regressão de <1 ponto de WER (Word Error Rate). Essa liberação de velocidade de decodificação é o motivo pelo qual o Whisper-turbo é o padrão para agentes de voz em tempo real em 2026.

O que o Whisper não faz

  • Sem diarização (identificar quem está falando). Combine com o pyannote para isso.
  • Sem suporte nativo a streaming em tempo real — a janela de 30 segundos é fixa. Wrappers modernos (faster-whisper, WhisperX) adicionam streaming via VAD + sobreposição (overlap).
  • Sem contexto de longo formato além de 30 s sem divisão externa em partes (chunking). Funciona bem na prática porque a fala humana raramente necessita de contexto de longo alcance para transcrição.

O cenário em 2026

Tarefa Modelo Notas
ASR em Inglês Whisper-turbo, Moonshine Moonshine é 4× mais rápido na borda (edge)
ASR Multilíngue Whisper-large-v3 97 idiomas
ASR em Streaming faster-whisper + VAD Metas de latência de 150 ms são alcançáveis
TTS Piper, XTTS-v2, Kokoro Padrão codificador-decodificador, mas no formato do Whisper
Áudio + linguagem AudioLM, SeamlessM4T Tokens de texto + tokens de áudio em um único transformer

Desenvolva

Consulte code/main.py. Nós não treinamos o Whisper — nós desenvolvemos o pipeline do espectrograma log-mel + formatador de prompt de tokens de tarefa. Essas são as partes com as quais você realmente interage em produção.

Passo 1: sintetizar áudio

Gerar uma onda senoidal de 1 segundo a 440 Hz amostrada a 16 kHz. 16.000 amostras.

Passo 2: espectrograma log-mel (simplificado)

O espectrograma mel completo necessita de FFT. Nós fazemos uma versão simplificada com janelamento + energia por frame que demonstra o pipeline sem exigir librosa:

def frame_signal(x, frame_size=400, hop=160):
    frames = []
    for start in range(0, len(x) - frame_size + 1, hop):
        frames.append(x[start:start + frame_size])
    return frames

Frame = 25 ms, hop = 10 ms. Corresponde ao janelamento do Whisper. A energia por frame substitui as faixas de mel (mel bins) para fins pedagógicos.

Passo 3: preencher para 30 s

O Whisper sempre processa blocos de 30 segundos. Preencha (ou corte) o espectrograma para 3.000 frames.

Passo 4: construir os tokens do prompt

def whisper_prompt(lang="en", task="transcribe", timestamps=True):
    tokens = ["<|startoftranscript|>", f"<|{lang}|>", f"<|{task}|>"]
    if not timestamps:
        tokens.append("<|notimestamps|>")
    return tokens

Essa é toda a superfície de controle de tarefas. Um prefixo de 4 tokens.

Utilize

import whisper
model = whisper.load_model("large-v3-turbo")
result = model.transcribe("meeting.wav", language="en", task="transcribe")
print(result["text"])
print(result["segments"][0]["start"], result["segments"][0]["end"])

Mais rápido, compatível com a OpenAI:

from faster_whisper import WhisperModel
model = WhisperModel("large-v3-turbo", compute_type="int8_float16")
segments, info = model.transcribe("meeting.wav", vad_filter=True)
for s in segments:
    print(f"{s.start:.2f} - {s.end:.2f}: {s.text}")

Quando escolher o Whisper em 2026:

  • ASR multilíngue com um único modelo.
  • Transcrição robusta de áudios ruidosos e diversos.
  • Pesquisa / protótipo de ASR — o ponto de partida mais rápido.

Quando escolher outra opção:

  • Streaming com latência ultrabaixa na borda (edge) — o Moonshine supera o Whisper com qualidade equivalente.
  • IA conversacional em tempo real que necessita de <200 ms — ASR de streaming dedicada.
  • Diarização de locutor — o Whisper não faz isso; adicione o pyannote.

Coloque em Produção

Consulte outputs/skill-asr-configurator.md. A skill escolhe um modelo de ASR, parâmetros de decodificação e pipeline de pré-processamento para uma nova aplicação de fala.

Exercícios

  1. Fácil. Execute code/main.py. Confirme que a contagem de frames para um sinal de 1 segundo a 16 kHz com salto (hop) de 10 ms é de ~100 frames. Para 30 segundos: ~3.000 frames.
  2. Médio. Construa o espectrograma log-mel completo usando numpy.fft. Verifique se as 80 faixas de mel correspondem a librosa.feature.melspectrogram(n_mels=80) dentro do erro numérico.
  3. Difícil. Implemente a inferência por streaming: divida o áudio em janelas de 10 s com sobreposição de 2 s, execute o Whisper em cada bloco e mescle as transcrições. Meça a taxa de erro de palavras (WER) em comparação com uma única passagem em uma amostra de podcast de 5 minutos.

Termos-Chave

Termo O que as pessoas dizem O que realmente significa
Espectrograma mel "Imagem de áudio" Representação 2D: faixas de frequência em um eixo, frames de tempo no outro; energia em escala logarítmica por célula.
Log-mel "O que o Whisper vê" Espectrograma mel passado pelo logaritmo; aproxima-se da percepção humana de volume.
Frame "Uma fatia de tempo" Uma janela de amostras de 25 ms; sobreposta com stride de 10 ms.
Token de tarefa "Prefixo de prompt para fala" Tokens especiais como `<
Detecção de atividade de voz (VAD) "Encontrar a fala" Filtro que remove o silêncio antes do ASR; reduz os custos drasticamente.
CTC "Connectionist Temporal Classification" Perda clássica de ASR para treinamento livre de alinhamento; o Whisper NÃO a utiliza.
Whisper-turbo "Decodificador pequeno, codificador completo" Codificador do large-v3 + decodificador de 4 camadas; decodificação 8× mais rápida.
Faster-whisper "O wrapper de produção" Reimplementação em CTranslate2; quantização int8; 4× mais rápido que a referência da OpenAI.

Leituras Adicionais

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).