Exécution réelle, coûts et exploitation
La question que pose le directeur financier n'est pas « combien coûte une vidéo ? » mais « combien coûte une vidéo publiée, essais ratés compris ? ». Le devis du brief dit 0,575 $. Le 2026-10-15, la journée de mise au point a coûté un peu plus, pour des raisons instructives : une voix refaite, un appel Veo refusé, des sondes. Cette leçon exécute le pipeline réel, lit ses coûts, le fait tourner sur Vertex AI et nettoie.
Le mécanisme : ordre des étapes, cache, manifeste
flowchart TB
A["make e2e"] --> B{"Conformité + devis ≤ budget ?"}
B -->|"non"| Z["arrêt, 0 $"]
B -->|"oui"| V["Voix : ~0,001 $<br/>mesure + transcription"]
V -->|"trop longue / consigne lue"| Z2["arrêt, ~0,002 $"]
V --> I["Image produit : 0,067 $"]
I --> C["Clips Veo : 0,40 $"]
C --> L["Lyria : 0,04 $"]
L --> M["Montage : 0 $"]
M --> R["manifeste.json + rapport.html"]
K[("sorties/cache/<br/>média + fiche de coût")] -.->|"relance"| V
K -.-> I
K -.-> C
K -.-> L
Les étapes sont rangées de la moins chère à la plus chère, et chaque contrôle qui peut échouer est placé avant la dépense suivante. Le manifeste distingue deux montants : depense_reelle_usd (payé pendant cette exécution) et cout_medias_usd (coût de tous les médias utilisés, cache compris, lu dans les fiches JSON écrites à côté de chaque média).
La mise en œuvre
cd files
make setup # puis renseignez GOOGLE_API_KEY dans .env
make e2eVeo n'a pas de palier gratuit : la clé doit appartenir à un projet avec facturation activée. Les conditions de l'API Gemini précisent par ailleurs que seuls les services payants peuvent être proposés à des utilisateurs de l'Espace économique européen, de Suisse et du Royaume-Uni, et que sur les services gratuits les entrées et sorties peuvent servir à améliorer les produits de Google.
Pour Vertex AI, le même code tourne en changeant l'environnement :
GOOGLE_GENAI_USE_VERTEXAI=TRUE GOOGLE_CLOUD_PROJECT=<votre-projet> GOOGLE_CLOUD_LOCATION=global \
.venv/bin/python run.py --e2eSur Vertex, les identifiants et la disponibilité des modèles dépendent de la région : vérifiez-les dans la documentation Vertex de Veo et dans le Model Garden de votre projet avant de lancer, et adaptez video.modele, voix.modele et musique.modele dans le brief.
Résultat obtenu
Exécution réelle complète du 2026-10-15 (voix et image produit déjà en cache depuis l'essai précédent), clé Gemini API :
pubcourte.generation INFO cache 1b96fc81f671861a.wav (voix, 0.0007 $ déjà payés)
pubcourte.generation INFO cache 3a51c6eda1e5b1ec.wav (voix, 0.0004 $ déjà payés)
pubcourte.generation INFO cache 423af6b25805de4d.png (image, 0.0670 $ déjà payés)
pubcourte.generation INFO video veo-3.1-lite-generate-preview : 0.2000 $ en 32.8 s
pubcourte.generation INFO image gemini-3.1-flash-image : 0.0670 $ en 11.1 s
pubcourte.generation INFO video veo-3.1-lite-generate-preview : 0.2000 $ en 33.2 s
pubcourte.generation INFO musique lyria-3-clip-preview : 0.0400 $ en 13.7 s
pubcourte.pipeline INFO terminé en 106.3 s, dépense réelle 0.5070 $
9:16 sorties/reel/calade-cold-brew-9x16.mp4 1.12 Mo 8.0 s
1:1 sorties/reel/calade-cold-brew-1x1.mp4 0.69 Mo 8.0 s
16:9 sorties/reel/calade-cold-brew-16x9.mp4 0.55 Mo 8.0 s
devis 0.575 $ · dépense réelle 0.507 $ · 106.3 s · rapport : sorties/reel/rapport.htmlRelance après la correction des sous-titres (leçon 5), tout depuis le cache : terminé en 15.5 s, dépense réelle 0.0000 $.
Le rapport de validation que l'on envoie au client (storyboard, prompts exacts, devis, trois formats) :
Coût réel de la journée, essais ratés compris, aux tarifs officiels du palier payant :
| Poste | Appels facturés | Coût |
|---|---|---|
| Veo 3.1 Lite, 720p, 2 × 4 s | 2 (plus 1 refus 400 negativePrompt, non facturé) | 0,400 $ |
Images gemini-3.1-flash-image (produit + plan 2) | 2 | 0,134 $ |
| Lyria Clip | 2 (1 essai de prompt, 1 pour le pipeline) | 0,080 $ |
| Voix off TTS (dont la prise où la consigne était lue) | 3 dans le pipeline, une dizaine de sondes | ~0,01 $ |
Transcriptions de contrôle (gemini-3.5-flash) | ~10 | < 0,01 $ |
| Total | ~0,63 $ |
Ce qui pèse : Veo fait 64 % de la facture. Le même storyboard aurait coûté 0,80 en standard. Le reste du pipeline (images, voix, musique, montage) coûte moins de 0,25 $ quel que soit le modèle vidéo.
Vertex AI, même jour : la voix off passe par generateContent avec gemini-2.5-flash-tts en europe-west1 (sortie PCM brut convertie en WAV par le pipeline) :
pubcourte.generation WARNING Vertex AI : style « chaleureuse et posée » ignoré (non pris en charge par generateContent TTS)
pubcourte.generation INFO voix gemini-2.5-flash-tts : 0.0005 $ en 2.9 s
45fc2c755e8cada1.wav b'RIFF' 1.89 sLe coût affiché pour Vertex applique le tarif de la clé d'API, faute de tarif vérifié pour ce modèle sur Vertex. Lors de nos sondes, gemini-3.8-flash-tts répondait en location global et pas en europe-west1. Veo et Lyria n'ont pas été exécutés sur Vertex : le budget de cette formation (2 clips) a été consommé par l'exécution avec la clé d'API.
Nettoyage. Le projet ne crée aucune ressource Google Cloud ; les vidéos Veo sont supprimées côté serveur au bout de 2 jours. Les fichiers locaux :
$ make clean
Artefacts supprimés.
$ ls sorties
ls: impossible d'accéder à 'sorties': Aucun fichier ou dossier de ce nom
$ make cloud-down
Aucune ressource Google Cloud créée par ce projet. Les vidéos Veo sont effacées côté serveur après 2 jours.make clean supprime aussi le cache des médias payés : conservez sorties/cache/ si vous comptez remonter la vidéo.
Ce qui casse en production
| Symptôme | Cause | Parade |
|---|---|---|
429 RESOURCE_EXHAUSTED en série | quota par minute de Veo ou des images | 4 essais avec attente exponentielle (4, 8, 16 s) ; au-delà, lotir les générations |
404 sur un modèle qui marchait la veille | identifiants -preview renommés ou retirés | modèle dans le brief, pas dans le code ; client.models.list() dans le diagnostic |
| Facture supérieure au devis | tarifs changés (ceux du code datent du 2026-10-15) | relevé daté dans couts.py, à revérifier avant chaque campagne |
| Clips perdus | téléchargement différé au-delà de 2 jours | téléchargement dans la foulée, cache local |
| Relance qui rachète tout | prompt modifié d'un caractère | normal : la clé de cache inclut le prompt ; figer le brief avant make e2e |
| CI qui échoue sur l'incrustation | ffmpeg sans libass ou police absente | ffmpeg des paquets Ubuntu + fonts-dejavu-core, cf. ci/github-actions.yml |
La règle de décision
Mesurez le coût par vidéo publiée, pas par appel. Surveillez quatre chiffres par campagne : coût des médias par vidéo livrée, taux de clips refaits (un plan sur trois à refaire triple la ligne Veo), taux de blocage par les filtres, et latence Veo (11 s à 6 min selon la documentation). Gardez la CI sans clé (make test, make run) et lancez make e2e à la main, une fois le brief validé : un test de bout en bout à 0,50 $ n'a pas sa place à chaque commit.
Pratique
Le marketing veut 20 variantes de la publicité (accroches différentes en voix off, mêmes images). Combien coûte la série, à partir de ce pipeline ?
La voix off est indépendante des clips : changer l'accroche ne modifie ni le prompt vidéo ni l'image de départ, donc la clé de cache des clips reste la même. Seule la voix est regénérée et remixée. C'est l'intérêt d'avoir mis le texte en voix off plutôt qu'en dialogue (leçon 1). Attention à la vérification de durée : une accroche plus longue que le plan est refusée.
La CI échoue sur `test_chaine_complete_hors_ligne` avec « No such filter: 'subtitles' ». Les autres tests passent. Que faites-vous ?
Le test fait son travail : il signale que l'environnement ne sait pas produire le livrable. Ignorer le test reporte la panne au jour de la livraison. Le SRT seul ne suffit pas aux vidéos lues sans le son dans un fil social. Le paquet ffmpeg d'Ubuntu inclut libass.
Exercice. Ajoutez au manifeste un indicateur cout_par_seconde_livree (coût des médias divisé par la durée du master), et faites échouer le pipeline si cout_medias_usd dépasse budget_usd, en plus du devis.
Voir la solution
Dans pipeline.executer, après le calcul des livrables :
cout = getattr(gen, "cout_medias_usd", gen.depense_usd)
if cout > b.budget_usd:
raise BriefRefuse(f"coût réel {cout:.3f} $ > budget {b.budget_usd:.2f} $")
manifeste["cout_par_seconde_livree"] = round(cout / b.duree_totale, 4)Sur l'exécution du 2026-10-15 : 0,575 par seconde livrée, soit environ 1,4 fois le tarif Veo Lite seul (0,05 $/s). Placer ce contrôle à la fin n'empêche pas la dépense, il empêche la livraison silencieuse d'un hors-budget : le contrôle préventif reste le devis.
- J'exécute
make e2eet je lismanifeste.json: dépense de l'exécution et coût des médias - Je sais basculer le pipeline sur Vertex AI et ce qui y diffère (style TTS, régions, identifiants)
- Je compte le coût par vidéo publiée, essais ratés compris
- Je nettoie avec
make cleanen sachant que le cache payé part avec