Esempio Whisper in Python: guida completa alla trascrizione vocale

Esempio Whisper in Python: guida completa alla trascrizione vocale

Eric King

Eric King

Author


Esempio Whisper in Python: guida completa alla trascrizione vocale

OpenAI Whisper è oggi tra i modelli open source di riconoscimento vocale più potenti disponibili. In questa guida completa imparerete a usare Whisper con Python per trascrivere file audio in testo con elevata precisione.
Questo tutorial è adatto a:
  • Sviluppatori che creano funzionalità voce-testo
  • Data scientist che lavorano con audio
  • Chiunque cerchi un esempio completo di Whisper in Python

Cos’è OpenAI Whisper?

Whisper è un sistema di riconoscimento automatico del parlato (ASR) addestrato su 680.000 ore di audio multilingue. Può:
  • Trascrivere il parlato in oltre 99 lingue
  • Rilevare automaticamente la lingua
  • Tradurre il parlato in inglese
  • Gestire audio rumoroso e accenti
  • Elaborare file audio lunghi

Prerequisiti

Prima di iniziare, assicuratevi di avere:
  • Python 3.8+ installato
  • il gestore pacchetti pip
  • FFmpeg installato (per l’elaborazione audio)
  • (Opzionale) GPU NVIDIA per un’elaborazione più veloce

Passaggio 1: Installare Whisper

Installate il pacchetto OpenAI Whisper con pip:
pip install openai-whisper

Installare FFmpeg

macOS (con Homebrew):
brew install ffmpeg
Ubuntu/Debian:
sudo apt update
sudo apt install ffmpeg
Windows: Scaricate FFmpeg da ffmpeg.org e aggiungetelo al PATH.

Passaggio 2: Esempio base di Whisper in Python

Ecco uno script Python semplice per trascrivere un file audio:
import whisper

# Load the Whisper model
model = whisper.load_model("base")

# Transcribe audio file
result = model.transcribe("audio.mp3")

# Print the transcription
print(result["text"])
Output:
Hello everyone, welcome to today's meeting. We will discuss the project timeline and upcoming milestones.

Passaggio 3: Esempio Python completo con gestione degli errori

Ecco un esempio più robusto con una corretta gestione degli errori:
import whisper
import os

def transcribe_audio(audio_path, model_size="base"):
    """
    Transcribe an audio file using Whisper.
    
    Args:
        audio_path (str): Path to the audio file
        model_size (str): Whisper model size (tiny, base, small, medium, large)
    
    Returns:
        dict: Transcription result with text and segments
    """
    try:
        # Check if audio file exists
        if not os.path.exists(audio_path):
            raise FileNotFoundError(f"Audio file not found: {audio_path}")
        
        # Load the Whisper model
        print(f"Loading Whisper model: {model_size}")
        model = whisper.load_model(model_size)
        
        # Transcribe the audio
        print(f"Transcribing: {audio_path}")
        result = model.transcribe(audio_path)
        
        return result
    
    except Exception as e:
        print(f"Error during transcription: {str(e)}")
        return None

# Example usage
if __name__ == "__main__":
    audio_file = "sample_audio.mp3"
    result = transcribe_audio(audio_file, model_size="base")
    
    if result:
        print("\nTranscription:")
        print(result["text"])

Passaggio 4: Esempio avanzato con rilevamento della lingua

Whisper può rilevare automaticamente la lingua, ma potete anche specificarla:
import whisper

model = whisper.load_model("base")

# Auto-detect language
result = model.transcribe("audio.mp3")
print(f"Detected language: {result['language']}")
print(f"Transcription: {result['text']}")

# Specify language explicitly
result_en = model.transcribe("audio.mp3", language="en")
result_zh = model.transcribe("audio.mp3", language="zh")

Passaggio 5: Ottenere timestamp e segmenti

Whisper fornisce informazioni dettagliate per segmento con timestamp:
import whisper

model = whisper.load_model("base")
result = model.transcribe("audio.mp3")

# Print full transcription
print("Full Text:")
print(result["text"])

# Print segments with timestamps
print("\nSegments with Timestamps:")
for segment in result["segments"]:
    start = segment["start"]
    end = segment["end"]
    text = segment["text"]
    print(f"[{start:.2f}s - {end:.2f}s] {text}")
Output:
Full Text:
Hello everyone, welcome to today's meeting. We will discuss the project timeline.

