Precisão do Whisper: como melhorar a qualidade da transcrição

Precisão do Whisper: como melhorar a qualidade da transcrição

Eric King

Eric King

Author


Precisão do Whisper: como melhorar a qualidade da transcrição

OpenAI Whisper já está entre os modelos de reconhecimento de fala open source mais precisos, mas várias estratégias permitem maximizar ainda mais a qualidade da transcrição. Este guia reúne dicas práticas, exemplos de código e boas práticas para melhorar a precisão do Whisper nos seus casos de uso.
Ideal para:
  • Programadores que otimizam a precisão de transcrição com Whisper
  • Criadores que transcrevem podcasts e vídeos
  • Investigadores que trabalham com áudio
  • Quem procura dicas de precisão do Whisper

O que influencia a precisão do Whisper

Antes de otimizar, convém saber o que importa:
  • Qualidade do áudio (o mais importante)
  • Tamanho do modelo (escolha)
  • Deteção de idioma
  • Pré-processamento de áudio
  • Parâmetros de configuração
  • Duração do áudio e segmentação

Dica 1: Escolha o tamanho de modelo certo

O Whisper oferece cinco tamanhos que equilibram velocidade e precisão de forma diferente:
import whisper

# Model sizes from fastest to most accurate:
# tiny, base, small, medium, large

# For maximum accuracy, use medium or large
model = whisper.load_model("medium")  # Best balance
# or
model = whisper.load_model("large")  # Maximum accuracy
Guia de escolha do modelo:
ModeloPrecisãoVelocidadeUse quando
tiny⭐⭐⭐⭐⭐⭐⭐Testes rápidos, áudio simples
base⭐⭐⭐⭐⭐⭐⭐Uso geral, equilibrado
small⭐⭐⭐⭐⭐⭐⭐Boa precisão, velocidade razoável
medium⭐⭐⭐⭐⭐⭐⭐Alta precisão necessária
large⭐⭐⭐⭐⭐⭐Máxima precisão, áudio ruidoso
Exemplo de código:
import whisper

def transcribe_with_optimal_model(audio_path, prioritize_accuracy=True):
    """
    Select model based on accuracy vs speed priority.
    
    Args:
        audio_path: Path to audio file
        prioritize_accuracy: True for accuracy, False for speed
    """
    if prioritize_accuracy:
        model_size = "medium"  # or "large" for best accuracy
    else:
        model_size = "base"  # or "small" for balanced
    
    model = whisper.load_model(model_size)
    result = model.transcribe(audio_path)
    
    return result

# For critical transcriptions
result = transcribe_with_optimal_model("important_meeting.mp3", prioritize_accuracy=True)
Conclusão: Use medium ou large quando a precisão for crítica. O custo em velocidade costuma valer a pena para conteúdo importante.

Dica 2: Especifique o idioma quando souber

O Whisper pode detetar o idioma automaticamente, mas indicá-lo explicitamente melhora a precisão:
import whisper

model = whisper.load_model("base")

# Auto-detect (less accurate)
result_auto = model.transcribe("audio.mp3")

# Specify language (more accurate)
result_en = model.transcribe("audio.mp3", language="en")
result_zh = model.transcribe("audio.mp3", language="zh")
result_es = model.transcribe("audio.mp3", language="es")
Por que ajuda:
  • Menos erros na deteção de idioma
  • Melhores resultados para falantes multilingues
  • Processamento mais rápido (salta a deteção)
  • Melhor tratamento de sotaques e dialetos
Exemplo com deteção de idioma:
import whisper
import langdetect

def transcribe_with_language_detection(audio_path, model_size="base"):
    """
    Detect language first, then transcribe with explicit language.
    """
    model = whisper.load_model(model_size)
    
    # Quick language detection
    result_quick = model.transcribe(audio_path, language=None)
    detected_lang = result_quick["language"]
    
    # Re-transcribe with detected language for better accuracy
    result = model.transcribe(audio_path, language=detected_lang)
    
    return result

result = transcribe_with_language_detection("audio.mp3")

Dica 3: Pré-processe o áudio antes de transcrever

