FR

Faire tourner Whisper sur Mac : des sous-titres sans le cloud

Comment nous faisons tourner Whisper sur Mac avec WhisperKit et Core ML : pourquoi en local, quel modèle, le premier chargement de 3 minutes, le disque et la langue.

Nicolas Ricardi8 min de lecture

En bref

  • JustRec crée les sous-titres avec Whisper, qui tourne sur le Mac grâce à WhisperKit : votre voix ne quitte jamais votre ordinateur.
  • Nous utilisons une version Core ML compressée de Whisper large-v3 turbo d’environ 626 Mo, téléchargée une seule fois.
  • Le premier chargement a pris environ trois minutes et beaucoup d’espace disque temporaire, car Core ML spécialise le modèle pour votre puce ; ensuite, il se charge en quelques secondes.
  • La transcription démarre à partir de la piste micro dès que vous arrêtez, en parallèle de l’export de la vidéo.

Vous pouvez faire tourner Whisper sur un Mac entièrement en local : les poids du modèle sont open source, et WhisperKit les exécute via Core ML sur les puces Apple. C’est ainsi que JustRec crée les sous-titres de chaque enregistrement sans envoyer une seconde d’audio à qui que ce soit. Ci-dessous : comment nous l’avons mis en place, quel modèle nous avons choisi, et ce qui nous a surpris (un téléchargement de 626 Mo, un premier chargement d’environ trois minutes et, une fois, un disque plein).

Pourquoi les sous-titres devaient tourner sur le Mac

La promesse de notre page d’accueil est simple : votre voix n’est jamais envoyée à une IA externe. Nos utilisateurs enregistrent du travail client : une revue de design avec des noms à l’écran, un devis expliqué ligne par ligne, un bug dans l’interface d’administration d’un client. Envoyer cet audio à une API de transcription voudrait dire une entreprise de plus qui traite les données de leurs clients, une ligne de plus dans une politique de confidentialité, et une chose de plus à expliquer à un client prudent. Garder la voix sur le Mac colle au reste du produit, conçu en local-first, avec des copies partagées stockées dans l’UE.

Il y avait aussi des raisons pratiques :

  • Aucun coût à la minute. Une API cloud facture chaque minute d’audio. Sur le Mac, le coût, c’est l’électricité de l’utilisateur.
  • Ça marche hors ligne. Une fois le modèle téléchargé, les sous-titres fonctionnent dans un train.
  • Des sous-titres avant la mise en ligne. La transcription peut démarrer dès que vous appuyez sur stop, pendant que la vidéo s’exporte encore.

Nous avons écrit une comparaison plus longue et non technique dans transcription locale ou dans le cloud. Cet article en est le versant technique.

WhisperKit et Core ML

Whisper est le modèle de reconnaissance vocale d’OpenAI, publié avec son code et ses poids sous licence MIT. Il gère la reconnaissance vocale multilingue et l’identification de la langue, ce qu’il nous faut pour des sous-titres dans la langue que vous parlez.

Pour bien le faire tourner sur un Mac, il le faut au format Core ML, afin qu’il puisse utiliser le Neural Engine et le GPU. Nous utilisons WhisperKit, qui fait partie du SDK Swift open source d’Argmax (licence MIT). Il télécharge des versions Core ML de Whisper depuis Hugging Face, les met en cache en local, et fournit une API Swift de transcription avec horodatage des mots et détection d’activité vocale. Il demande macOS 14, en dessous de notre propre minimum, macOS 15.

Nous avons aussi regardé SpeechAnalyzer, d’Apple. C’est prometteur, mais il demande macOS 26, et JustRec prend en charge macOS 15. WhisperKit tourne partout où notre app tourne.

Choisir le modèle

Whisper existe en plusieurs tailles, et le compromis est le classique : les plus gros modèles sont plus précis et plus lents. Le tableau d’OpenAI :

Tailles des modèles Whisper, telles qu’OpenAI les publie
Taille Paramètres Mémoire nécessaire Vitesse relative
tiny 39 M environ 1 Go environ 10x
base 74 M environ 1 Go environ 7x
small 244 M environ 2 Go environ 4x
medium 769 M environ 5 Go environ 2x
large 1 550 M environ 10 Go 1x
turbo 809 M environ 6 Go environ 8x

D’après le README d’openai/whisper, consulté en novembre 2026. La vitesse relative compare les modèles entre eux, pas avec un Mac.

Turbo est la ligne intéressante : proche du grand modèle, avec environ moitié moins de paramètres et une vitesse bien supérieure. Sur un Mac, toutefois, vous ne téléchargez pas ces checkpoints PyTorch. Vous téléchargez une conversion Core ML, et Argmax en publie de nombreuses variantes. En voici quelques-unes tirées de leur dépôt, avec la taille de chaque téléchargement :

