Tous les articles
·13 min de lecture·Yom Akakpo

Huit chaînes TikTok IA, un seul pipeline. La mécanique complète.

Du fichier de configuration JSON au MP4 vertical prêt à publier sur six plateformes — voici ce qu'il y a vraiment sous le capot quand une production vidéo IA tourne en solo. Les vrais chiffres, les vraies décisions, les vrais bugs.

ai-videotiktokpipelinemcpautomation

À l'heure où j'écris ces lignes, huit chaînes TikTok et YouTube Shorts tournent en publication continue depuis ma machine. Aucune équipe content, aucun monteur. Une production solo qui consomme entre quatre et dix minutes de mon temps par épisode, hors écriture du script. Le reste — voix off, sous-titres, B-roll, mix audio, rendu, publication multi-plateformes — est délégué à un pipeline qui tient en un fichier Python de neuf cents lignes et une poignée d'appels à des outils du domaine public.

Ce qui suit est la mécanique complète. Les outils, les décisions techniques, les coûts. La manière dont cette industrie domestique fonctionne réellement, par opposition à la version que vendent les fils Twitter — celle où « il suffit d'un prompt pour générer une chaîne ». Je ne vais pas vous mentir : le prompt est la partie facile.

Les huit chaînes

| Chaîne | Format | État | |---|---|---| | WhyFactory | FR 50-60 s, micro-documentaires « pourquoi cet objet du quotidien » | 8 épisodes publiés, 18 en backlog | | Cocorico Histoire | FR 60 s, histoire de France et renversements | 21 épisodes — un seul a fait ×3 (le post-mortem) | | Cocorico POV | FR 45 s, scènes historiques en première personne | Fork expérimental | | Cocorico Quiz | FR 60 s, questions du test civique | Niche naturalisation française | | Tech-Malin | FR 45 s, astuces tech vulgarisées | Pari sur l'audience tech-savvy | | Motivation Motor | EN 30 s, citations motivationnelles montées | Banc d'essai sur les formats très courts | | Reddit Horror | EN 60 s, posts r/nosleep narrés | Stratégie de volume | | Aliasify TikTok | EN, chaîne portée par un personnage | Test d'incarnation |

Chaque chaîne dispose de sa propre identité visuelle, de son document éditorial verrouillé, de son backlog priorisé. Ce qu'elles partagent est exclusivement la chaîne de production qui leur tient lieu d'infrastructure.

Architecture

config JSON
  → orchestrateur Python (scripts/generate.py)
  → TTS trois tiers (Kokoro / F5 / ElevenLabs)
  → Whisper + script-forced-align (sous-titres)
  → Pexels + Wikimedia (B-roll)
  → FFmpeg (sidechain ducking + loudnorm -14 LUFS)
  → rendu HyperFrames (MP4 1080×1920)
  → appel MCP Shortflow depuis Claude
  → publication sur YouTube, TikTok, Instagram, Facebook, Threads, LinkedIn

L'orchestration est délibérément triviale. Chaque étape est une invocation CLI cachable, ré-exécutable, inspectable. Aucune magie. Une chaîne d'outils qui font chacun une chose, et la font correctement. Le couplage faible est ce qui rend l'ensemble lisible et debuggable — la première fois qu'un mix audio sortira à la mauvaise loudness, vous saurez exactement quel maillon a fauté.

Étape 1 — Le script

Un fichier de configuration décrit un épisode. Les segments narratifs, les indications de B-roll associées, les surcharges de prononciation pour le moteur de synthèse vocale, et les sources factuelles destinées à la description publique.

{
  "id": "ep01",
  "slug": "azerty",
  "title": "Pourquoi votre clavier est en AZERTY",
  "segments": [
    {
      "text": "J'ai appris un truc fou sur le clavier AZERTY.",
      "broll": "vintage typewriter",
      "duration_hint": 2.5
    },
    {
      "text": "L'AZERTY n'a aucune logique ergonomique. C'est l'héritage des machines à écrire de 1873.",
      "broll": "1873 typewriter wikimedia",
      "duration_hint": 4.0
    }
  ],
  "sources": [
    { "title": "Wikipedia — AZERTY", "url": "https://fr.wikipedia.org/wiki/AZERTY" }
  ]
}

Le script est la seule partie que je n'automatise pas intégralement. Je l'écris, fréquemment avec Claude en copilote, puis un script Python le segmente, valide l'alignement de tokens entre le texte affiché et le texte parlé (j'y reviens dans la section sur les sous-titres), et émet le JSON ci-dessus.

J'ai tenté l'écriture intégrale au LLM. C'est techniquement possible. C'est éditorialement médiocre, et systématiquement. Ce qui distingue un contenu IA d'un contenu IA qui passe pour humain, ce n'est ni la qualité du rendu ni la précision du sous-titrage : c'est la voix éditoriale. Je consacre la dernière section de ce papier à ce point, parce qu'il s'agit en réalité du seul aspect non délégable.