O pré-processamento pode melhorar bastante a precisão do Whisper:
import whisper
import numpy as np
from scipy.io import wavfile
from scipy import signal

def preprocess_audio(audio_path, output_path):
    """
    Preprocess audio to improve transcription accuracy.
    """
    # Read audio file
    sample_rate, audio = wavfile.read(audio_path)
    
    # Normalize audio (scale to [-1, 1])
    if audio.dtype == np.int16:
        audio = audio.astype(np.float32) / 32768.0
    elif audio.dtype == np.int32:
        audio = audio.astype(np.float32) / 2147483648.0
    
    # Remove DC offset
    audio = audio - np.mean(audio)
    
    # Normalize volume
    max_val = np.max(np.abs(audio))
    if max_val > 0:
        audio = audio / max_val * 0.95  # Leave headroom
    
    # Resample to 16kHz (Whisper's optimal sample rate)
    if sample_rate != 16000:
        num_samples = int(len(audio) * 16000 / sample_rate)
        audio = signal.resample(audio, num_samples)
        sample_rate = 16000
    
    # Save preprocessed audio
    wavfile.write(output_path, sample_rate, (audio * 32767).astype(np.int16))
    
    return output_path

# Usage
preprocessed = preprocess_audio("raw_audio.wav", "preprocessed.wav")
model = whisper.load_model("base")
result = model.transcribe(preprocessed)
Passos de pré-processamento:
  1. Normalizar níveis – volume uniforme
  2. Remover offset DC – eliminar viés constante
  3. Reamostrar a 16 kHz – taxa ideal para o Whisper
  4. Remover silêncio – focar na fala
  5. Reduzir ruído – limpar o fundo

Dica 4: Definições de temperatura para melhores resultados

O parâmetro temperature controla a aleatoriedade. Valores mais baixos podem melhorar a precisão:
import whisper

model = whisper.load_model("base")

# Default temperature (0.0)
result_default = model.transcribe("audio.mp3")

# Lower temperature for more deterministic results
result_low_temp = model.transcribe(
    "audio.mp3",
    temperature=0.0,  # Most deterministic
    best_of=5,  # Try multiple decodings, pick best
    beam_size=5  # Beam search size
)
Definições de temperatura:
  • temperature=0.0: Mais determinístico, melhor precisão
  • temperature=0.2: Pouca aleatoriedade, bom equilíbrio
  • temperature=0.6: Predefinido, equilibrado
  • Valores altos: mais “criativo”, menos preciso
Boa prática:
def transcribe_with_optimal_settings(audio_path, model_size="base"):
    """
    Use optimal settings for maximum accuracy.
    """
    model = whisper.load_model(model_size)
    
    result = model.transcribe(
        audio_path,
        temperature=0.0,  # Most deterministic
        best_of=5,  # Try 5 decodings, pick best
        beam_size=5,  # Beam search
        patience=1.0,  # Patience for beam search
        condition_on_previous_text=True,  # Use context
        initial_prompt="This is a conversation about technology."  # Context hint
    )
    
    return result

Dica 5: Prompt inicial para contexto

Dar contexto sobre o conteúdo melhora a precisão:
import whisper

model = whisper.load_model("base")

# Without context
result_basic = model.transcribe("meeting.mp3")

# With context (much better accuracy)
result_context = model.transcribe(
    "meeting.mp3",
    initial_prompt="This is a business meeting discussing project timelines and deliverables."
)

# For technical content
result_tech = model.transcribe(
    "lecture.mp3",
    initial_prompt="This is a computer science lecture about machine learning and neural networks."
)
Quando usar prompts iniciais:
  • Conteúdo técnico: incluir termos do domínio
  • Nomes e lugares: mencionar nomes próprios importantes
  • Sotaques: descrever sotaque ou dialeto
  • Contexto: descrever o cenário ou o tema
Exemplo:
def transcribe_with_context(audio_path, context_description):
    """
    Transcribe with context for better accuracy.
    """
    model = whisper.load_model("medium")
    
    result = model.transcribe(
        audio_path,
        initial_prompt=context_description,
        language="en"
    )
    
    return result