Quelques versions Core ML de Whisper publiées par Argmax
Variante Taille du téléchargement Remarques
small environ 216 Mo Rapide et léger ; moins précis
distil-large-v3 environ 594 Mo Grand modèle distillé
large-v3-v20240930 (turbo) environ 547 Mo ou 626 Mo Deux versions compressées de large-v3 turbo
large-v3 environ 947 Mo Le grand modèle complet

Tailles d’après le dépôt argmaxinc/whisperkit-coreml sur Hugging Face, consulté en novembre 2026.

Nous utilisons large-v3-v20240930_626MB. Le nom v20240930 correspond à la version dans laquelle OpenAI a ajouté large-v3 turbo, qu’OpenAI décrit comme une version optimisée de large-v3, à la transcription plus rapide pour une perte de précision minime. Sa configuration confirme l’astuce : l’encodeur complet à 32 couches, mais seulement 4 couches de décodeur.

Pourquoi celui-ci ? Il fallait que l’italien sorte juste, pas seulement l’anglais, et avec ce modèle l’italien était correct lors de nos tests. Sur notre Mac de développement, il transcrivait environ 15 secondes d’audio en 3 secondes. C’est aussi le modèle qu’Argmax utilise dans les exemples de son propre README.

Le prix à payer, c’est la taille : 626 Mo, c’est beaucoup demander pour une app par ailleurs légère. Nous le téléchargeons une seule fois, dans le dossier Application Support de l’app, et nous expliquons à l’utilisateur ce qui se passe.

Le premier chargement : trois minutes et un disque plein

Le téléchargement n’était pas la partie lente. La première fois que nous avons chargé le modèle, il a fallu environ trois minutes avant de transcrire quoi que ce soit, et beaucoup d’espace disque temporaire. Une fois, le disque s’est rempli.

  1. Premier chargement

    Environ trois minutes avant le premier mot

    Plus beaucoup d’espace disque temporaire. Une fois, le disque s’est rempli.

  2. La cause

    La spécialisation Core ML

    Le modèle est compilé pour votre puce au premier chargement et mis en cache hors de l’app.

  3. Le changement

    Le charger pendant la configuration

    Le modèle est téléchargé et chargé une fois pendant la prise en main, pour que l’attente ait lieu avant le premier enregistrement.

La documentation de WhisperKit explique pourquoi. Les modèles Core ML sont téléchargés dans un format indépendant de l’appareil et doivent être « spécialisés » pour votre puce avant de tourner. Core ML le fait au premier chargement du modèle, et met les fichiers spécialisés en cache sur le disque, hors de l’app. C’est Apple qui gère ce cache, et il est vidé après chaque mise à jour du système ou si le modèle n’est pas utilisé pendant longtemps. Quand le cache est disponible, le chargement prend quelques secondes : environ 3 secondes chez nous.

Ce que nous avons changé après l’avoir compris :

  1. Préparer le modèle pendant la configuration initiale. Pendant que vous accordez les autorisations et choisissez un raccourci, JustRec télécharge le modèle, le charge une fois, puis le décharge. Les trois minutes ont lieu avant votre premier enregistrement, pas après.
  2. Afficher la progression. Le téléchargement indique sa progression : un gros premier téléchargement ne ressemble pas à une app figée.
  3. S’y attendre à nouveau après les mises à jour de macOS. Comme le cache peut être vidé, la première transcription après une mise à jour peut être lente à nouveau. C’est normal.
  4. Garder de la place sur le disque. Si votre Mac est presque plein, c’est à l’étape de spécialisation que vous le sentirez.

De l’enregistrement au fichier de sous-titres

La chaîne est courte, et l’essentiel du travail est dans les détails.

L’audio de la bonne piste. Nous enregistrons le micro et l’audio système dans des fichiers séparés (l’article sur ScreenCaptureKit explique pourquoi). Pour les sous-titres, nous utilisons le micro seul, ou l’audio système s’il n’y a pas de micro. Ainsi, ni sons de notification ni bandes-son de vidéos ne perturbent le modèle, et la transcription peut démarrer tout de suite au lieu d’attendre le MP4 exporté.

16 kHz mono. Whisper attend un audio mono à 16 kHz. Nous lisons la piste avec un AVAssetReaderAudioMixOutput qui convertit à la lecture. Si un enregistrement contient plusieurs morceaux de micro (vous avez changé de micro en cours de route), ils sont placés à leur heure de début réelle et les trous sont comblés par du silence : les horodatages restent alignés sur la vidéo.

