Aller au contenu
Chandler Nguyen
IA12 min de lecture

J'ai essayé de remplacer ElevenLabs par une application vocale locale sur un Mac de 16 Go

VoiceStudio est arrivé sur GitHub Trending comme une alternative entièrement locale à ElevenLabs. Je l'ai installé sur un Mac de 16 Go, j'ai rencontré les pannes que personne ne montre en démo, et j'ai utilisé le pipeline qui a survécu pour produire les éditions chinoise et coréenne de mon cours.

VoiceStudio a atteint la place de n° 1 sur GitHub Trending en septembre. C'est la description qui m'a accroché : l'alternative open source à ElevenLabs, entièrement locale — clonage vocal, doublage, catalogue de 646 langues, sans compte, sans clé API, sans facture au caractère.

J'avais payé près de $200 à ElevenLabs pour les narrations anglaise et japonaise. La question n'était donc pas abstraite. Un Mac de 16 Go peut-il faire tourner ce truc ? Est-ce difficile à installer ? La voix est-elle assez bonne pour être proposée à des clients payants ? Et si la réponse est oui, que vend exactement ElevenLabs qu'une application locale ne peut pas offrir ?

L'historique git de cette expérience va du 17 octobre 2026 (le premier commit de spécification TTS local) au 26 octobre (les deux éditions localisées terminées). Cela fait neuf jours, pas un trimestre. Les jeux audio chinois et coréen sont complets : 258 paires chacun, 3 h 06 et 3 h 25 de narration.

Ce qu'est réellement VoiceStudio

VoiceStudio est une application de bureau, pas un script Python à surveiller. Elle encapsule une API locale et expose un catalogue de 16 moteurs TTS et 11 moteurs de reconnaissance vocale derrière une seule interface. Elle tourne sur macOS, Windows, Linux et Docker. L'application est sous AGPL-3.0 (dépôt, consulté le 25 octobre 2026).

Le dépôt comptait environ 85,000 étoiles au 25 octobre, environ six mois après sa création le 9 avril 2026. Il a été le premier dépôt sur GitHub Trending à au moins deux reprises en septembre. La licence est la première surprise. L'application est open source ; les poids des modèles ne relèvent pas automatiquement de la même licence. Le moteur OmniVoice par défaut a des conditions distinctes, et ses poids préentraînés sont non commerciaux (fiche du modèle, consultée le 25 octobre 2026). CosyVoice 3 — le moteur que j'ai fini par utiliser — est sous Apache-2.0. VoxCPM2 est aussi sous Apache-2.0.

Cette distinction est la première vraie leçon. « Alternative open source à ElevenLabs » décrit l'application. Cela ne dit rien des poids, des voix ou de la sortie. Si tu utilises cet outil pour un travail payant, tu dois faire toi-même l'archéologie des licences, moteur par moteur.

Un Mac de 16 Go peut-il le faire tourner ?

Oui. Pas toujours bien, et pas toujours avec le moteur que tu voulais.

L'installation n'était pas le plus dur. Installer l'application, l'ouvrir, choisir un moteur, le laisser télécharger les poids. Le vrai défi était de trouver un moteur capable d'aller au bout d'un batch de 258 slides sur cette machine sans s'effondrer.

J'ai d'abord essayé VoxCPM2. Il tourne sur le MPS d'Apple et sonne bien. Sous charge, sur un Mac Apple Silicon de 16 Go, il a fait chuter la mémoire libre à environ 8%, le swap a dépassé 9 GB et les requêtes ont expiré. Un pilote du module 1 a produit 1 slide sur 36 avant que je l'arrête. Le modèle ne produisait pas une mauvaise voix ; il n'arrivait pas à terminer un long batch sous pression mémoire.

Je suis passé à CosyVoice 3 sur CPU. Il est allé au bout de la charge de travail. L'extrait de référence doit durer 30 secondes ou moins, ce qui est une vraie contrainte quand on clone une voix. L'échantillon de 30 secondes que j'ai utilisé était en mono 24 kHz.

Puis le batch a quand même échoué — pour une raison qui n'avait rien à voir avec le modèle.

L'échec qui ressemblait à un problème de modèle