# Example usage
result = transcribe_with_context(
    "interview.mp3",
    "This is an interview with Dr. Sarah Johnson about medical research. "
    "The conversation includes technical medical terminology."
)

Dica 6: Trate ficheiros de áudio longos corretamente

Ficheiros muito longos podem reduzir a precisão. Como proceder:
import whisper
from pydub import AudioSegment
import os

def transcribe_long_audio(audio_path, model_size="base", chunk_length_minutes=30):
    """
    Transcribe long audio by splitting into optimal chunks.
    """
    model = whisper.load_model(model_size)
    
    # Load audio
    audio = AudioSegment.from_file(audio_path)
    chunk_length_ms = chunk_length_minutes * 60 * 1000
    
    # Split into chunks
    chunks = []
    for i in range(0, len(audio), chunk_length_ms):
        chunks.append(audio[i:i + chunk_length_ms])
    
    # Transcribe each chunk
    full_text = []
    all_segments = []
    
    for i, chunk in enumerate(chunks):
        chunk_path = f"temp_chunk_{i}.wav"
        chunk.export(chunk_path, format="wav")
        
        print(f"Transcribing chunk {i+1}/{len(chunks)}")
        result = model.transcribe(chunk_path)
        
        # Adjust timestamps for chunk offset
        offset = i * chunk_length_ms / 1000.0
        for segment in result["segments"]:
            segment["start"] += offset
            segment["end"] += offset
            all_segments.append(segment)
        
        full_text.append(result["text"])
        
        # Clean up
        os.remove(chunk_path)
    
    # Combine results
    combined_result = {
        "text": " ".join(full_text),
        "segments": all_segments,
        "language": result["language"]
    }
    
    return combined_result

# Usage
result = transcribe_long_audio("long_podcast.mp3", model_size="medium", chunk_length_minutes=30)
Boas práticas para áudio longo:
  • Dividir em blocos de 20–30 minutos
  • Usar o mesmo tamanho de modelo em todos os blocos
  • Manter contexto entre blocos
  • Fundir segmentos com marcas temporais corretas

Dica 7: Otimize para áudio ruidoso

O Whisper lida bem com ruído, mas pode melhorar ainda:
import whisper
import noisereduce as nr
import soundfile as sf
import numpy as np

def transcribe_noisy_audio(audio_path, model_size="medium"):
    """
    Reduce noise before transcription for better accuracy.
    """
    # Load audio
    audio, sample_rate = sf.read(audio_path)
    
    # Reduce noise
    reduced_noise = nr.reduce_noise(
        y=audio,
        sr=sample_rate,
        stationary=False,  # For non-stationary noise
        prop_decrease=0.8  # Reduce noise by 80%
    )
    
    # Save cleaned audio
    cleaned_path = "cleaned_audio.wav"
    sf.write(cleaned_path, reduced_noise, sample_rate)
    
    # Transcribe with larger model (better for noisy audio)
    model = whisper.load_model(model_size)
    result = model.transcribe(cleaned_path)
    
    # Clean up
    os.remove(cleaned_path)
    
    return result

# Usage
result = transcribe_noisy_audio("noisy_recording.mp3", model_size="medium")
Com áudio ruidoso:
  • Use modelos medium ou large
  • Pré-processe com redução de ruído
  • Aumente best_of
  • Forneça contexto sobre as condições de ruído

Dica 8: Marcas temporais por palavra para mais controlo

Marcas ao nível da palavra permitem controlo mais fino:
import whisper

model = whisper.load_model("base")

# Get word timestamps
result = model.transcribe(
    "audio.mp3",
    word_timestamps=True  # Enable word-level timestamps
)

# Access word timestamps
for segment in result["segments"]:
    print(f"Segment: {segment['text']}")
    print(f"Start: {segment['start']:.2f}s, End: {segment['end']:.2f}s")
    
    if "words" in segment:
        for word in segment["words"]:
            print(f"  Word: {word['word']} ({word['start']:.2f}s - {word['end']:.2f}s)")
Casos de uso:
  • Legendas: sincronização precisa palavra a palavra
  • Correção de erros: localizar palavras problemáticas
  • Pesquisa: encontrar palavras na transcrição
  • Análise da fala: padrões de fala

