IT

Whisper su Mac: sottotitoli senza cloud

Come usiamo Whisper su Mac con WhisperKit e Core ML: perché tutto sul dispositivo, il modello scelto, il primo caricamento da 3 minuti, spazio su disco e lingua.

Nicolas Ricardi8 min di lettura

In breve

  • JustRec crea i sottotitoli con Whisper che gira sul Mac tramite WhisperKit, così la tua voce non lascia mai il computer.
  • Usiamo una build Core ML compressa di Whisper large-v3 turbo di circa 626 MB, scaricata una sola volta.
  • Il primo caricamento ha richiesto circa tre minuti e molto spazio temporaneo su disco, perché Core ML specializza il modello per il tuo chip; dopo si carica in pochi secondi.
  • La trascrizione parte dalla traccia del microfono appena premi stop, in parallelo con l'esportazione del video.

Puoi usare Whisper su un Mac interamente sul dispositivo: i pesi del modello sono open source, e WhisperKit li fa girare tramite Core ML su Apple Silicon. È così che JustRec crea i sottotitoli di ogni registrazione senza mandare a nessuno nemmeno un secondo di audio. Qui sotto: come l’abbiamo configurato, quale modello abbiamo scelto e cosa ci ha sorpreso (un download da 626 MB, un primo caricamento di circa tre minuti e, una volta, un disco pieno).

Perché i sottotitoli dovevano funzionare sul Mac

La promessa nella nostra home page è semplice: la tua voce non viene mai inviata a un’intelligenza artificiale esterna. I nostri utenti registrano lavoro per i clienti: una revisione del design con dei nomi sullo schermo, un preventivo spiegato riga per riga, un bug nel pannello di amministrazione di un cliente. Mandare quell’audio a un’API di trascrizione significherebbe un’azienda in più che tratta i dati dei loro clienti, una riga in più nell’informativa privacy e una cosa in più da spiegare a un cliente attento. Tenere la voce sul Mac è coerente con il resto del prodotto, che è costruito per registrare in locale e tiene le copie condivise nell’UE.

C’erano anche motivi pratici:

  • Nessun costo al minuto. Un’API nel cloud fa pagare ogni minuto di audio. Sul Mac, il costo è la corrente dell’utente.
  • Funziona offline. Una volta scaricato il modello, i sottotitoli funzionano anche in treno.
  • Sottotitoli prima del caricamento. La trascrizione può partire nel momento in cui premi stop, mentre il video si sta ancora esportando.

Abbiamo scritto un confronto più lungo e non tecnico in trascrizione offline o nel cloud. Questo articolo è il lato tecnico.

WhisperKit e Core ML

Whisper è il modello di riconoscimento vocale di OpenAI, rilasciato con codice e pesi sotto licenza MIT. Gestisce il riconoscimento vocale multilingue e l’identificazione della lingua, ed è quello che ci serve per i sottotitoli nella lingua in cui parli.

Per farlo girare bene su un Mac serve in formato Core ML, così può usare il Neural Engine e la GPU. Usiamo WhisperKit, parte dell’SDK Swift open source di Argmax (licenza MIT). Scarica le build Core ML di Whisper da Hugging Face, le tiene in cache in locale e ti dà un’API Swift per la trascrizione con i timestamp delle parole e il rilevamento dell’attività vocale. Richiede macOS 14, sotto il nostro minimo di macOS 15.

Abbiamo guardato anche SpeechAnalyzer di Apple. È promettente, ma richiede macOS 26, e JustRec supporta macOS 15. WhisperKit gira ovunque giri la nostra app.

La scelta del modello

Whisper esiste in diverse dimensioni, e il compromesso è il solito: i modelli più grandi sono più precisi e più lenti. La tabella di OpenAI:

Le dimensioni dei modelli Whisper, come le pubblica OpenAI
Dimensione Parametri Memoria necessaria Velocità relativa
tiny 39 M circa 1 GB circa 10x
base 74 M circa 1 GB circa 7x
small 244 M circa 2 GB circa 4x
medium 769 M circa 5 GB circa 2x
large 1.550 M circa 10 GB 1x
turbo 809 M circa 6 GB circa 8x

Dal README di openai/whisper, verificato a novembre 2026. La velocità relativa confronta i modelli tra loro, non con un Mac.

La riga interessante è turbo: vicino al modello large, con circa metà dei parametri e una velocità molte volte superiore. Su un Mac, però, non scarichi questi checkpoint PyTorch. Scarichi una conversione Core ML, e Argmax ne pubblica molte varianti. Eccone alcune dal loro repository, con il peso di ogni download:

Alcune build Core ML di Whisper pubblicate da Argmax
Variante Dimensione del download Note
small circa 216 MB Veloce e leggero; meno preciso
distil-large-v3 circa 594 MB Modello large distillato
large-v3-v20240930 (turbo) circa 547 MB o 626 MB Due build compresse di large-v3 turbo
large-v3 circa 947 MB Il modello large completo

Dimensioni dal repository argmaxinc/whisperkit-coreml su Hugging Face, verificato a novembre 2026.

Usiamo large-v3-v20240930_626MB. Il nome v20240930 è la release in cui OpenAI ha aggiunto large-v3 turbo, che OpenAI descrive come una versione ottimizzata di large-v3 con una trascrizione più veloce e una perdita di precisione minima. La sua configurazione conferma il trucco: l’encoder completo a 32 livelli, ma solo 4 livelli nel decoder.

Perché proprio questo? Ci serviva che l’italiano venisse bene, non solo l’inglese, e con questo modello l’italiano era corretto nei nostri test. Sul nostro Mac di sviluppo trascriveva circa 15 secondi di audio in 3 secondi. È anche il modello che Argmax usa negli esempi del suo README.

Il prezzo è il peso: 626 MB sono tanti per un’app che per il resto è piccola. Lo scarichiamo una sola volta, nella cartella Application Support dell’app, e diciamo all’utente cosa sta succedendo.

Il primo caricamento: tre minuti e un disco pieno

Il download non era la parte lenta. La prima volta che abbiamo caricato il modello ci sono voluti circa tre minuti prima di trascrivere qualsiasi cosa, e ha usato molto spazio temporaneo su disco. Una volta, ha riempito il disco.

  1. Primo caricamento

    Circa tre minuti prima della prima parola

    Più molto spazio temporaneo su disco. Una volta ha riempito il disco.

  2. La causa

    La specializzazione di Core ML

    Al primo caricamento il modello viene compilato per il tuo chip e messo in cache fuori dall'app.

  3. La modifica

    Caricarlo durante la configurazione

    Il modello viene scaricato e caricato una volta durante l'onboarding, così l'attesa arriva prima della prima registrazione.

La documentazione di WhisperKit spiega il perché. I modelli Core ML vengono scaricati in un formato indipendente dal dispositivo e devono essere “specializzati” per il tuo chip prima di poter girare. Core ML lo fa la prima volta che il modello si carica, e mette i file specializzati in cache sul disco, fuori dall’app. Quella cache la gestisce Apple, e viene svuotata dopo ogni aggiornamento del sistema operativo o se il modello non viene usato per molto tempo. Quando la cache c’è, il caricamento richiede pochi secondi: circa 3 secondi, nel nostro caso.

Cosa abbiamo cambiato dopo averlo scoperto:

  1. Preparare il modello durante la configurazione iniziale. Mentre concedi i permessi e scegli una scorciatoia, JustRec scarica il modello e lo carica una volta, poi lo scarica dalla memoria. I tre minuti passano prima della tua prima registrazione, non dopo.
  2. Mostrare l’avanzamento. Il download mostra a che punto è, così un primo download pesante non sembra un’app bloccata.
  3. Aspettarselo di nuovo dopo gli aggiornamenti di macOS. Siccome la cache può essere svuotata, la prima trascrizione dopo un aggiornamento può essere di nuovo lenta. È normale.
  4. Lasciare spazio sul disco. Se il Mac è quasi pieno, è nella fase di specializzazione che te ne accorgi.

Dalla registrazione al file dei sottotitoli

La pipeline è breve, e quasi tutto il lavoro sta nei dettagli.

L’audio dalla traccia giusta. Registriamo il microfono e l’audio di sistema in file separati (l’articolo su ScreenCaptureKit spiega perché). Per i sottotitoli usiamo solo il microfono, oppure l’audio di sistema se il microfono non c’è. Così nessun suono di notifica o colonna sonora di un video confonde il modello, e la trascrizione può partire subito invece di aspettare l’MP4 esportato.

16 kHz mono. Whisper si aspetta audio mono a 16 kHz. Leggiamo la traccia con un AVAssetReaderAudioMixOutput che converte mentre legge. Se una registrazione ha più pezzi di microfono (hai cambiato microfono a metà), vengono posizionati ai loro veri tempi di inizio e ogni buco viene riempito di silenzio, così i timestamp restano allineati con il video.

let options = DecodingOptions(
    language: code,               // nil significa "rileva"
    detectLanguage: code == nil,
    skipSpecialTokens: true,
    wordTimestamps: true,
    chunkingStrategy: .vad        // divide in base all'attività vocale
)
let results = try await pipe.transcribe(audioArray: samples, decodeOptions: options)

