Precisione di Whisper: come migliorare la qualità della trascrizione

Precisione di Whisper: come migliorare la qualità della trascrizione

Eric King

Eric King

Author


Precisione di Whisper: come migliorare la qualità della trascrizione

OpenAI Whisper è già tra i modelli open source più accurati per il riconoscimento vocale, ma diverse strategie permettono di massimizzare ulteriormente la qualità della trascrizione. Questa guida raccoglie suggerimenti pratici, esempi di codice e best practice per migliorare la precisione di Whisper nei vostri casi d’uso.
Ideale per:
  • Sviluppatori che ottimizzano la precisione di trascrizione con Whisper
  • Creator che trascrivono podcast e video
  • Ricercatori che lavorano con audio
  • Chi cerca suggerimenti sulla precisione di Whisper

Cosa influenza la precisione di Whisper

Prima di ottimizzare, è utile sapere cosa conta:
  • Qualità audio (la più importante)
  • Dimensione del modello (scelta)
  • Rilevamento della lingua
  • Pre-elaborazione audio
  • Parametri di configurazione
  • Durata audio e segmentazione

Suggerimento 1: Scegliere la dimensione del modello giusta

Whisper offre cinque dimensioni che bilanciano velocità e precisione in modo diverso:
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
Guida alla scelta del modello:
ModelloPrecisioneVelocitàUsalo quando
tiny⭐⭐⭐⭐⭐⭐⭐Test rapidi, audio semplice
base⭐⭐⭐⭐⭐⭐⭐Uso generale, bilanciato
small⭐⭐⭐⭐⭐⭐⭐Buona precisione, velocità ragionevole
medium⭐⭐⭐⭐⭐⭐⭐Serve alta precisione
large⭐⭐⭐⭐⭐⭐Massima precisione, audio rumoroso
Esempio di codice:
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)
Conclusione: Usate medium o large quando la precisione è critica. Il costo in velocità vale spesso la pena per contenuti importanti.

Suggerimento 2: Specificare la lingua quando è nota

Whisper può rilevare automaticamente la lingua, ma indicarla esplicitamente migliora la precisione:
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")
Perché aiuta:
  • Meno errori di rilevamento lingua
  • Risultati migliori per parlanti multilingue
  • Elaborazione più veloce (salta il rilevamento)
  • Migliore gestione di accenti e dialetti
Esempio con rilevamento lingua:
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")

Suggerimento 3: Pre-elaborare l’audio prima della trascrizione

La pre-elaborazione può migliorare sensibilmente la precisione di 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)
Passi di pre-elaborazione:
  1. Normalizzare i livelli – volume uniforme
  2. Rimuovere l’offset DC – eliminare bias costante
  3. Ricampionare a 16 kHz – frequenza ottimale per Whisper
  4. Rimuovere il silenzio – concentrarsi sulla voce
  5. Ridurre il rumore – pulire lo sfondo

Suggerimento 4: Impostazioni di temperatura per risultati migliori

Il parametro temperature controlla la casualità. Valori più bassi possono migliorare la precisione:
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
)
Impostazioni di temperatura:
  • temperature=0.0: più deterministico, migliore precisione
  • temperature=0.2: poca casualità, buon equilibrio
  • temperature=0.6: predefinito, bilanciato
  • Valori alti: più “creativo”, meno preciso
Best practice:
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

Suggerimento 5: Prompt iniziale per il contesto

Fornire contesto sul contenuto migliora la precisione:
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 usare prompt iniziali:
  • Contenuto tecnico: includere termini di dominio
  • Nomi e luoghi: menzionare nomi propri importanti
  • Accenti: descrivere accento o dialetto
  • Contesto: descrivere ambiente o argomento
Esempio:
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."
)

Suggerimento 6: Gestire correttamente file audio lunghi

File molto lunghi possono ridurre la precisione. Ecco come procedere:
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)
Best practice per audio lungo:
  • Dividere in segmenti da 20–30 minuti
  • Usare la stessa dimensione di modello per tutti i segmenti
  • Mantenere contesto tra i segmenti
  • Unire i segmenti con timestamp corretti

Suggerimento 7: Ottimizzare per audio rumoroso

Whisper gestisce bene il rumore, ma si può fare di più:
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")
Con audio rumoroso:
  • Usare modelli medium o large
  • Pre-elaborare con riduzione rumore
  • Aumentare best_of
  • Fornire contesto sulle condizioni di rumore