Dica 9: Combine várias decodificações

Com best_of são experimentadas várias decodificações e escolhe-se a melhor:
import whisper

model = whisper.load_model("base")

# Single decoding (default)
result_single = model.transcribe("audio.mp3")

# Multiple decodings, pick best (more accurate)
result_best = model.transcribe(
    "audio.mp3",
    best_of=5,  # Try 5 decodings
    temperature=(0.0, 0.2, 0.4, 0.6, 0.8)  # Different temperatures
)
Compromissos:
  • Precisão: maior com várias decodificações
  • Velocidade: mais lenta (5× com best_of=5)
  • Quando: precisão crítica, velocidade secundária

Dica 10: Pós-processe as transcrições

O pós-processamento corrige erros comuns do Whisper:
import re
import whisper

def post_process_transcript(text):
    """
    Fix common transcription errors.
    """
    # Fix common contractions
    text = re.sub(r"\b(\w+) '(\w+)\b", r"\1'\2", text)  # Fix spacing in contractions
    
    # Fix common homophones (add your own)
    replacements = {
        "there": "their",  # Context-dependent
        "its": "it's",  # Context-dependent
        # Add more based on your domain
    }
    
    # Capitalize sentences
    sentences = re.split(r'([.!?]\s+)', text)
    capitalized = []
    for i, sentence in enumerate(sentences):
        if sentence.strip():
            capitalized.append(sentence[0].upper() + sentence[1:] if len(sentence) > 1 else sentence.upper())
        else:
            capitalized.append(sentence)
    
    return "".join(capitalized)

# Usage
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
processed_text = post_process_transcript(result["text"])

Exemplo completo: otimização de precisão pronta para produção

Exemplo que combina várias dicas de precisão:
import whisper
import os
from pathlib import Path

def transcribe_with_maximum_accuracy(
    audio_path,
    model_size="medium",
    language=None,
    context_prompt=None,
    output_format="txt"
):
    """
    Transcribe audio with maximum accuracy using best practices.
    
    Args:
        audio_path: Path to audio file
        model_size: Whisper model size (medium or large recommended)
        language: Language code (None for auto-detect)
        context_prompt: Initial prompt for context
        output_format: Output format (txt, json, srt)
    """
    # Load model (medium or large for best accuracy)
    print(f"Loading Whisper model: {model_size}")
    model = whisper.load_model(model_size)
    
    # Prepare transcription parameters
    transcribe_kwargs = {
        "temperature": 0.0,  # Most deterministic
        "best_of": 5,  # Try multiple decodings
        "beam_size": 5,  # Beam search
        "patience": 1.0,
        "condition_on_previous_text": True,
        "word_timestamps": True,  # Get word-level timestamps
    }
    
    # Add language if specified
    if language:
        transcribe_kwargs["language"] = language
    
    # Add context prompt if provided
    if context_prompt:
        transcribe_kwargs["initial_prompt"] = context_prompt
    
    # Transcribe
    print(f"Transcribing: {audio_path}")
    result = model.transcribe(audio_path, **transcribe_kwargs)
    
    # Post-process
    result["text"] = post_process_transcript(result["text"])
    
    # Save result
    base_name = Path(audio_path).stem
    output_path = f"{base_name}_transcript.{output_format}"
    
    if output_format == "txt":
        with open(output_path, "w", encoding="utf-8") as f:
            f.write(result["text"])
    elif output_format == "json":
        import json
        with open(output_path, "w", encoding="utf-8") as f:
            json.dump(result, f, indent=2, ensure_ascii=False)
    
    print(f"✓ Transcription saved: {output_path}")
    print(f"  Language: {result['language']}")
    print(f"  Duration: {result['segments'][-1]['end']:.2f}s")
    
    return result

# Example usage
result = transcribe_with_maximum_accuracy(
    audio_path="important_meeting.mp3",
    model_size="medium",
    language="en",
    context_prompt="This is a business meeting discussing quarterly results and project updates.",
    output_format="txt"
)

Comparação de precisão: antes e depois da otimização

