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
- Visiter
- Code source
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- 1Extract the audioffmpeg, mono 16 kHz
- 2TranscribeEvery word gets a start and an end
- 3Build the cuesWhere the subtitle quality is decided
- 4Validate the SRTBefore anything is paid for
- 5TranslateOne batch per language, four at a time
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.
An agent doing itOne language at a time
- Retypes every timecode, and eventually mistypes one
- The whole file crosses the context window, once per language
- Generation prices for a mechanical job
- Nothing to resume if it stops halfway
A batch translatorTwenty at a time
- Numbering and timecodes kept byte for byte
- Four batches in flight, none of it through a model context
- One credit per three words
- A manifest, so a rerun pays for nothing twice
50langues, classées par audience YouTube
34crédits par langue pour un clip de 101 mots
0dépendances npm