Suggerimento 8: Timestamp a livello di parola per più controllo

I timestamp parola per parola consentono un controllo più fine:
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)")
Casi d’uso:
  • Sottotitoli: sincronizzazione precisa parola per parola
  • Correzione errori: individuare parole problematiche
  • Ricerca: trovare parole nella trascrizione
  • Analisi del parlato: pattern di voce

Suggerimento 9: Combinare più decodifiche

Con best_of si provano più decodifiche e si sceglie la migliore:
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
)
Compromessi:
  • Precisione: più alta con più decodifiche
  • Velocità: più lenta (5× con best_of=5)
  • Quando: precisione critica, velocità secondaria

Suggerimento 10: Post-elaborare le trascrizioni

La post-elaborazione corregge errori comuni di 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"])

Esempio completo: ottimizzazione della precisione pronta per la produzione

Esempio che combina diversi suggerimenti sulla precisione:
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"
)

Confronto di precisione: prima e dopo l’ottimizzazione

Effetti tipici dell’ottimizzazione:
OttimizzazioneMiglioramento precisioneImpatto sulla velocità
Dimensione modello (base → medium)+15–20%−50%
Specifica della lingua+5–10%+10% (più veloce)
Prompt iniziale+5–15%Nessuno
Temperature=0.0+2–5%Nessuno
best_of=5+3–8%−80% (5× più lento)
Pre-elaborazione audio+10–20%Minimo
Combinati, i miglioramenti possono aumentare la precisione del 30–50% rispetto alle impostazioni predefinite.

Riepilogo delle best practice

Per la massima precisione:

  1. ✅ Modello medium o large
  2. ✅ Lingua esplicita
  3. ✅ Contesto con initial_prompt
  4. temperature=0.0 per risultati deterministici
  5. word_timestamps per output dettagliato
  6. ✅ Pre-elaborare audio rumoroso
  7. ✅ Dividere file lunghi
  8. best_of=5 per contenuti critici

Per equilibrio velocità/precisione:

  1. ✅ Modello small o base
  2. ✅ Rilevamento automatico della lingua
  3. ✅ Temperatura predefinita
  4. ✅ Senza best_of
  5. ✅ File elaborati così come sono (pre-elaborazione minima)

Errori comuni da evitare

❌ Modello tiny per contenuti importanti

Soluzione: Almeno base, meglio small o medium

❌ Non specificare la lingua

Soluzione: Specificarla sempre quando è nota

❌ Ignorare il contesto

Soluzione: Usare initial_prompt per contenuti di dominio

❌ Impostazioni predefinite con molto rumore

Soluzione: Modelli più grandi e pre-elaborazione

❌ File molto lunghi in un unico blocco

Soluzione: Segmenti da 20–30 minuti

Risoluzione dei problemi di precisione

Problema: Bassa precisione su termini tecnici

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

Problema: Scarsa precisione con accenti

Soluzione:
# 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: Errori su nomi propri

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

Conclusione

Migliorare la precisione di Whisper significa fare le scelte giuste:
  • Modello: medium o large per contenuti critici
  • Configurazione: temperatura e decodifica ottimali
  • Contesto: informazioni di dominio
  • Pre-elaborazione: audio pulito prima della trascrizione
  • Post-elaborazione: correzione automatica degli errori comuni
Punti chiave:
  1. La dimensione del modello ha il maggior impatto
  2. Specificare la lingua migliora molto i risultati
  3. I prompt di contesto aiutano su contenuti specializzati
  4. Più decodifiche (best_of) aumentano la precisione ma rallentano
  5. La qualità audio resta il fattore principale
Seguendo questi suggerimenti potete ottenere una qualità di trascrizione paragonabile o superiore ai servizi commerciali, con pieno controllo su dati e flusso di lavoro.

Pronti a migliorare la precisione di Whisper? Passate a un modello più grande e indicate la lingua: vedrete subito i miglioramenti!

Provalo gratis ora

Prova subito il nostro servizio basato su IA per voce, audio e video! Non solo ottieni una trascrizione voce‑testo ad alta precisione, traduzione multilingue e identificazione intelligente dei parlanti, ma puoi anche generare automaticamente sottotitoli per i video, modificare in modo intelligente i contenuti audio‑video ed effettuare analisi sincronizzate di audio e immagine. Copri tutti gli scenari: verbali di riunioni, creazione di video brevi, produzione di podcast e molto altro. Inizia ora la tua prova gratuita!

