Guillaume Duvernay

Open source

multilingual-subtitles

Des sous-titres en vingt langues, à partir d'un seul fichier vidéo, avec une seule commande.

Un outil en ligne de commande local. Il extrait l'audio, le transcrit avec un horodatage pour chaque mot, génère un fichier SRT valide, puis traduit ce SRT dans toutes les langues choisies. Les codes temporels ne sont jamais ressaisis, quelle que soit la langue.

Rôle
Auteur
Année
2026
Stack
Node sans dépendances npm, ffmpeg, Mistral, AI Glot CLI

La transcription est la partie déjà résolue

Une douzaine d'outils permettent de transformer une vidéo en un fichier de sous-titres. Ce qui bloque la plupart des chaînes à une seule langue est l'autre moitié du travail : traduire en vingt langues représente une journée de saisie, alors personne ne le fait. C'est pour cette partie que cet outil a été conçu, et c'est pourquoi son nom évoque le multilinguisme plutôt que la transcription.

Des mots, pas des segments

Le même endpoint Mistral renvoie des segments entiers ou des mots individuels, au même prix. Un segment peut contenir sept secondes de parole en un seul bloc, ce qui correspond à une phrase et non à un sous-titre : le transformer en séquences revient à deviner où chaque phrase a été prononcée durant ces sept secondes, et l'estimation dérive. Avec le timing par mot, le générateur de séquences groupe le texte selon la lisibilité, et chaque séquence commence exactement sur le mot affiché.

Pourquoi un agent ne doit pas traduire le SRT

Pour une seule langue, allez-y. Pour vingt, c'est l'outil inapproprié à trois niveaux : le modèle ressaisit chaque code temporel et finit par en faire une erreur, le fichier entier traverse la fenêtre de contexte pour chaque langue, et vous payez le prix de la génération pour une tâche mécanique. AI Glot lit nativement le SRT, conserve la numérotation et les codes temporels octet par octet, et coûte un crédit pour trois mots.

Le coût d'une relance

Rien de ce que vous avez déjà payé. Un manifeste conserve l'ID du lot et le statut par langue : une langue déjà présente sur le disque est ignorée et un lot créé mais jamais téléchargé est repris au lieu d'être racheté. L'échec d'une langue n'arrête pas les autres.

One command, and the timecodes are never retyped

The pipeline is five steps, and only the third one is worth having an opinion about.

npm run subs -- run ~/Downloads/clip.mp4 --to fr,de,ja
Each step writes a file and stops. Transcription costs cents and translation costs credits, so keeping them apart means the expensive one never runs just because the cheap one worked.

Step three is lib/cues.mjs, and it is the whole file that makes the difference between a transcript and a subtitle. It breaks on sentence ends and on pauses over 0.6 seconds, holds each cue 1.2 seconds minimum without ever biting into the next one, and caps a cue at two lines of 42 characters and six seconds.

For one language, letting an agent do it works. The costs on the left are the ones that only show up at twenty.

50langues, classées par audience YouTube

34crédits par langue pour un clip de 101 mots

0dépendances npm