Au bout d'une heure, j'avais 4 paires audio sur 258. Les logs montraient des nouvelles tentatives, puis des 429 du pool de workers local, puis des jobs orphelins. La conclusion évidente était que le moteur local ne gérait pas le chinois.

Si. Le problème venait du fetch de Node. Son timeout de headers par défaut est de cinq minutes. Certaines slides chinoises prenaient cinq à sept minutes à synthétiser. Le client abandonnait la requête pendant que le worker la générait encore, puis réessayait et ajoutait un second job pour la même slide. La file se remplissait de travail que plus personne n'attendait.

Une nouvelle tentative ne répare rien si le serveur travaille encore sur la requête que tu as abandonnée.

Une fois la génération vocale passée par un transport Node http/https avec un timeout plus long, le module 1 a terminé 36/36. Le premier checkpoint chinois complet a atteint 258/258 paires et 3 h 05 m 57 s de narration. Il a fallu 28 h 12 m 41 s de temps calendaire entre le premier et le dernier fichier — un chiffre qui inclut les échecs, les pauses, le durcissement et les nouvelles tentatives, pas un benchmark de synthèse propre. La pire slide a pris 37 minutes sur trois tentatives.

Voilà à quoi ressemble honnêtement l'inférence locale. Le modèle n'est pas une boîte magique qui transforme du texte en audio à la vitesse de la démo. C'est un job par lots avec une longue traîne, et c'est dans cette traîne que se trouve l'ingénierie.

La machine a dicté l'architecture

Un Mac de 16 Go n'est pas un serveur TTS. Les slides normales se terminaient en 2–6 minutes ; les pathologiques prenaient 13–23. La pire a pris 37m 09s sur trois tentatives. Chaque amélioration sérieuse du pipeline visait à survivre à la lenteur de la machine, pas à battre un service hébergé sur la vitesse.

Les mécanismes qui ont survécu :

  • Un point d'extension TtsEngine, pour pouvoir choisir explicitement une narration locale ou hébergée au lieu de la câbler en dur. Ce point d'extension a été ajouté le 19 octobre ; la sélection locale a suivi le 21 octobre.
  • Un vrai timeout de transport, parce que l'hypothèse par défaut de cinq minutes était plus courte que le travail.
  • Des verrous de run unique et de workers, un arrêt en cas d'échec, et un worker purgé avant toute nouvelle tentative, parce que réessayer sur un moteur occupé n'est pas une nouvelle tentative.
  • Des chunks de phrases avec reprise, parce que recommencer une slide de 30 minutes à zéro gaspille la seule ressource rare de la machine.
  • Un remplacement sûr, parce qu'une nouvelle prise ratée ne doit pas détruire une bonne prise existante.
  • Une réinitialisation du worker à chaque module, par précaution contre la dérive de mémoire sur un long run.
  • Une normalisation de la fréquence d'échantillonnage, parce qu'un assemblage a produit une piste audio de 63 minutes en concaténant des segments à 24 kHz et 44.1 kHz. Le fichier semblait plausible jusqu'à ce que je vérifie sa durée.
  • caffeinate -i, documenté le 24 octobre — le huitième jour. Je faisais tourner des batches de plusieurs heures sur un Mac libre de faire la sieste. C'est la ligne la moins sophistiquée du pipeline et peut-être la plus importante. Je me suis senti comme un noob. J'en étais un.

L'idée n'est pas que le pipeline soit impressionnant. C'est que le pipeline est le produit. Les huit jours ont servi à faire se comporter un moteur local lent comme de l'infrastructure : arrêt en cas d'échec, reprise là où ça a cassé, ne jamais remplacer une bonne prise par une prise non vérifiée, et garder la machine éveillée.

Pourquoi le cantonais est absent

Le 21 octobre, j'ai retiré le cantonais du programme. La raison tenait aux preuves, pas à l'idéologie : aucun parcours local en cantonais n'était validé pour ce cours. VoxCPM2 ne prenait pas en charge yue. CosyVoice liste yue, mais je ne l'avais pas validé pour ce cours. J'aurais pu livrer une supposition, ou utiliser une voix que personne n'avait écoutée dans cette langue. Une mauvaise édition cantonaise est pire que pas d'édition cantonaise. Le site a toujours une locale zh-HK pour les articles ; le cours est en chinois simplifié, pas en chinois traditionnel ni en cantonais.