Suono a Testo OnlineSuono a Testo GratuitoConvertitore Suono in TestoSuono a Testo MP3Suono a Testo WAVSuono a Testo con TimestampVoce in testo per riunioniSound to Text Multi LanguageSuono a Testo SottotitoliConvertire WAV in testoVoce in TestoVoce in Testo OnlineVoce in TestoConvertire MP3 in TestoConvertire registrazione vocale in testoDigitazione Vocale OnlineVoce in Testo con TimestampVoce in Testo in Tempo RealeVoce in Testo per Audio LunghiVoce in Testo per VideoVoce a Testo per YouTubeVoce a Testo per Montaggio VideoVoce a Testo per SottotitoliVoce a Testo per PodcastVoce a Testo per IntervisteAudio Intervista in TestoVoce a Testo per RegistrazioniVoce a Testo per RiunioniVoce a Testo per LezioniVoce a Testo per NoteVoce in Testo MultilingueVoce in Testo PrecisaVoce in Testo VeloceAlternativa Premiere Pro Voce in TestoAlternativa DaVinci Voce in TestoAlternativa VEED Voce in TestoAlternativa InVideo Voce in TestoAlternativa Otter.ai Voce in TestoAlternativa Descript Voce in TestoAlternativa Trint Voce in TestoAlternativa Rev Voce in TestoAlternativa Sonix Voce in TestoAlternativa Happy Scribe Voce in TestoAlternativa Zoom Voce in TestoAlternativa Google Meet Voce in TestoAlternativa Microsoft Teams Voce in TestoAlternativa Fireflies.ai Voce in TestoAlternativa Fathom Voce in TestoAlternativa FlexClip Voce in TestoAlternativa Kapwing Voce in TestoAlternativa Canva Voce in TestoVoce a Testo per Audio LunghiVoce IA in TestoVoce in Testo GratuitoVoce in Testo Senza PubblicitàVoce in Testo per Audio RumorosoVoce in Testo con TempoGenera Sottotitoli da AudioTrascrizione Podcast OnlineTrascrivi Chiamate ClientiVoce TikTok a TestoAudio TikTok a TestoVoce YouTube in TestoAudio YouTube in TestoMemo Vocale in TestoMessaggio Vocale WhatsApp in TestoMessaggio Vocale Telegram in TestoTrascrizione Chiamata DiscordVoce Twitch in TestoVoce Skype in TestoVoce Messenger in TestoMessaggio Vocale LINE in TestoTrascrivi Vlog in TestoConverti Audio Sermone in TestoConverti Parlato in ScritturaTraduci Audio in TestoConverti Note Audio in TestoDigitazione VocaleDigitazione Vocale per RiunioniDigitazione Vocale per YouTubeParla per ScrivereDigitazione Senza ManiVoce in ParoleParlato in ParoleParlato in Testo OnlineOnline Transcription SoftwareParlato in Testo per RiunioniParlato in Testo VeloceReal Time Speech to TextLive Transcription AppParlato in Testo per TikTokSuono in Testo per TikTokParlare in ParoleParlato in TestoTalk to Text FreeTalk to Text OnlineTalk to Text for YouTubeTalk to Text for SubtitlesTalk to Text for Content CreatorsTalk to Text for MeetingsAudio in DigitazioneSuono in TestoStrumento di Scrittura VocaleStrumento di Scrittura VocaleDettatura VocaleStrumento di Trascrizione LegaleStrumento di Dettatura MedicaTrascrizione Audio GiapponeseTrascrizione Riunioni CoreaneStrumento di Trascrizione RiunioniAudio Riunione in TestoConvertitore Lezione a TestoAudio Lezione in TestoTrascrizione Video a TestoGeneratore di Sottotitoli per TikTokTrascrizione Call CenterStrumento Audio Reels a TestoTrascrivere MP3 in TestoTrascrivere file WAV in testoCapCut Voce in TestoCapCut Voce in TestoVoice to Text in EnglishAudio in Testo IngleseVoice to Text in SpanishVoice to Text in FrenchAudio in Testo FranceseVoice to Text in GermanAudio in Testo TedescoVoice to Text in JapaneseAudio in Testo GiapponeseVoice to Text in KoreanAudio in Testo 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