Clonage de voix et doublage vidéo en local : ZastTranslate passe en 1.03
Clonage de voix et doublage vidéo en local : ZastTranslate passe en 1.03

Clonage de voix et doublage vidéo en local : ZastTranslate passe en 1.03

Clonage de voix et doublage vidéo en local : ZastTranslate passe en 1.03

J’avais présenté ici la toute première version de ZastTranslate, la 0.9, quand le projet venait de sortir. Depuis, l’outil a énormément évolué, au point que la base de code n’a presque plus rien à voir avec celle du départ. La Beta 1.03 vient de sortir et c’est l’occasion de faire un point complet sur tout ce qui a été ajouté en quelques mois, pour celles et ceux qui n’ont pas suivi le projet de près. Le programme reste le même, du clonage de voix et du doublage vidéo en 100% local, sans cloud, sans clé API, sans abonnement. Et autant le dire tout de suite, le clonage de voix de la 1.03 n’a plus grand chose à voir avec celui de la 0.9.

Le rappel rapide pour celles et ceux qui découvrent

ZastTranslate prend une vidéo en entrée, soit depuis une URL YouTube avec choix de la résolution, soit en local depuis un fichier sur le disque. WhisperX transcrit la parole avec des timestamps au mot près sur plus de 20 langues sources. Un LLM se charge de la traduction. Un moteur de synthèse vocale dub la vidéo dans la langue cible, avec en option un clonage de voix qui reproduit le timbre de l’orateur original. Demucs isole la piste vocale des musiques et bruitages, ce qui permet de remixer le doublage par-dessus la bande son originale sans tout aplatir. Sortie en MP4 final, avec SRT, et le tout sans qu’aucune donnée ne quitte la machine.

L’installation passe toujours par Pinokio. Un Install lance la configuration complète de l’environnement Python, PyTorch CUDA et les modèles. Un Start lance l’interface web Gradio.

Le mode Bulk, doubler dans 30 langues d’un seul clic

Premier ajout majeur depuis la 0.9, et probablement celui qui change le plus la donne quand on publie du contenu multilingue. Le mode Bulk permet de générer toutes les versions linguistiques d’une vidéo en une seule passe. Une fois la transcription validée, on saute à l’onglet 5, on coche toutes les langues cibles dans la liste déroulante, on choisit ses options de voix, et on clique sur Run Bulk Process. L’outil enchaîne les langues séquentiellement et propose un téléchargement groupé.

Clonage de voix et doublage vidéo en local : ZastTranslate passe en 1.03

J’ai aussi ajouté la possibilité de remplir le titre et la description originale de la vidéo dans cet onglet. L’IA les traduit dans chaque langue sélectionnée avec un affichage en blocs prêts à copier-coller pour YouTube Studio. Plus besoin de relancer une traduction manuelle pour chaque métadonnée.

Côté technique, j’ai refondu le pipeline Bulk pour qu’il traduise toutes les langues d’abord avec le LLM, puis qu’il décharge complètement le LLM de la VRAM avant de charger le moteur de synthèse vocale. Ça évite la fragmentation mémoire qui plombait les batchs massifs en début de cycle, et ça permet de tourner du 10 langues à la suite sans crasher même sur une RTX 4090.

La publication automatique sur YouTube

Pour celles et ceux qui publient des vidéos sur leur chaîne, j’ai ajouté un bouton expérimental Publish to YouTube dans le mode Bulk. Avec un client_secret.json récupéré sur Google Cloud Console (l’API YouTube Data v3 est gratuite), ZastTranslate peut pousser automatiquement les titres localisés, les descriptions traduites et les fichiers SRT directement sur la chaîne. Une seule autorisation OAuth au premier lancement et c’est bon.

Seule limite, l’audio doublé reste à uploader manuellement parce que l’API YouTube ne permet pas encore l’upload des pistes Multi-language Audio. C’est une restriction côté Google qui ne dépend pas de moi.

Attention cela peut planter l’appli ou votre compte. C’est expérimental donc je ne l’ai pas testé à fond.

Clonage de voix : VoxCPM 2 remplace Qwen3-TTS et passe à 30 langues