Le pipeline peut produire un fichier dans une langue pour laquelle le modèle n'a pas été validé. Le filtre final doit être un humain qui dit non.

258/258 ne veut pas dire correct

Le premier checkpoint chinois complet comportait 16 slides avec au moins une phrase manquante. Le nombre de slides était bon. Les paires existaient. La narration restait incorrecte sur seize slides. Elles ont été repérées en vérifiant la couverture du texte par rapport au script, puis réparées une par une.

Cela a changé le critère de validation. « Tous les fichiers existent » est devenu « tous les fichiers existent, la narration couvre le script, et un échantillon de chaque module a été écouté ». La parité complète est le critère ; un batch vert n'est pas le produit.

La qualité est-elle suffisante ?

Les échantillons réparés que j'ai écoutés sont assez bons pour ce cours ; l'acceptation complète est un contrôle distinct. C'est un choix que j'assume en tant que propriétaire, pas une certification.

J'ai transcrit l'audio avec l'ASR local et je l'ai comparé au script. La moyenne des premiers contrôles ponctuels était de 0.903. Celle du checkpoint chinois complet était de 0.908. Ce sont des scores normalisés de similarité textuelle, pas des mesures du naturel ni de la similarité avec le locuteur. La pire slide — module 4, slide 8 — a obtenu 0.776 ; un nom de marque y a été mal reconnu. Une slide avec alternance de langues dans le module 6 a produit du charabia, puis un paragraphe répété, puis une troncature ; le découpage au niveau de la phrase l'a réparée à 0.909.

La voix est claire, régulière et, à mon oreille, reconnaissable comme la mienne. Elle n'a pas le fini d'ElevenLabs. Les éditions chinoise et coréenne n'ont pas été relues ligne par ligne par un locuteur natif ; je les ai relues avec un éditeur IA et j'ai écouté des échantillons. Cette limite a sa place sur la page du cours, pas seulement dans un billet de blog.

Si ton critère est « on dirait une voix off de studio », paie quelqu'un. Si ton critère est « claire, régulière, la mienne et suffisamment bonne pour enseigner », l'option locale est désormais accessible.

Ce que ça a coûté

ElevenLabs : près de $200 pour les narrations anglaise et japonaise, y compris le clone de voix.

En local : un Mac, aucune facture TTS supplémentaire au caractère pour ces runs, aucune dépense cloud de TTS ou d'ASR. Le premier checkpoint chinois a coûté 28 heures de temps calendaire pour 3 heures d'audio, plus le temps d'ingénierie et de QA du tableau ci-dessus. La consommation d'électricité n'a pas été mesurée.

Les $200 ont payé une voix, un workflow et la disponibilité assurée par quelqu'un d'autre. Le chemin local a apporté moins de dépendance à une API de narration hébergée, un traitement local de la voix et une facture qui n'augmente pas à chaque nouveau rendu — et il a coûté des jours d'ingénierie sur un timeout qui n'a jamais été dans le modèle. La rédaction des traductions utilisait encore Claude dans le cloud ; la narration et l'ASR sont les seuls éléments restés sur le Mac.

Alors, ElevenLabs est-il vraiment défendable ?

C'est là que je dois être prudent, parce qu'un cours sur un Mac ne constitue pas un marché.

Ce qui a changé pour cette charge de travail, c'est la facture marginale de narration. Si tu es autorisé à cloner la voix, que la charge est traitée par lots, que tu peux vérifier la sortie et tolérer une traîne lente, l'inférence locale supprime le coût au caractère d'une passe ou d'une langue supplémentaire. C'est une vraie considération pour un développeur qui choisit une API pour un pipeline par lots.

Ce qu'un service hébergé apporte encore est plus difficile à remplacer :

  • Un plafond de qualité. La sortie que j'ai testée en local n'est pas la meilleure voix hébergée que j'aie entendue.
  • La latence. Un batch local prend des minutes par slide. Un produit qui répond en temps réel pose un problème d'ingénierie différent.
  • La fiabilité opérationnelle. J'ai dû déboguer un timeout de cinq minutes, un plafond de mémoire, la purge d'un worker et une licence.
  • Les droits sur les voix et la conformité. Le clonage est une surface juridique, pas une fonctionnalité. L'utilisation d'une API hébergée ne décharge pas le client de sa responsabilité de détenir les droits et les consentements.
  • L'étendue. CosyVoice liste la prise en charge de mes quatre langues de lancement ; j'ai validé le chinois, et la validation du coréen est en cours. Un produit mondial en demande bien plus.