Étape 2 — Synthèse vocale en trois tiers

C'est la seule décision d'architecture qui m'a fait économiser de l'argent à l'échelle.

ElevenLabs produit la meilleure qualité du marché. Elle coûte aussi cher. À ma cadence (cinq à dix épisodes par chaîne par mois, multipliés par huit chaînes, soit quarante à quatre-vingts rendus finaux), faire transiter chaque itération de script par ElevenLabs consommerait mes crédits en quelques jours. La stratégie tient en trois moteurs :

| Tier | Moteur | Cadence | Coût | Usage | |---|---|---|---|---| | v1 | Kokoro ff_siwis (local) | ~1 s/segment | Gratuit | Itération du script. Vingt passes par épisode, c'est normal. | | v2 | F5 local | ~3 min/segment | Gratuit | Validation du montage. Plus lent, mais la prosodie tient le réel. | | prod | ElevenLabs Liam | ~5 s/segment | Crédits | Rendu publiable. Une passe, et une seule. |

Un flag de ligne de commande choisit le tier :

python3 scripts/generate.py episodes/configs/ep01.json         # v1
python3 scripts/generate.py episodes/configs/ep01.json --v2    # v2
python3 scripts/generate.py episodes/configs/ep01.json --prod  # ElevenLabs

Le cache est indexé sur un hash du contenu de chaque segment. Modifier une virgule dans le segment trois invalide uniquement le cache de ce segment. Les onze autres survivent intacts. C'est ce qui rend l'itération soutenable économiquement : l'unité de re-render est le segment, pas l'épisode.

Coûts réels sur un épisode de soixante secondes :

  • v1 (itération de script) : vingt cycles, dix minutes de calcul cumulé, 0 €.
  • v2 (validation montage) : un cycle, environ douze minutes, 0 €.
  • prod (final) : un cycle, une minute, environ trois mille caractères ElevenLabs, 0,15 €.

Un épisode publié coûte donc quinze centimes en synthèse vocale. À quatre-vingts épisodes par mois, l'addition s'arrête à douze euros. À comparer aux quelques centaines d'euros qu'aurait imposés une stratégie « tout en ElevenLabs en permanence ».

Étape 3 — Sous-titres : Whisper et alignement forcé

Les sous-titres générés par Whisper, livrés bruts, sont robotiques. Whisper ingère mal certains mots, coupe au mauvais endroit, ignore vos sauts de ligne d'origine. Le pipeline corrige cela en injectant le script de référence dans le processus de transcription.

Concrètement : Whisper reçoit l'audio et le script. Une étape de forced-align fait correspondre chaque token transcrit par Whisper à un token du script. La sortie est un fichier de timing au mot près, dans lequel le texte affiché est rigoureusement celui que vous avez écrit, et la chronologie vient de l'audio réel.

LOOKAHEAD = 6 tokens
MIN_WORD_GAP = 0.08s

Ces deux paramètres rendent les sous-titres karaoke crédibles. LOOKAHEAD permet à l'aligneur de sauter les insertions parasites de Whisper (« euh », hésitations, faux départs). MIN_WORD_GAP empêche deux mots consécutifs de se superposer lorsque la synthèse vocale les colle un peu trop.

Une contrainte qui peut piéger : le texte affiché et le texte parlé doivent porter le même nombre de tokens, séparation par espaces. Si vous affichez « 3 000 » et souhaitez « trois mille » prononcé, comptez trois tokens contre deux — l'alignement casse. Préférez « 3000 » affiché et « trois-mille » parlé : un contre un. Ou « 3 000 » affiché et « trois mille » parlé : deux contre deux. Le générateur valide cette contrainte avant d'émettre le JSON ; un mismatch produit un avertissement de rendu et un timing distribué uniformément, donc moins précis.

C'est exactement le type de détail invisible qui dévore deux jours quand on le découvre seul. Vous me devez deux jours de vos vies là, clairement.

Étape 4 — B-roll : Pexels d'abord, Wikimedia ensuite

Chaque segment porte une indication de B-roll, sous forme d'une chaîne de recherche brève. Le pipeline interroge l'API Pexels pour des vidéos verticales ; à défaut, il bascule sur les images de Wikimedia Commons.

Trois règles tirées des erreurs précédentes :

  1. Liste noire d'identifiants Pexels. Certaines vidéos théoriquement gratuites portent un watermark, ou sont étiquetées portrait par erreur. Je maintiens un blocklist d'IDs qui finissent toujours par sortir disgracieux. Trente minutes économisées par épisode.
  2. Ken Burns automatique sur images statiques. Une image immobile à l'écran rompt la courbe d'engagement. Un panoramique léger combiné à un zoom progressif maintient le mouvement perçu et préserve l'attention.
  3. Vignette d'overlay inférieure. Un gradient opaque à 85 % en bas de chaque frame garantit la lisibilité des sous-titres, indépendamment de la colorimétrie du B-roll. Sans cela, il faudrait corriger chaque clip à la main.

