Phase 06: Speech & Audio

Suspirar Arquitetura e ajuste fino

Whisper é um transformer de 30 segundos de janela encoder-decoder, treinado em 680k horas de pares de áudio-texto multilíngue deficiente supervisionado.

Type: Build

Languages: Python

Prerequisites: Phase 6 · 04 (ASR), Phase 5 · 10 (Attention), Phase 7 · 05 (Full Transformer)

Time: ~75 minutes

O problema

O Whisper, lançado pela OpenAI em setembro de 2022, foi o primeiro modelo ASR a ser enviado como um produto: paste áudio, obter texto, 99 idiomas, robusto ao ruído, funciona em um laptop. Em 2024, a OpenAI havia enviado variantes Large-v3 e Turbo; em 2026, o Whisper é a linha de base padrão para tudo, desde transcrição de podcast a assistentes de voz a subtítulos do YouTube.

Mas o Whisper não é um pipeline que você pode tratar como uma caixa negra para sempre.

  1. O que é que realmente está lá dentro.
  2. Como dar corretamente áudio em pedaços, em streaming ou em formato longo.
  3. Quando e como ajustar.

O conceito

!Whisper encoder-decoder, tasks, chunked inference, fine-tune

Architecture.Transformador padrão encoder-decoder.

  • Entrada: Espectroograma log-mel de 30 segundos, 80 mels, 10 ms hop → 3000 quadros.
  • Encoder: conv-downsample (passo 2) + NPara grande V3: 32 camadas, 1280-dim, 20 cabeças.
  • Descódigo: NBlocos de transformador com auto-atn + cross-attn para saída de codificador.
  • Resultado: Tokens BPE sobre um vocabulário de 51.865 tokens.

O Large-v3 tem parâmetros de 1.55B. Turbo usa um decodificador de 4 camadas (a partir de 32), cortando a latência 8x com um hit WER < 1%.

The prompt format.Whisper é um modelo de multitarefa dirigido por tokens especiais no prompt do decodificador:

<|startoftranscript|><|en|><|transcribe|><|notimestamps|> Hello world.<|endoftext|>
  • <|en|> tag de linguagem; força o comportamento tradução versus transcrição.
  • <|transcribe|>ou <|translate|> traduzir o resultado em inglês a partir de qualquer entrada de idioma, ou literalmente.
  • <|notimestamps|> Salte os timestamps de nível de palavra (mais rápido).

O prompt é o que permite que um modelo faça muitas tarefas.<|en|>- Não .<|fr|>E transcreve em francês.

30-second window.Tudo é fixado em 30 segundos. Clips mais longos precisam de troca; clips mais curtos são empolgados. Windows não são transmitidos nativamente é por isso que existem WhisperX, Whisper-Streaming e faster-whisper.

Log-mel normalization. (log_mel - mean) / stdO que é que é o que é o Whisper?whisper.audio.log_mel_spectrogram), não librosa.feature.melspectrogram- Não .

Variantes em 2026

VariantParamsLatency (A100)WER (LibriSpeech-clean)
Tiny39M1× realtime5.4%
Base74M1×4.1%
Small244M1×3.0%
Medium769M1×2.7%
Large-v31.55B2×1.8%
Large-v3-turbo809M8×1.58%
Whisper-Streaming (2024)1.55Bstreaming2.0%

Apontação fina

Fluxo de trabalho canônico em 2026:

  1. Recolher 10100 horas de áudio do domínio alvo com transcrições alinhadas.
  2. Corra .transformers.Seq2SeqTrainercomgenerate_with_loss- Voltar a ligar.
  3. Eficiência do parâmetro: LoRA em q_proj- Não .k_proj- Não .v_projde camadas de atenção reduz a memória da GPU 4× com custo de WER < 0,3.
  4. Congelhe o codificador se tiver < 10 horas. Apenas sintonize o decodificador.
  5. Use o próprio tokenizer e formato de prompt do Whisper; nunca troque de tokenizer.

Resultados comunitários: ajuste fino Medium em 20 horas de ditado médico reduz o WER de 12% para 4,5% no vocabulário médico.

Construí-lo

Passo 1: executar Whisper fora da caixa

pythonimport whisper
model = whisper.load_model("large-v3-turbo")
result = model.transcribe(
    "clip.wav",
    language="en",
    task="transcribe",
    temperature=0.0,
    condition_on_previous_text=False,  # prevents runaway repetition
)
print(result["text"])
for seg in result["segments"]:
    print(f"[{seg['start']:.2f}–{seg['end']:.2f}] {seg['text']}")