Segments with Timestamps:
[0.00s - 2.50s] Hello everyone, welcome to today's meeting.
[2.50s - 5.80s] We will discuss the project timeline.

Passaggio 6: Tradurre l’audio in inglese

Whisper può tradurre direttamente in inglese il parlato non in inglese:
import whisper

model = whisper.load_model("base")

# Translate to English
result = model.transcribe("spanish_audio.mp3", task="translate")

print("Translated text:")
print(result["text"])

Passaggio 7: Elaborare più file audio

Ecco come trascrivere più file in batch:
import whisper
import os
from pathlib import Path

def batch_transcribe(audio_directory, model_size="base", output_dir="transcriptions"):
    """
    Transcribe all audio files in a directory.
    
    Args:
        audio_directory (str): Directory containing audio files
        model_size (str): Whisper model size
        output_dir (str): Directory to save transcriptions
    """
    # Create output directory
    os.makedirs(output_dir, exist_ok=True)
    
    # Load model once
    model = whisper.load_model(model_size)
    
    # Supported audio formats
    audio_extensions = ['.mp3', '.wav', '.m4a', '.flac', '.ogg']
    
    # Process each audio file
    audio_files = [
        f for f in os.listdir(audio_directory)
        if any(f.lower().endswith(ext) for ext in audio_extensions)
    ]
    
    for audio_file in audio_files:
        audio_path = os.path.join(audio_directory, audio_file)
        print(f"\nProcessing: {audio_file}")
        
        try:
            result = model.transcribe(audio_path)
            
            # Save transcription to file
            output_file = os.path.join(
                output_dir,
                Path(audio_file).stem + ".txt"
            )
            
            with open(output_file, "w", encoding="utf-8") as f:
                f.write(result["text"])
            
            print(f"✓ Saved: {output_file}")
            
        except Exception as e:
            print(f"✗ Error processing {audio_file}: {str(e)}")

# Example usage
batch_transcribe("audio_files/", model_size="base")

Passaggio 8: Esportare nel formato sottotitoli SRT

Create file di sottotitoli SRT dalle trascrizioni:
import whisper

def transcribe_to_srt(audio_path, output_path, model_size="base"):
    """
    Transcribe audio and save as SRT subtitle file.
    
    Args:
        audio_path (str): Path to audio file
        output_path (str): Path to save SRT file
        model_size (str): Whisper model size
    """
    model = whisper.load_model(model_size)
    result = model.transcribe(audio_path)
    
    # Generate SRT content
    srt_content = ""
    for i, segment in enumerate(result["segments"], start=1):
        start_time = format_timestamp(segment["start"])
        end_time = format_timestamp(segment["end"])
        text = segment["text"].strip()
        
        srt_content += f"{i}\n"
        srt_content += f"{start_time} --> {end_time}\n"
        srt_content += f"{text}\n\n"
    
    # Save SRT file
    with open(output_path, "w", encoding="utf-8") as f:
        f.write(srt_content)
    
    print(f"SRT file saved: {output_path}")

def format_timestamp(seconds):
    """Convert seconds to SRT timestamp format (HH:MM:SS,mmm)."""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"

# Example usage
transcribe_to_srt("video.mp4", "subtitles.srt", model_size="base")

Confronto delle dimensioni del modello Whisper

Scegliete la dimensione del modello in base alle vostre esigenze:
ModelloParametriVelocitàPrecisioneMemoriaCaso d’uso
tiny39M⭐⭐⭐⭐⭐⭐⭐~1GBTest rapidi, audio semplice
base74M⭐⭐⭐⭐⭐⭐⭐~1GBUso generale
small244M⭐⭐⭐⭐⭐⭐⭐~2GBBilanciato
medium769M⭐⭐⭐⭐⭐⭐⭐~5GBAlta precisione richiesta
large1550M⭐⭐⭐⭐⭐⭐~10GBMassima precisione, audio rumoroso

Buone pratiche per Whisper in Python

1. Scegliere la dimensione del modello giusta

# Fast and lightweight
model = whisper.load_model("tiny")  # Good for testing

# Balanced
model = whisper.load_model("base")  # Good for most cases

# High accuracy
model = whisper.load_model("medium")  # For important transcriptions

2. Gestire file audio lunghi

Per file audio molto lunghi, considerate la suddivisione in segmenti:
import whisper
from pydub import AudioSegment