Dai timestamp delle parole a sottotitoli leggibili. I segmenti di Whisper sono spesso troppo lunghi per un sottotitolo. Chiediamo i timestamp delle parole e ricostruiamo noi i blocchi: al massimo 84 caratteri e 6 secondi per blocco, un a capo dopo un punto o un punto interrogativo quando la riga ha già una certa lunghezza, e due righe bilanciate per lunghezza. I blocchi sovrapposti vengono accorciati, così non ne compaiono mai due insieme.

Due file accanto al video. Il risultato viene salvato in SRT e VTT accanto all’MP4 nella tua libreria. Quando condividi, il VTT viene caricato con il video; se i sottotitoli finiscono dopo il caricamento, vengono aggiunti al link appena sono pronti. Le prime parole diventano anche il titolo suggerito del video.

Se vuoi fare lo stesso per le tue registrazioni con qualsiasi strumento, la nostra guida per aggiungere sottotitoli a una registrazione dello schermo su Mac passa in rassegna le opzioni.

Il riconoscimento della lingua

Nelle Impostazioni, i sottotitoli si possono impostare su automatico, italiano o inglese. In automatico, Whisper identifica la lingua prima di trascrivere, e noi registriamo nei log quella rilevata. Funziona con le lingue supportate da JustRec, tra cui inglese, italiano, spagnolo, francese, tedesco e portoghese, e questo conta per le agenzie che lavorano oltre confine.

Il rilevamento automatico ha i soliti punti deboli: registrazioni molto brevi, registrazioni che iniziano con un silenzio, o qualcuno che cambia lingua a metà. Se parli sempre la stessa lingua, impostala a mano e l’incertezza sparisce.

Cosa diremmo a un altro sviluppatore

Integrare Whisper in un'app per Mac

  • Scegli il modello in base alle lingue dei tuoi utenti, non ai benchmark in inglese.
  • Metti in conto il primo caricamento: download, poi specializzazione di Core ML, poi il lavoro vero.
  • Fai quel primo caricamento durante l’onboarding, con l’avanzamento visibile.
  • Trascrivi la traccia audio più pulita che hai, non il mix finale.
  • Costruisci i tuoi blocchi dai timestamp delle parole; i segmenti grezzi si leggono male.
  • Prova con poco spazio su disco e dopo un aggiornamento di macOS.

Cosa viene dopo

I sottotitoli tradotti sono in programma: la trascrizione resta sul Mac, e anche la traduzione ci resterebbe. Teniamo d’occhio anche SpeechAnalyzer di Apple per il giorno in cui il nostro macOS minimo lo permetterà.

Per capire perché i sottotitoli contano per chi guarda, leggi sottotitoli: così i tuoi video si guardano anche senza audio. Per tutto il resto che fa l’app, l’elenco delle funzioni lo raccoglie in un solo posto.

Fonti

Domande frequenti

Si può usare Whisper su un Mac senza cloud?

Sì. I pesi di Whisper sono open source con licenza MIT, e librerie come WhisperKit li convertono in Core ML per farli girare in locale su Apple Silicon. Dopo aver scaricato il modello una volta, la trascrizione non ha bisogno di internet.

Quanto è grande il modello Whisper?

Dipende dalla variante. Tra le build Core ML di Argmax, small pesa circa 216 MB e large-v3 completo circa 947 MB. JustRec usa una build compressa di large-v3 turbo di circa 626 MB.

Perché il primo caricamento di Whisper su Mac è così lento?

La prima volta che il modello viene caricato, Core ML lo specializza per il tuo chip e salva il risultato in cache sul disco. Con il nostro modello ci sono voluti circa tre minuti. I caricamenti successivi usano la cache e richiedono pochi secondi, finché un aggiornamento di macOS non la svuota.

Whisper riconosce la lingua in automatico?

Sì, Whisper può identificare la lingua parlata prima di trascrivere. Se parli sempre la stessa lingua, impostarla a mano evita qualche errore sulle registrazioni brevi o in più lingue.

JustRec manda la mia voce a un servizio di intelligenza artificiale?

No. I sottotitoli vengono generati sul tuo Mac da un modello di riconoscimento vocale che gira in locale. Quando condividi il video, insieme a lui viene caricato solo il file dei sottotitoli.

Scritto da

Nicolas Ricardi

Maker of JustRec, at Nube

Nicolas makes JustRec at Nube, a web studio in Italy. He built it for the videos Nube sends to its own clients: design reviews, handovers and quotes explained in a few minutes instead of a meeting.

www.wearenube.dev
Dietro le quinte