As principais falhas que deve sempre ser ignorada: temperature=0.0(exemplos de defeitos para 0,0 → 0,2 → 0,4 ... cadeia de retorno), condition_on_previous_text=False(preventa o problema da alucinação em cascata), e no_speech_threshold=0.6(Detecção do silêncio).

Passo 2: forma longa em pedaços

python# whisperx is the 2026 reference for long-form with word-level timestamps
import whisperx
model = whisperx.load_model("large-v3-turbo", device="cuda", compute_type="float16")
segments = model.transcribe("1hour.mp3", batch_size=16, chunk_size=30)

O WhisperX adiciona (1) Silero VAD gating, (2) alinhamento de nível de palavras através de wav2vec 2.0, (3) diarização através de pyannote.audioO cavalo de trabalho de 2026 para transcrição de produção.

Passo 3: sintonização com LoRA

pythonfrom transformers import WhisperForConditionalGeneration, WhisperProcessor
from peft import LoraConfig, get_peft_model

model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large-v3-turbo")
lora = LoraConfig(
    r=16, lora_alpha=32, target_modules=["q_proj", "v_proj"],
    lora_dropout=0.1, bias="none", task_type="SEQ_2_SEQ_LM",
)
model = get_peft_model(model, lora)
# model.print_trainable_parameters()  -> ~3M trainable / 809M total

Depois, o ciclo padrão do treinador, um ponto de controlo a cada 1000 passos, e uma avaliação com WER.

Passo 4: inspecionar o que cada camada aprende

python# Grab cross-attention weights during decode to see what the decoder attends to.
with torch.inference_mode():
    out = model.generate(
        input_features=features,
        return_dict_in_generate=True,
        output_attentions=True,
    )
# out.cross_attentions: layer × head × step × src_len

Visualize com um heatmap você verá alinhamento diagonal como os passos do decodificador escanear através de quadros de codificador.

Usá-lo

A pilha de 2026:

SituationPick
General English, offlineLarge-v3-turbo via whisperx
Mobile / edgeWhisper-Tiny quantized (int8) or Moonshine
Multilingual long-formLarge-v3 via whisperx + diarization
Low-resource languageFine-tune Medium or Turbo with LoRA
Streaming (2 s latency)Whisper-Streaming or Parakeet-TDT
Word-level timestampsWhisperX (forced alignment via wav2vec 2.0)

faster-whisper(CTranslate2 backend) é o tempo de execução de inferência CPU+GPU mais rápido em 2026 4x mais rápido do que a baunilha com saída idêntica.

Encurralagens que ainda se lançam em 2026

  • Hallucinated text on silence.O sussurro treinado em legendas inclui "Obrigado por assistir!", "Subscreva!", letras de canções.
  • condition_on_previous_text cascade.Uma alucinação contamina as janelas subsequentes.FalseA menos que precise de fluência em pedaços.
  • Short-clip padding.Um clip de 2 segundos com 30 segundos pode alucinar no silêncio.pad=Falseou VAD-gate.
  • Wrong mel stats.Usar os mels da librosa em vez do Whisper produz uma saída quase aleatória.whisper.audio.log_mel_spectrogram- Não .

Envia-o

Salva comooutputs/skill-whisper-tuner.mdDesenhar um fluxo de sintonia ou inferência Whisper para um determinado domínio.

Exercícios

  1. Easy.Corra .code/main.pyEle tokeniza um pedido de estilo Whisper, calcula os orçamentos de forma decodificada e imprime o cronograma de pedaços para um clipe de 10 minutos.
  2. Medium.Instalaçãofaster-whisper, transcrever um podcast de 10 minutos, comparar WER com uma transcrição humana.language="auto"contra forçadolanguage="en"- Não .
  3. Hard.Usando HF datasets, escolher uma língua que o Whisper luta com (por exemplo, Urdu), sintonizar o Médio com o LoRA por 2 épocas em 2 horas, e relatar o delta WER.

Termos-chave

TermWhat people sayWhat it actually means
30-sec windowWhisper's limitHard input cap; chunk longer audio.
SOTStart-of-transcript<|startoftranscript|> kicks off the decoder prompt.
Timestamps tokenTemporal alignmentEvery 0.02 s offset is a special token in the 51k vocab.
TurboThe fast variant4-decoder layers, 8× faster, <1% WER regression.
WhisperXThe long-form wrapperVAD + Whisper + wav2vec alignment + diarization.
LoRA fine-tuneEfficient tuningAdd low-rank adapters to attention; train ~0.3% of params.
HallucinationThe silent failureWhisper produces fluent English from noise/silence.

Mais leitura

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.