def transcribe_long_audio(audio_path, chunk_length_ms=60000):
    """
    Transcribe long audio by splitting into chunks.
    
    Args:
        audio_path: Path to audio file
        chunk_length_ms: Length of each chunk in milliseconds
    """
    model = whisper.load_model("base")
    
    # Load audio
    audio = AudioSegment.from_file(audio_path)
    
    # 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 = []
    for i, chunk in enumerate(chunks):
        chunk_path = f"chunk_{i}.wav"
        chunk.export(chunk_path, format="wav")
        
        result = model.transcribe(chunk_path)
        full_text.append(result["text"])
        
        # Clean up chunk file
        os.remove(chunk_path)
    
    return " ".join(full_text)

3. Usare la GPU per maggiore velocità

Se disponete di una GPU NVIDIA:
import whisper

# Whisper will automatically use GPU if available
model = whisper.load_model("base", device="cuda")

4. Specificare la lingua per maggiore precisione

# If you know the language, specify it
result = model.transcribe("audio.mp3", language="en")

Casi d’uso comuni

Trascrizione di podcast

import whisper

model = whisper.load_model("medium")
result = model.transcribe("podcast_episode.mp3")

# Save transcript
with open("podcast_transcript.txt", "w") as f:
    f.write(result["text"])

Verbali di riunione

import whisper
from datetime import datetime

model = whisper.load_model("base")
result = model.transcribe("meeting_recording.mp3")

# Create formatted meeting notes
notes = f"""
Meeting Notes - {datetime.now().strftime('%Y-%m-%d')}
========================================

{result["text"]}
"""

with open("meeting_notes.txt", "w") as f:
    f.write(notes)

Sottotitoli video

import whisper

model = whisper.load_model("base")
result = model.transcribe("video.mp4")

# Generate VTT subtitle file
vtt_content = "WEBVTT\n\n"
for segment in result["segments"]:
    start = format_vtt_timestamp(segment["start"])
    end = format_vtt_timestamp(segment["end"])
    text = segment["text"].strip()
    vtt_content += f"{start} --> {end}\n{text}\n\n"

with open("subtitles.vtt", "w") as f:
    f.write(vtt_content)

Risoluzione dei problemi comuni

Problema 1: FFmpeg non trovato

Errore: FileNotFoundError: ffmpeg
Soluzione:
# Install FFmpeg
# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt install ffmpeg

# Windows
# Download from ffmpeg.org and add to PATH

Problema 2: memoria insufficiente

Errore: RuntimeError: CUDA out of memory
Soluzione:
# Use a smaller model
model = whisper.load_model("tiny")  # Instead of "large"

# Or use CPU
model = whisper.load_model("base", device="cpu")

Problema 3: elaborazione lenta

Soluzioni:
  • Usate un modello più piccolo (tiny o base)
  • Abilitate l’accelerazione GPU
  • Elaborate l’audio a segmenti
  • Usate il multiprocessing per i job in batch

Suggerimenti sulle prestazioni

  1. Usate la GPU quando disponibile — 10-50× più veloce della CPU
  2. Scegliete una dimensione di modello adeguata — non usate "large" per compiti semplici
  3. Pre-elaborate l’audio — rimuovete i silenzi, normalizzate il volume
  4. Elaborazione in batch — caricate il modello una volta, elaborate più file
  5. Threading — per operazioni limitate da I/O

Whisper Python rispetto ad altre soluzioni

FunzionalitàWhisper PythonGoogle Speech-to-TextAssemblyAI
CostoGratuito (locale)A pagamento al minutoA pagamento al minuto
Offline
PrecisioneAltaAltaAlta
ConfigurazioneMediaFacileFacile
Audio lungo
Multilingue

Esempio completo: script pronto per la produzione

Ecco un esempio completo e pronto per la produzione:
#!/usr/bin/env python3
"""
Production-ready Whisper transcription script.
"""

import whisper
import argparse
import os
import json
from pathlib import Path
from datetime import datetime

