Trascrivere un'intervista, sottotitolare un video, ricavare il testo di un podcast: sono compiti per cui esistono servizi a pagamento, ma che potete svolgere gratis, sul vostro computer e senza inviare nulla in rete grazie a Whisper, il modello di riconoscimento vocale open source rilasciato da OpenAI. In questa guida vediamo come usarlo in locale con i due strumenti piu' pratici - faster-whisper e whisper.cpp - con comandi e codice pronti da copiare.
A chi serve e cosa otterrai
Questa guida e' utile a giornalisti, studenti, ricercatori, podcaster e a chiunque debba convertire audio in testo mantenendo la privacy (i dati restano sul vostro dispositivo) e azzerando i costi. Al termine saprete installare uno strumento di trascrizione, generare un testo con marcatori temporali e perfino un file di sottotitoli .srt. Prerequisiti: un computer Windows, macOS o Linux; per le trascrizioni veloci aiuta una GPU NVIDIA, ma tutto funziona anche solo su CPU, semplicemente piu' lentamente. Per un'ora di audio, su CPU potete aspettarvi tempi nell'ordine delle decine di minuti con un modello grande; su GPU si scende a pochi minuti.
Perche' Whisper e perche' in locale
Whisper e' stato addestrato su enormi quantita' di audio multilingue e gestisce bene anche l'italiano, la punteggiatura e i numeri. Eseguirlo in locale, invece di affidarsi a un servizio cloud, ha tre vantaggi concreti: nessun costo per minuto trascritto, riservatezza totale (fondamentale per interviste confidenziali, dati sanitari o documenti aziendali) e la possibilita' di lavorare offline. In cambio dovrete dedicare qualche minuto alla configurazione iniziale e disporre di un hardware decente per i modelli piu' grandi.
Quale strumento scegliere
- faster-whisper (prima scelta consigliata): una reimplementazione di Whisper basata su CTranslate2, fino a 4 volte piu' veloce dell'originale a parita' di accuratezza e con minor consumo di memoria. Ideale se usate Python e/o avete una GPU NVIDIA.
- whisper.cpp: una versione in C/C++ senza dipendenze, perfetta per CPU, Mac (con accelerazione Metal) e dispositivi a basso consumo. Ottima se non volete installare Python o lavorate su hardware modesto.
- openai/whisper (l'implementazione originale): comoda come riferimento, ma piu' lenta e pesante delle due precedenti.
Sui modelli: si va dal piccolo tiny al grande large-v3. Per la maggior parte degli usi conviene large-v3-turbo, una variante ottimizzata che decodifica molto piu' rapidamente con una perdita di qualita' minima. Per l'italiano, i modelli "large" danno risultati nettamente migliori dei piccoli, che invece vanno bene per prove rapide o per hardware molto limitato.
Procedura con faster-whisper (Python)
Create un ambiente virtuale e installate il pacchetto:
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install faster-whisper
Lo script base per trascrivere un file. Su GPU usate device="cuda" e compute_type="float16"; senza GPU, device="cpu" e compute_type="int8" per risparmiare memoria:
from faster_whisper import WhisperModel
model = WhisperModel("large-v3-turbo", device="cuda", compute_type="float16")
segments, info = model.transcribe(
"intervista.mp3",
language="it", # forza l'italiano; ometti per il rilevamento automatico
vad_filter=True, # rimuove i silenzi, riduce gli errori
)
print(f"Lingua rilevata: {info.language}")
for seg in segments:
print(f"[{seg.start:.2f} -> {seg.end:.2f}] {seg.text}")
Il primo avvio scarica automaticamente il modello da Hugging Face e lo mette in cache, quindi le esecuzioni successive partono subito. Ogni segment contiene inizio, fine e testo: sono i mattoni per costruire i sottotitoli.
Generare un file di sottotitoli .srt
Con poche righe in piu' trasformate i segmenti in un file SRT pronto per i video:
def t(s):
h = int(s // 3600); m = int((s % 3600) // 60)
sec = int(s % 60); ms = int((s - int(s)) * 1000)
return f"{h:02d}:{m:02d}:{sec:02d},{ms:03d}"
with open("sottotitoli.srt", "w", encoding="utf-8") as f:
for i, seg in enumerate(segments, start=1):
f.write(f"{i}\n{t(seg.start)} --> {t(seg.end)}\n{seg.text.strip()}\n\n")
Nota: i segmenti sono un generatore "consumabile" una sola volta; se vi servono sia per la stampa sia per l'SRT, raccoglieteli prima in una lista con segments = list(segments). Da un file SRT potete poi ricavare facilmente anche un testo continuo, unendo le righe e togliendo i tempi.
Trascrivere file lunghi piu' in fretta
Per riunioni o podcast di un'ora o piu', faster-whisper offre una modalita' "batched" che elabora piu' segmenti in parallelo, riducendo sensibilmente i tempi su GPU:
from faster_whisper import WhisperModel, BatchedInferencePipeline
model = WhisperModel("large-v3-turbo", device="cuda", compute_type="float16")
batched = BatchedInferencePipeline(model=model)
segments, info = batched.transcribe("riunione.mp3", language="it", batch_size=16)
for seg in segments:
print(seg.text)
Aumentare batch_size velocizza ma consuma piu' memoria: se la GPU va in errore, riducetelo (per esempio a 8 o 4).
Alternativa con whisper.cpp (senza Python)
Se preferite non usare Python o lavorate su CPU/Mac, whisper.cpp e' la via piu' leggera. In sintesi:
# scaricare e compilare
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp
cmake -B build && cmake --build build -j --config Release
# scaricare un modello (es. large-v3-turbo)
sh ./models/download-ggml-model.sh large-v3-turbo
# trascrivere (l'audio deve essere WAV 16 kHz mono)
./build/bin/whisper-cli -m models/ggml-large-v3-turbo.bin -f audio.wav -l it -osrt
L'opzione -osrt genera direttamente il file di sottotitoli; esistono anche -otxt per il testo semplice e -ovtt per il formato WebVTT. Whisper.cpp richiede audio in formato WAV a 16 kHz: convertitelo prima con ffmpeg (vedi sotto).
Preparare l'audio con ffmpeg
Spesso conviene normalizzare il file prima della trascrizione. Con ffmpeg si converte qualsiasi audio o video in WAV mono a 16 kHz:
ffmpeg -i video.mp4 -ar 16000 -ac 1 -c:a pcm_s16le audio.wav
Lo stesso comando estrae l'audio da un video: utile per sottotitolare un filmato partendo direttamente dal file .mp4.
Errori comuni e soluzioni
- CUDA out of memory: il modello e' troppo grande per la vostra GPU. Passate a un modello piu' piccolo (
medium) o usatecompute_type="int8_float16", oppure riducete ilbatch_size. - Errori cuDNN/cuBLAS con faster-whisper: mancano le librerie NVIDIA. Installatele (su molti sistemi bastano i pacchetti
nvidia-cudnn-cu12envidia-cublas-cu12) oppure ripiegate sudevice="cpu". - "ffmpeg not found": ffmpeg non e' installato o non e' nel PATH. Installatelo dal sito ufficiale o dal gestore pacchetti del vostro sistema (su macOS con Homebrew, su Linux con apt).
- Trascrizione imprecisa o nella lingua sbagliata: specificate
language="it", usate un modello "large" e attivatevad_filter=Trueper pulire i silenzi. - Parole tecniche o nomi propri sbagliati: passate un breve testo di contesto con il parametro
initial_promptcontenente i termini ricorrenti, per aiutare il modello a scriverli correttamente.
Varianti, limiti e prossimi passi
Whisper non separa automaticamente gli interlocutori: se vi serve sapere "chi dice cosa" (diarizzazione), dovrete affiancare strumenti dedicati come pyannote.audio, che identificano i diversi parlanti e si combinano con i tempi prodotti da Whisper. Tenete presente che nessun sistema e' perfetto: su audio rumorosi, accenti marcati o sovrapposizioni di voci l'accuratezza cala, e una rilettura umana resta indispensabile per usi professionali, soprattutto in ambito giornalistico o legale dove una parola sbagliata cambia il senso.
Una volta padroneggiata la trascrizione, il passo successivo naturale e' darla in pasto a un modello linguistico per riassumerla, estrarne i punti chiave o generare un verbale strutturato. Potete farlo in locale con un modello eseguito tramite Ollama o LM Studio, mantenendo tutto sul vostro computer, oppure tramite le API di un servizio cloud se la riservatezza non e' un problema. A quel punto avrete costruito, gratis e in locale, una piccola catena di montaggio per i vostri contenuti audio: dal file grezzo al testo, dai sottotitoli al riassunto, senza mai dipendere da un abbonamento.