Détails dépourvus de glamour, soit. Mais c'est précisément ce qui sépare « on dirait de la vidéo IA » de « on dirait une vidéo montée par un humain ».

Étape 5 — Mix audio FFmpeg

Deux opérations enchaînées :

# 1. Padding silencieux pour caler la voix off sur la timeline vidéo
ffmpeg -i vo.wav -af "apad=pad_dur=2" vo-padded.wav

# 2. Mix voix + musique avec sidechain ducking et normalisation LUFS
ffmpeg -i vo-padded.wav -i music.wav \
  -filter_complex "[1:a][0:a]sidechaincompress=threshold=0.05:ratio=8[ducked]; \
                   [0:a][ducked]amix=inputs=2:duration=longest, \
                   loudnorm=I=-14:LRA=11:TP=-1.0" \
  -c:a aac -b:a 192k final.aac

La cible -14 LUFS correspond au standard de loudness intégré de TikTok et YouTube Shorts. Au-delà, la plateforme atténue automatiquement le signal ; en deçà, la vidéo paraît atone à côté du reste du fil. Frapper la cible à l'étape de mixage, c'est garantir qu'aucune de vos vidéos publiées ne souffrira de l'effet « celle-là est trop forte par rapport aux autres ».

Étape 6 — Rendu HyperFrames

HyperFrames est le framework que j'utilise pour transformer une composition HTML/CSS animée en GSAP en un MP4. Ce n'est pas un éditeur vidéo au sens classique : c'est un moteur de rendu déterministe pour compositions HTML, dans l'esprit de Remotion mais avec un contrat plus strict.

Trois propriétés qui en font un fit pour cette chaîne de production :

  • Les compositions sont des fichiers HTML. On les écrit dans n'importe quel IDE, on les versionne sous Git, on les structure comme un site web ordinaire.
  • Les animations s'expriment en timelines GSAP. Le framework garantit la pause et le seek, ce qui permet au moteur d'inspecter et de capturer les frames à n'importe quel taux d'échantillonnage.
  • Le déterminisme est non négociable : pas de Math.random(), pas de Date.now(), pas de setTimeout. Deux rendus du même fichier produisent le même MP4, octet pour octet.

Le rendu tient en une commande :

npx hyperframes render

La sortie est un fichier renders/<id>-<slug>.mp4. Le parcours complet, du JSON au MP4, prend trois à cinq minutes pour un épisode de soixante secondes, selon la composition du B-roll.

Étape 7 — Publication sur six plateformes via Shortflow MCP

C'est l'étape où Shortflow entre dans la chaîne — oui, le produit dont ce blog est l'extension.

Le rendu se trouve sur le disque. Depuis Claude Code, un appel MCP unique le publie sur YouTube, TikTok, Instagram, Facebook Pages, Threads et LinkedIn :

> Publie renders/ep01-azerty.mp4 sur toutes mes plateformes
  connectées avec le titre « Pourquoi votre clavier est en AZERTY »
  et programme la diffusion demain à 9 h.

⏵ Appel de create_publication...
✓ Importé dans la médiathèque (12,4 Mio, 60,2 s)
✓ Programmé sur 6 cibles : YouTube, TikTok, Instagram, Facebook, Threads, LinkedIn

Avant Shortflow, l'étape de publication était la plus douloureuse du pipeline. Six onglets à ouvrir, le fichier à glisser six fois, la légende à composer six fois, le thumbnail à choisir six fois. Environ vingt minutes par épisode. À quatre-vingts épisodes mensuels, cela représentait vingt-six heures de clics répétitifs par mois — un emploi à temps partiel consacré exclusivement à pousser le même fichier dans des interfaces différentes.

Avec le serveur MCP de Shortflow, l'appel de publication fait partie de la même conversation Claude dans laquelle j'ai édité le script. Le temps total de publication s'élève désormais à environ quinze secondes par épisode, dont l'essentiel est consacré à l'upload du fichier vers nos serveurs.

Le sujet véritable : la voix éditoriale

J'ai un peu menti en introduction. La couche technique de ce pipeline n'est pas difficile. Elle est laborieuse, parfois bordélique, mais elle se règle en deux semaines de bricolage rigoureux. Ce qui est réellement dur — ce qui détermine si votre contenu IA passe pour de l'IA ou non — n'est pas dans le rendu : c'est dans la voix.