Efeitos típicos da otimização:
OtimizaçãoMelhoria de precisãoImpacto na velocidade
Tamanho do modelo (base → medium)+15–20%−50%
Especificação de idioma+5–10%+10% (mais rápido)
Prompt inicial+5–15%Sem impacto
Temperature=0.0+2–5%Sem impacto
best_of=5+3–8%−80% (5× mais lento)
Pré-processamento de áudio+10–20%Mínimo
Combinadas, as melhorias podem aumentar a precisão em 30–50% face às predefinições.

Resumo de boas práticas

Para máxima precisão:

  1. ✅ Modelo medium ou large
  2. ✅ Idioma explícito
  3. ✅ Contexto com initial_prompt
  4. temperature=0.0 para resultados determinísticos
  5. word_timestamps para saída detalhada
  6. ✅ Pré-processar áudio ruidoso
  7. ✅ Dividir ficheiros longos
  8. best_of=5 para conteúdo crítico

Para equilíbrio velocidade/precisão:

  1. ✅ Modelo small ou base
  2. ✅ Deteção automática de idioma
  3. ✅ Temperatura predefinida
  4. ✅ Sem best_of
  5. ✅ Ficheiros com pré-processamento mínimo

Erros comuns

❌ Modelo tiny para conteúdo importante

Correção: Pelo menos base, de preferência small ou medium

❌ Não especificar o idioma

Correção: Especifique sempre que souber

❌ Ignorar o contexto

Correção: Use initial_prompt para conteúdo especializado

❌ Predefinições com muito ruído

Correção: Modelos maiores e pré-processamento

❌ Ficheiros muito longos de uma vez

Correção: Segmentos de 20–30 minutos

Resolução de problemas de precisão

Problema: Baixa precisão em termos técnicos

Solução:
result = model.transcribe(
    "technical_audio.mp3",
    initial_prompt="This audio contains technical terminology related to machine learning, neural networks, and deep learning."
)

Problema: Má precisão com sotaques

Solução:
# Use larger model
model = whisper.load_model("medium")

# Provide accent context
result = model.transcribe(
    "accented_audio.mp3",
    initial_prompt="This speaker has a British accent.",
    language="en"
)

Problema: Erros em nomes próprios

Solução:
# Include names in initial prompt
result = model.transcribe(
    "interview.mp3",
    initial_prompt="This interview features Dr. Sarah Johnson and Professor Michael Chen discussing research."
)

Conclusão

Melhorar a precisão do Whisper é fazer as escolhas certas:
  • Modelo: medium ou large para conteúdo crítico
  • Configuração: temperatura e decodificação ótimas
  • Contexto: informação de domínio
  • Pré-processamento: áudio limpo antes de transcrever
  • Pós-processamento: corrigir erros comuns automaticamente
Pontos-chave:
  1. O tamanho do modelo tem o maior impacto
  2. Especificar o idioma melhora muito os resultados
  3. Prompts de contexto ajudam em conteúdo especializado
  4. Várias decodificações (best_of) aumentam a precisão mas abrandam
  5. A qualidade do áudio continua a ser o fator principal
Com estas dicas pode alcançar qualidade de transcrição comparável ou superior a serviços comerciais, com controlo total dos dados e do fluxo de trabalho.

Pronto para melhorar a precisão do Whisper? Passe a um modelo maior e especifique o idioma — verá melhorias de imediato!

Experimente grátis agora

Experimente agora o nosso serviço de voz, áudio e vídeo com IA. Você terá não só transcrição de voz para texto de alta precisão, tradução multilíngue e diarização inteligente de falantes, como também geração automática de legendas para vídeos, edição inteligente de conteúdo audiovisual e análise sincronizada de áudio e imagem. Cobrimos cenários como atas de reunião, criação de vídeos curtos e produção de podcasts — comece hoje mesmo o seu teste gratuito!