Côté synthèse vocale, j’ai opéré un changement complet de moteur. La 0.9 utilisait Qwen3-TTS pour le clonage de voix, avec un catalogue limité à 10 langues. Depuis la 1.01, j’ai basculé entièrement sur VoxCPM 2, un moteur open source signé OpenBMB qui couvre 30 langues. On y trouve l’arabe, le birman, le chinois, le danois, le néerlandais, l’anglais, le finnois, le français, l’allemand, le grec, l’hébreu, le hindi, l’indonésien, l’italien, le japonais, le khmer, le coréen, le lao, le malais, le norvégien, le polonais, le portugais, le russe, l’espagnol, le swahili, le suédois, le tagalog, le thaï, le turc et le vietnamien.

Clonage de voix et doublage vidéo en local : ZastTranslate passe en 1.03

VoxCPM 2 fait du clonage de voix zero-shot, ce qui veut dire qu’il n’a pas besoin d’être entraîné sur la voix cible. Il prend un échantillon court de parole claire et génère ensuite n’importe quel texte avec le timbre, l’accent et les inflexions de cet échantillon. Trois modes de clonage de voix sont disponibles dans l’interface. Default voice utilise la voix isolée de la vidéo comme référence par défaut. Clone from original récupère explicitement la voix isolée par Demucs depuis la vidéo source, ce qui donne le meilleur rendu parce que le spectateur entend la voix de l’orateur parler une autre langue. Clone from file permet d’uploader un WAV ou un MP3 de référence quand on veut imposer une voix précise différente.

En 1.02, j’ai réactivé le denoiser ZipEnhancer pour un rendu plus propre. J’ai aussi optimisé le cache KV en réduisant la longueur de l’audio de référence, ce qui a divisé le temps de génération par 16 à 20. Une vidéo de 5 minutes qui prenait facilement 20 minutes à dub sort maintenant en 1 à 2 minutes sur une GPU correcte.

Trois moteurs de traduction au choix selon les langues

L’autre gros chantier depuis la 0.9 a été le passage à une architecture multi-backend LLM. On choisit dans l’onglet 2 le moteur qui va traduire et reformuler. Qwen2.5-7B est le moteur historique, fiable, qui suit bien les instructions de fitting. Qwen3.5-9B est plus récent, un peu plus lourd en VRAM mais nettement plus pertinent sur les langues asiatiques et les nuances stylistiques. EuroLLM-9B est spécialisé sur les langues européennes uniquement, et il les gère mieux que les deux autres sur les paires françaises, espagnoles, allemandes ou italiennes.

L’interface filtre automatiquement les langues cibles en fonction de l’intersection entre les capacités du LLM et du TTS sélectionnés. Si tu choisis EuroLLM-9B avec VoxCPM 2, tu n’auras que les langues européennes communes aux deux. Aucune mauvaise surprise au moment du doublage.

En 1.02, j’ai aussi parallélisé la traduction en passant le LLM sur 8 segments simultanés au lieu d’un seul. Le temps de traduction est divisé par 6 sur les vidéos longues.

Clonage de voix et doublage vidéo en local : ZastTranslate passe en 1.03

Le fitting toujours là, et plus précis qu’avant

Le fitting est resté la fonctionnalité dont je suis le plus fier dans l’outil. Quand on traduit du français vers de l’allemand ou de l’anglais vers du japonais, la durée de prononciation n’est jamais la même. Si on dub bêtement la traduction littérale, soit le doublage déborde sur le segment suivant, soit il y a un blanc gênant. J’ai donc demandé au LLM de produire deux versions de chaque segment traduit. La colonne Translation contient la traduction naturelle, fidèle au sens original. La colonne Fitted contient une version raccourcie ou condensée, calibrée pour tenir dans la durée du segment audio d’origine, avec un indicateur visuel qui signale si ça passe ou si ça risque de dépasser.

En 1.01, j’ai remplacé la valeur unique hardcodée à 7,5 caractères par seconde par une table par langue. Le japonais s’écrit court mais se prononce dense, l’allemand s’écrit long mais se prononce vite, et chaque langue a maintenant sa propre calibration CPS. Un onglet Config CPS permet de surcharger les valeurs par défaut pour ajuster une langue précise sans toucher au reste.

