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 :
| 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 :
| 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.
Premier chargement
Environ trois minutes avant le premier mot
Plus beaucoup d’espace disque temporaire. Une fois, le disque s’est rempli.
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.
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 :
- 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.
- Afficher la progression. Le téléchargement indique sa progression : un gros premier téléchargement ne ressemble pas à une app figée.
- 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.
- 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
- OpenAI Whisper sur GitHub : tailles des modèles, paramètres, mémoire et vitesse relative, turbo, licence MIT, consulté en novembre 2026.
- Journal des modifications d’OpenAI Whisper : la version v20240930 ajoute le modèle large-v3-turbo, consulté en novembre 2026.
- Argmax OSS Swift (WhisperKit) sur GitHub : configuration requise, téléchargement des modèles, licence MIT, consulté en novembre 2026.
- Code source de configuration de WhisperKit, prewarm et spécialisation Core ML, consulté en novembre 2026.
- Modèles Core ML WhisperKit d’Argmax sur Hugging Face : noms et tailles des variantes, consulté en novembre 2026.
- Configuration du modèle openai_whisper-large-v3-v20240930_626MB : 32 couches d’encodeur, 4 couches de décodeur, consulté en novembre 2026.
- Apple Developer : SpeechAnalyzer (macOS 26.0), consulté en novembre 2026.
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.