def transcribe_file(
    audio_path,
    model_size="base",
    language=None,
    output_format="txt",
    output_dir=None
):
    """
    Transcribe an audio file with comprehensive output options.
    
    Args:
        audio_path: Path to audio file
        model_size: Whisper model size
        language: Language code (optional, auto-detected if None)
        output_format: Output format (txt, json, srt, vtt)
        output_dir: Output directory (default: same as audio file)
    """
    # Validate input file
    if not os.path.exists(audio_path):
        raise FileNotFoundError(f"Audio file not found: {audio_path}")
    
    # Set output directory
    if output_dir is None:
        output_dir = os.path.dirname(audio_path)
    os.makedirs(output_dir, exist_ok=True)
    
    # Load model
    print(f"Loading Whisper model: {model_size}")
    model = whisper.load_model(model_size)
    
    # Transcribe
    print(f"Transcribing: {audio_path}")
    transcribe_kwargs = {}
    if language:
        transcribe_kwargs["language"] = language
    
    result = model.transcribe(audio_path, **transcribe_kwargs)
    
    # Generate output filename
    base_name = Path(audio_path).stem
    output_path = os.path.join(output_dir, base_name)
    
    # Save based on format
    if output_format == "txt":
        with open(f"{output_path}.txt", "w", encoding="utf-8") as f:
            f.write(result["text"])
    
    elif output_format == "json":
        with open(f"{output_path}.json", "w", encoding="utf-8") as f:
            json.dump(result, f, indent=2, ensure_ascii=False)
    
    elif output_format == "srt":
        srt_content = generate_srt(result["segments"])
        with open(f"{output_path}.srt", "w", encoding="utf-8") as f:
            f.write(srt_content)
    
    elif output_format == "vtt":
        vtt_content = generate_vtt(result["segments"])
        with open(f"{output_path}.vtt", "w", encoding="utf-8") as f:
            f.write(vtt_content)
    
    print(f"✓ Transcription saved: {output_path}.{output_format}")
    print(f"  Language: {result['language']}")
    print(f"  Duration: {result['segments'][-1]['end']:.2f}s")
    
    return result

def generate_srt(segments):
    """Generate SRT subtitle content."""
    srt = ""
    for i, segment in enumerate(segments, start=1):
        start = format_timestamp(segment["start"])
        end = format_timestamp(segment["end"])
        text = segment["text"].strip()
        srt += f"{i}\n{start} --> {end}\n{text}\n\n"
    return srt

def generate_vtt(segments):
    """Generate VTT subtitle content."""
    vtt = "WEBVTT\n\n"
    for segment in segments:
        start = format_vtt_timestamp(segment["start"])
        end = format_vtt_timestamp(segment["end"])
        text = segment["text"].strip()
        vtt += f"{start} --> {end}\n{text}\n\n"
    return vtt

def format_timestamp(seconds):
    """Format timestamp for SRT."""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"

def format_vtt_timestamp(seconds):
    """Format timestamp for VTT."""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d}.{millis:03d}"

def main():
    parser = argparse.ArgumentParser(
        description="Transcribe audio files using OpenAI Whisper"
    )
    parser.add_argument("audio", help="Path to audio file")
    parser.add_argument(
        "--model",
        default="base",
        choices=["tiny", "base", "small", "medium", "large"],
        help="Whisper model size"
    )
    parser.add_argument(
        "--language",
        default=None,
        help="Language code (e.g., 'en', 'zh', 'es')"
    )
    parser.add_argument(
        "--output-format",
        default="txt",
        choices=["txt", "json", "srt", "vtt"],
        help="Output format"
    )
    parser.add_argument(
        "--output-dir",
        default=None,
        help="Output directory"
    )
    
    args = parser.parse_args()
    
    transcribe_file(
        args.audio,
        model_size=args.model,
        language=args.language,
        output_format=args.output_format,
        output_dir=args.output_dir
    )

if __name__ == "__main__":
    main()
Utilizzo:
# Basic usage
python transcribe.py audio.mp3

# With options
python transcribe.py audio.mp3 --model medium --language en --output-format srt

# Save to specific directory
python transcribe.py audio.mp3 --output-dir ./transcriptions

Conclusione

Questa guida completa agli esempi di Whisper in Python copre tutto ciò che serve per iniziare con la trascrizione vocale usando OpenAI Whisper. Che stiate trascrivere podcast, riunioni o creando sottotitoli, Whisper offre una soluzione potente e gratuita per convertire l’audio in testo.
Punti chiave:
  • Whisper è gratuito e open source
  • Supporta oltre 99 lingue
  • Funziona offline (senza chiamate API)
  • Alta precisione nella maggior parte dei casi
  • Facile da integrare nei progetti Python
Per scenari di produzione che richiedono trascrizione in tempo reale o accesso via API, considerate soluzioni cloud come SayToWords, che offre trascrizione basata su Whisper tramite API.

Pronti a iniziare? Installate Whisper e trascrivete oggi stesso il vostro primo file audio.

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