Clonage de voix plus stable avec la Beta 1.03

La grosse nouveauté côté qualité du clonage de voix, c’est l’extraction chirurgicale de la voix de référence. Avant, je découpais bêtement les 30 premières secondes de la piste vocale extraite par Demucs pour les donner en référence à VoxCPM 2. Le souci, c’est que ces 30 secondes pouvaient contenir des respirations, du bruit résiduel, des chevauchements. Maintenant l’algorithme scanne toute la piste vocale, identifie le segment le plus propre entre 5 et 15 secondes et n’utilise que celui-là. Le clonage de voix gagne en stabilité et les artefacts disparaissent.

J’ai aussi réglé un bug bien chiant identifié en 1.02. Quand le mode clonage était désactivé, VoxCPM 2 hallucinait littéralement une voix différente à chaque phrase, ce qui donnait un doublage où le narrateur changeait toutes les 5 secondes. Avec le système de Persistent Default Voice, une voix par défaut de haute qualité est mise en cache et réutilisée pour tous les segments. La voix reste stable du début à la fin de la vidéo.

Clonage de voix et doublage vidéo en local : ZastTranslate passe en 1.03

Comme on a maintenant une voix par défaut persistante, autant pouvoir choisir si on veut une voix d’homme ou de femme. Une option Default Voice Gender apparaît dans l’interface, en mode normal comme en mode Bulk. Toggle clair, pas de paramètre caché.

Ce que ZastTranslate ne fait toujours pas

Autant être clair sur les limites actuelles parce que je préfère qu’on s’installe l’outil en sachant ce qu’on récupère. Il n’y a pas de lip-sync, donc la bouche du locuteur original ne bouge pas en synchro avec le doublage. La piste audio est remplacée proprement, mais l’image reste intacte. C’est un choix assumé pour cette version, le lip-sync demande un autre type de modèle et ferait exploser la VRAM nécessaire. Mais c’est surtout que cela n’a pas d’interet pour l’application car je veux juste doubler mes vidéos au niveau audio. Il faut que l’audio originale = audio doublé au niveau du temps.

Il n’y a pas non plus de gestion multi-voix. Tous les segments sont doublés avec la même voix. Sur une interview à deux personnes ou un dialogue de film, ce n’est clairement pas adapté en l’état. Le multi-speaker fait partie des chantiers que je veux ouvrir sur les prochaines versions.

Configuration matérielle et installation

Côté matériel, le confort démarre avec une GPU Nvidia disposant de 4 Go de VRAM ou plus, en CUDA. Ça tourne aussi sur CPU mais c’est nettement plus lent. Prévoir environ 8 Go de disque pour les modèles, téléchargés au premier lancement. Pour l’instant le projet est testé uniquement sous Windows, ça peut fonctionner sous Linux ou macOS mais je n’ai pas validé moi-même.

Pour moi cela tourne bien sur un RTX 4090. Donc je ne peux pas confirmer sur d’autres matériels.

L’installation passe par Pinokio. On ouvre Pinokio, on cherche ZastTranslate dans le Discover ou via la barre de recherche, on clique sur Install, et le script gère tout. Les anciens utilisateurs qui étaient bloqués sur la 0.91 avec une erreur de divergent branches ou numpy peuvent supprimer l’app depuis Pinokio puis la réinstaller depuis le Discover, l’updater corrigé est embarqué dans la nouvelle install. ZastTranslate est sous licence MIT et le code est entièrement consultable sur le dépôt GitHub.

https://github.com/zast57/ZastTranslate

Pour être honnête, c’est un programme que j’ai fait pour moi pour me simplifier la vie pour les textes traduits, pour l’audio, … C’est un tout en un. Je l’utilise uniquement sur mes vidéos. Pour les dernières versions de l’appli, dans les derniers 48 heures, j’ai dû passer 24 heures de tests (ou plus) pour valider, corriger, … Si je compte le nombre d’heures au total sur l’appli depuis la création, c’est plus d’un mois de travail…

C’est une appli gratuite et pour une fois, quand c’est gratuit, c’est pas vous le produit !