let options = DecodingOptions(
    language: code,               // nil : détection automatique
    detectLanguage: code == nil,
    skipSpecialTokens: true,
    wordTimestamps: true,
    chunkingStrategy: .vad        // découpage selon l’activité vocale
)
let results = try await pipe.transcribe(audioArray: samples, decodeOptions: options)

Des horodatages de mots aux sous-titres lisibles. Les segments de Whisper sont souvent trop longs pour un sous-titre. Nous demandons l’horodatage des mots et reconstruisons nous-mêmes les sous-titres : 84 caractères et 6 secondes au maximum par sous-titre, un retour après un point ou un point d’interrogation dès qu’une ligne a une certaine longueur, et deux lignes équilibrées en longueur. Les sous-titres qui se chevauchent sont raccourcis pour que deux ne s’affichent jamais en même temps.

Deux fichiers à côté de la vidéo. Le résultat est sauvegardé en SRT et en VTT à côté du MP4 dans votre bibliothèque. Quand vous partagez, le VTT est mis en ligne avec la vidéo ; si les sous-titres sont terminés après la mise en ligne, ils sont ajoutés au lien dès qu’ils sont prêts. Les premiers mots deviennent aussi le titre proposé pour la vidéo.

Si vous voulez faire la même chose pour vos propres enregistrements, avec n’importe quel outil, notre guide pour ajouter des sous-titres à un enregistrement d’écran sur Mac passe les options en revue.

La détection de la langue

Dans les réglages, les sous-titres peuvent être réglés sur automatique, italien ou anglais. En automatique, Whisper identifie la langue avant de transcrire, et nous enregistrons dans les journaux ce qu’il a détecté. Cela fonctionne pour les langues que JustRec prend en charge, dont l’anglais, l’italien, l’espagnol, le français, l’allemand et le portugais, ce qui compte pour les agences qui travaillent au-delà des frontières.

La détection automatique a ses points faibles habituels : les enregistrements très courts, ceux qui commencent par un silence, ou quelqu’un qui change de langue en cours de route. Si vous parlez toujours la même langue, réglez-la à la main et la devinette disparaît.

Ce que nous dirions à un autre développeur

Intégrer Whisper dans une app Mac

  • Choisissez le modèle selon les langues de vos utilisateurs, pas selon des benchmarks en anglais.
  • Prévoyez le premier chargement : le téléchargement, puis la spécialisation Core ML, puis le vrai travail.
  • Faites ce premier chargement pendant la prise en main, avec une progression visible.
  • Transcrivez la piste audio la plus propre dont vous disposez, pas le mixage final.
  • Construisez vos propres sous-titres à partir de l’horodatage des mots ; les segments bruts se lisent mal.
  • Testez avec peu d’espace disque et après une mise à jour de macOS.

La suite

Les sous-titres traduits sont prévus : la transcription reste sur le Mac, et la traduction aussi. Nous surveillons également SpeechAnalyzer, d’Apple, pour le jour où notre version minimale de macOS le permettra.

Pour comprendre pourquoi les sous-titres comptent pour ceux qui regardent, voyez sous-titres vidéo : des vidéos regardées même sans le son. Pour tout le reste de ce que fait l’app, la liste des fonctionnalités rassemble tout au même endroit.

Sources

Questions fréquentes

Peut-on faire tourner Whisper sur un Mac sans le cloud ?

Oui. Les poids de Whisper sont open source sous licence MIT, et des bibliothèques comme WhisperKit les convertissent en Core ML pour qu’ils tournent en local sur les puces Apple. Une fois le modèle téléchargé, la transcription n’a besoin d’aucune connexion Internet.

Quelle est la taille du modèle Whisper ?

Cela dépend de la variante. Parmi les versions Core ML d’Argmax, small pèse environ 216 Mo et le large-v3 complet environ 947 Mo. JustRec utilise une version compressée de large-v3 turbo d’environ 626 Mo.

Pourquoi le premier chargement de Whisper est-il si lent sur Mac ?

Core ML spécialise le modèle pour votre puce la première fois qu’il est chargé, et met le résultat en cache sur le disque. Avec notre modèle, cela a pris environ trois minutes. Les chargements suivants utilisent le cache et prennent quelques secondes, jusqu’à ce qu’une mise à jour de macOS le vide.

Whisper détecte-t-il la langue automatiquement ?

Oui, Whisper peut identifier la langue parlée avant de transcrire. Si vous parlez toujours la même langue, la régler à la main évite les erreurs occasionnelles sur les enregistrements courts ou qui mélangent les langues.

JustRec envoie-t-il ma voix à un service d’IA ?

Non. Les sous-titres sont générés sur votre Mac par un modèle de transcription qui tourne en local. Seul le fichier de sous-titres est mis en ligne avec la vidéo quand vous la partagez.

Écrit par

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
En coulisses