Voici ce que j'ai compris en écrivant pour WhyFactory : le narrateur n'est pas un présentateur. C'est un proche qui vient de découvrir quelque chose, et qui éprouve le besoin urgent de vous le transmettre. Cette posture détermine tout le reste. Ce n'est pas « laissez-moi vous expliquer X », c'est « attendez, écoutez ça ». L'urgence vient de l'excitation réelle, non d'une mise en scène — et le viewer le sent immédiatement, parce que la différence entre les deux registres se mesure en millisecondes de cadence.

Quelques règles concrètes, distillées d'une trentaine de scripts :

  • Le narrateur découvre avec le viewer, jamais devant lui. L'ouverture utilise la première personne et signale la découverte récente : « J'ai appris un truc, je n'arrive pas à m'en remettre. » Le narrateur apprend ce que le viewer apprend, en même temps. Asymétrie nulle.
  • Le narrateur a des opinions. Une voix neutre est une voix oubliable. « Ma préférée, c'est celle-là. » « Je dois dire que je partage cet avis. » La partialité est ce qui grave une présence.
  • Les faits sont des plot twists, pas des informations. La conjonction « sauf que » inverse systématiquement la révélation. Chaque fait trahit ce qu'on croyait l'instant d'avant.
  • Anticipez le viewer. « Pour celles et ceux qui pensent que c'est de l'IA, je vous comprends. » « Je sais ce que vous vous dites en lisant ça. » Cette technique collapse la distance entre la voix et celui qui regarde.
  • Le CTA se tisse dans le récit, jamais à la fin. « Au passage, on est bientôt cent mille », glissé entre deux segments, fonctionne. « Abonnez-vous pour soutenir le contenu », posé en outro, tue le rythme. La distinction est petite ; ses effets ne le sont pas.

Le document éditorial de WhyFactory compte mille cinq cents mots de ces règles-là. C'est cet ensemble qui fait qu'une vidéo de cinquante secondes sur les tubes Pringles ressemble à un récit de bar à vingt-trois heures, plutôt qu'à un script de TED Talk.

Ce que je referais autrement

Trois choses, si je redémarrais aujourd'hui :

D'abord, écrire le document éditorial avant le stack technique. Toutes mes chaînes qui ont sous-performé sont celles où j'ai foncé sur la production avant d'avoir formalisé la voix. La technique se règle en une semaine de travail concentré. La voix réclame vingt à trente scripts d'itération avant de tenir vraiment.

Ensuite, intégrer la génération de thumbnails à la composition HyperFrames. Aujourd'hui je les génère dans une étape FFmpeg séparée, ce qui produit ponctuellement des écarts d'esthétique entre la vignette et la vidéo. Mieux vaut les cuire dans la composition, garantissant qu'ils héritent automatiquement de la même grille graphique.

Enfin, instrumenter les analytics multi-plateformes dès le premier jour. J'ai construit Shortflow en partie parce qu'à un moment donné, j'avais huit chaînes et aucune vue consolidée des performances. Ne reproduisez pas cette erreur.

Les chiffres, bout en bout

Par épisode, tout compris :

  • Temps humain : environ quatre-vingt-dix minutes — quarante minutes d'écriture, vingt minutes de configuration et d'itération, dix minutes de sélection B-roll, vingt minutes de relecture et de publication.
  • Coût direct : environ 0,15 € de synthèse vocale, le reste à zéro.
  • Sortie : un MP4 vertical de soixante secondes, programmé sur six plateformes.

À quatre-vingts épisodes mensuels, le compte s'établit à cent vingt heures de travail humain, douze euros de TTS, quatre cent quatre-vingts événements de publication multi-plateformes. Sans Shortflow, ajoutez environ cent cinquante heures d'opérations manuelles dans les interfaces des plateformes.

Par où commencer

Si vous démarrez la semaine prochaine, le levier le plus élevé n'est pas dans le pipeline. Il est dans le document éditorial.

Choisissez un concept de chaîne — une seule niche, une seule voix, un seul format. Rédigez le document éditorial : positionnement, règles de voix, red flags. Visez mille mots. Écrivez ensuite cinq scripts à la main avec ce document en référence. Ensuite seulement, commencez à automatiser.

Les chaînes meurent rarement parce que leur moteur de rendu est trop lent. Elles meurent parce que leur voix est plate. Réglez la voix d'abord ; le pipeline est un problème d'ingénierie soluble, et il existe une dizaine de stacks viables — HyperFrames est mon choix, Remotion est une alternative légitime, Revid.ai et Captions.ai conviennent à d'autres usages.

Si vous souhaitez que la couche de publication de votre stack — celle qui pousse votre rendu sur six plateformes depuis un unique appel MCP — soit gérée pour vous, c'est exactement ce que fait Shortflow. Connecter une chaîne depuis le tableau de bord prend deux minutes ; la publication via Claude est opérationnelle dans les dix minutes qui suivent.


Une question sur le pipeline ? Le contact figure dans les mentions légales. Je lis et je réponds.