Som para Texto OnlineSom para Texto GratuitoConversor de Som para TextoSom para Texto MP3Som para Texto WAVSom para Texto com Carimbos de TempoSom em texto para reuniõesSound to Text Multi LanguageSom para Texto LegendasConverter WAV para textoVoz para TextoVoz para Texto OnlineFala para TextoConverter MP3 para TextoConverter gravação de voz em textoDigitação por Voz OnlineVoz para Texto com Carimbos de TempoVoz para Texto em Tempo RealVoz para Texto para Áudio LongoVoz para Texto para VídeoVoz para Texto para YouTubeVoz para Texto para Edição de VídeoVoz para Texto para LegendasVoz para Texto para PodcastsVoz para Texto para EntrevistasÁudio de Entrevista para TextoVoz para Texto para GravaçõesVoz para Texto para ReuniõesVoz para Texto para AulasVoz para Texto para NotasVoz para Texto MultilíngueVoz para Texto PrecisoVoz para Texto RápidoAlternativa Premiere Pro Voz para TextoAlternativa DaVinci Voz para TextoAlternativa VEED Voz para TextoAlternativa InVideo Voz para TextoAlternativa Otter.ai Voz para TextoAlternativa Descript Voz para TextoAlternativa Trint Voz para TextoAlternativa Rev Voz para TextoAlternativa Sonix Voz para TextoAlternativa Happy Scribe Voz para TextoAlternativa Zoom Voz para TextoAlternativa Google Meet Voz para TextoAlternativa Microsoft Teams Voz para TextoAlternativa Fireflies.ai Voz para TextoAlternativa Fathom Voz para TextoAlternativa FlexClip Voz para TextoAlternativa Kapwing Voz para TextoAlternativa Canva Voz para TextoVoz para Texto para Áudio LongoVoz IA para TextoVoz para Texto GrátisVoz para Texto sem AnúnciosVoz para Texto para Áudio RuidosoVoz para Texto com TempoGerar Legendas de ÁudioTranscrição de Podcast OnlineTranscrever Chamadas de ClientesVoz do TikTok para TextoÁudio do TikTok para TextoVoz do YouTube para TextoÁudio do YouTube para TextoNota de Voz para TextoMensagem de Voz do WhatsApp para TextoMensagem de Voz do Telegram para TextoTranscrição de Chamada DiscordVoz do Twitch para TextoVoz do Skype para TextoVoz do Messenger para TextoMensagem de Voz do LINE para TextoTranscrever Vlogs para TextoConverter Áudio de Sermão em TextoConverter Fala em EscritaTraduzir Áudio para TextoConverter Notas de Áudio em TextoDigitação por VozDigitação por Voz para ReuniõesDigitação por Voz para YouTubeFalar para DigitarDigitação Sem MãosVoz para PalavrasFala para PalavrasFala para Texto OnlineOnline Transcription SoftwareFala para Texto para ReuniõesFala para Texto RápidoReal Time Speech to TextLive Transcription AppFala para Texto para TikTokSom para Texto para TikTokFalando para PalavrasFalar para TextoTalk to Text FreeTalk to Text OnlineTalk to Text for YouTubeTalk to Text for SubtitlesTalk to Text for Content CreatorsTalk to Text for MeetingsÁudio para DigitaçãoSom para TextoFerramenta de Escrita por VozFerramenta de Escrita por FalaDitado por VozFerramenta de Transcrição LegalFerramenta de Ditado MédicoTranscrição de Áudio JaponêsTranscrição de Reuniões em CoreanoFerramenta de Transcrição de ReuniõesÁudio de Reunião para TextoConversor de Aulas para TextoÁudio de Aula para TextoTranscrição de Vídeo para TextoGerador de Legendas para TikTokTranscrição de Call CenterFerramenta de Áudio Reels para TextoTranscrever MP3 para TextoTranscrever arquivo WAV para textoCapCut Voz para TextoCapCut Voz para TextoVoice to Text in EnglishÁudio para Texto em InglêsVoice to Text in SpanishVoice to Text in FrenchÁudio para Texto em FrancêsVoice to Text in GermanÁudio para Texto em AlemãoVoice to Text in JapaneseÁudio para Texto em JaponêsVoice to Text in KoreanÁudio para Texto em CoreanoVoice to Text in PortugueseVoice to Text in ArabicVoice to Text in ChineseVoice to Text in HindiVoice to Text in RussianWeb Voice Typing ToolVoice Typing Website