La conclusion honnête est plus étroite qu'« l'open source tue ElevenLabs ». L'inférence locale a changé le calcul pour ma charge de re-rendus par lots. Elle n'a pas remplacé le produit auquel tu fais appel quand la latence interactive, un large catalogue de voix, un support contractuel ou un plafond de qualité précis comptent. Ce sont mes appréciations issues d'un seul projet, pas une prévision de marché.

Pourquoi c'est devenu l'histoire d'un cours

Je ne suis pas parti pour écrire sur les modèles vocaux. Je suis parti pour livrer un cours dans plus de langues que je ne pouvais en produire seul.

Le même modèle opérationnel que celui enseigné dans le cours est ce qui a produit l'édition chinoise et produit l'édition coréenne : recherche, plan, construction d'un pipeline, vérification de la sortie, conservation des parties dont un humain doit rester responsable. Un seul opérateur publicitaire, Claude pour rédiger les traductions, une voix locale à poids ouverts pour la narration, aucun prestataire de localisation, aucun studio de doublage.

C'est ainsi que j'ai appliqué des parties du modèle opérationnel à mon propre produit.

Si tu travailles dans la pub et te demandes si l'IA est une menace ou un levier, voici la version levier. Tu n'as pas besoin d'une grande équipe. Tu as besoin de goût, d'une checklist et de la volonté de déboguer le dernier kilomètre.

Ce que je dirais à un autre développeur

  • Essaie le local quand tu es autorisé à cloner la voix, que la charge est traitée par lots, que tu peux vérifier la sortie et tolérer une traîne lente.
  • Paie pour l'hébergé quand tu as besoin d'une latence temps réel, d'un large catalogue de voix, d'une disponibilité contractuelle ou d'un plafond de qualité précis.
  • Vérifie la licence des poids avant de construire un produit payant sur une application « open source ». AGPL-3.0 autorise l'usage commercial sous ses conditions ; les poids du modèle et les droits sur la voix sont des questions séparées.
  • Teste le pire cas, pas la démo. Le pire cas n'est pas un prompt plus long. C'est une longue slide avec alternance de langues, un timeout de transport et une file de nouvelles tentatives en même temps.

FAQ

Un Mac de 16 Go peut-il faire tourner un clonage vocal local ?

Oui. CosyVoice 3 tourne sur CPU ; VoxCPM2 avait besoin de plus de marge mémoire que cette machine n'en avait sous charge. Compte des minutes par slide, pas des secondes.

Un TTS open source est-il assez bon pour un cours payant ?

Les échantillons chinois réparés que j'ai écoutés sont clairs et réguliers, sans fini de studio. C'est un choix que j'assume en tant que propriétaire, pas une validation par un locuteur natif.

VoiceStudio est-il gratuit pour un usage commercial ?

L'application est sous AGPL-3.0, qui autorise l'usage commercial sous ses conditions. Les poids des modèles ont leurs propres licences ; les poids préentraînés d'OmniVoice sont non commerciaux. Vérifie chaque moteur avant de livrer.

Les éditions chinoise et coréenne ont-elles été traduites par IA ?

Oui — les brouillons ont été rédigés avec Claude puis relus avec un éditeur IA, pas par un locuteur natif. La narration et l'ASR ont tourné en local avec CosyVoice 3 et le modèle de transcription local ; la rédaction des traductions a utilisé le cloud.

Combien de temps prend un cours de 258 slides ?

Le checkpoint chinois : 28 heures de temps calendaire pour 3 h 06 m d'audio, échecs et nouvelles tentatives inclus, suivi d'une passe de réparation de 16 slides. Le checkpoint coréen : 31 heures pour 3 h 25 m, y compris un détour causé par un worker bloqué et la réparation de deux slides.

Le cours

Le cours est AI-Native Media Operations — sept modules, seize templates et une narration en anglais, japonais, chinois simplifié et coréen.