Biogod2020/product-film-narration

Créez des voix off AI de qualité professionnelle pour vos vidéos de produits, démos de type keynote et vidéos de hackathon en anglais. Affinez phrase par phrase, synchronisez avec la durée des images, mixez sans pompage, et évaluez objectivement si cela sonne étrange.

Qu'est-ce que product-film-narration ?

Cette compétence, conçue pour les agents AI comme Claude Code, Cursor ou Codex, résout le problème des voix off TTS qui sonnent « étranges » dans les vidéos de produits professionnelles. Issue d’un cas réel de retravail (une vidéo de hackathon de 2 min 43 s avec 11 phrases), elle propose une méthodologie complète : génération continue avec MOSS-TTS plutôt qu’un assemblage phrase par phrase, découpage vérifié par contenu avec SenseVoice, post-traitement acoustique minimal (pas de manipulation de hauteur), et mixage audio anti-pompage avec ducking courbe. La compétence inclut des scripts Python réutilisables (prosody_compare.py, align_split.py, duck_curve.py) pour quantifier la prosodie, aligner et mixer. Elle s’appuie sur une évaluation rigoureuse : distance prosodique par rapport à un narrateur de référence (documentaire NASA), tests de naturel en aveugle avec intervalles de confiance bootstrap, et vérification ASR du taux d’erreur. L’utilisateur est invité à valider finalement à l’oreille, car l’évaluation AI seule (Gemini, etc.) s’est avérée peu fiable (biais d’ordre, incohérence). Le résultat final est une voix off qui sonne naturelle, bien rythmée et intégrée proprement à la musique.

Compatible avec~Claude Code✓Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/Biogod2020/my-video-skill/tree/HEAD/skills/product-film-narration

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Voix off AI pour vidéos de produits : de « un peu étrange » à un niveau de narrateur professionnel

Cette compétence est née d’un cas réel de retravail. Une vidéo de hackathon en anglais de 2 min 43 s (11 phrases de voix off, synchronisées avec les images) a reçu le retour suivant de l’utilisateur : la voix off « sonnait encore un peu étrange ». Après 9 versions, une dizaine de moteurs TTS et de voix, une évaluation calibrée et un grand échantillon statistique, la solution finale a adopté la génération continue en une seule prise avec MOSS-TTS + un découpage vérifié par contenu + un post-traitement classique qui ne dégrade pas la voix, ce qui a été approuvé par l’utilisateur.

La méthode d’évaluation se trouve dans references/evaluation.md, les compromis de traitement acoustique dans references/acoustic-polish.md, et les scripts réutilisables dans scripts/.

1. D’abord, diagnostiquez ce qui sonne « étrange » : ce n’est généralement pas la qualité audio, mais la prosodie

[!IMPORTANT] Les bons TTS dépassent déjà largement les enregistrements amateurs en qualité audio. Les scores UTMOS / Distill-MOS sont plus élevés que ceux d’une voix humaine claire (LibriSpeech). Par conséquent, le caractère « étrange » provient presque toujours de la prosodie. En prenant comme référence une narration professionnelle du domaine public (documentaire NASA, voix isolée avec Demucs), voici les caractéristiques mesurées :

CaractéristiqueNarration professionnelleTTS clone phrase par phrase (version initiale)
Variation de hauteur (écart-type F0, demi-tons)4,62,7 (plate)
Chute en fin de phrase (demi-tons)0,72,3 (chute lourde)
Débit (syllabes/seconde)4,24,55 (légèrement rapide)
Pause moyenne (secondes)0,390,54

Utilisez scripts/prosody_compare.py, scripts/end_fall.py et scripts/take_features.py pour comparer les candidats et la référence sur les mêmes caractéristiques, avec des données, pas des impressions.

2. Génération : lisez tout le texte d’un coup, pas phrase par phrase

  1. Privilégiez la génération continue. Lors de la génération phrase par phrase, chaque phrase commence avec ses propres variations, accents et souffles, et l’assemblage sonne « étrange ». Faites lire tout le texte d’un coup par le TTS, en séparant les phrases par des lignes vides. Le modèle voit le contexte, et les phrases s’enchaînent correctement. Dans ce cas, nous avons utilisé le mode clone de MOSS-TTS v1.5, avec un échantillon de référence d’environ 15 secondes de voix off au ton approprié, généré 4 fois avec des seeds aléatoires différentes (chaque génération dure environ 2 min 10 s, taux d’erreur de mot global de 2 à 6 %).
  2. Résultats comparatifs des candidats (même évaluation) :
    • MOSS génération continue : distance prosodique par rapport à la narration professionnelle 0,29 (la plus proche), le moins de défauts ;
    • Qwen3-TTS VoiceDesign phrase par phrase, avec instructions de performance, sélection après plusieurs tirages selon la prosodie : distance 0,37, naturel équivalent à MOSS ;
    • OpenAI gpt-audio : distance 0,57 ;
    • Clone phrase par phrase : distance 0,89.
  3. Pièges connus :
    • MOSS-VoiceGenerator (description textuelle de la voix) s’arrête prématurément avec un long texte (environ 33 s), inutilisable pour une génération complète.
    • Gemini TTS nécessite le format segmenté « AUDIO PROFILE / DIRECTOR'S NOTES / TRANSCRIPT », sinon il lit les instructions ; le niveau gratuit est limité à 10 appels par modèle par jour.
    • La voix OpenAI manque de variation de hauteur dans les évaluations. Si une voix AI commerciale est utilisée, il faut le mentionner dans le générique.
  4. Choisissez le seed en fonction des caractéristiques prosodiques : parmi les seeds avec un taux d’erreur acceptable, choisissez celui dont la distance à la référence professionnelle est la plus faible. Si une phrase particulière est mauvaise (par exemple, un slogan final qui devient une voix de gorge), remplacez uniquement cette phrase par une version d’un autre seed avec la même voix de référence.

3. Découpage : vérifiez par contenu, ne vous fiez pas qu’aux horodatages

L’audio complet généré en continu doit être découpé en phrases pour correspondre aux images. scripts/align_split.py procède ainsi :

  1. Utilisez SenseVoice pour obtenir les temps au niveau des mots et alignez-les avec le script par distance d’édition.
  2. Coupez au niveau du silence entre deux phrases.
  3. Vérifiez ensuite par contenu : pour chaque silence dans un intervalle de 1,5 s autour du point de coupe, essayez chaque coupe, ré-identifiez les deux segments, et sélectionnez la position où la somme des taux d’erreur des deux segments est la plus faible.

Se fier uniquement aux horodatages peut entraîner des erreurs : les TTS marquent souvent une pause à l’intérieur des phrases (par exemple « Just | sentences. »), tandis qu’ils peuvent enchaîner entre deux phrases, et les temps au niveau des mots sont en retard par rapport au début réel. Sans vérification, « does | it » et « Just | sentences » ont tous deux été coupés au début de la phrase suivante.

4. Post-traitement : corrigez uniquement les problèmes quantifiables, ne touchez pas à la hauteur

TraitementConclusion
Normalisation des pauses selon la ponctuation (pause_fix_en.py : 0,10 s à l’intérieur d’un groupe, 0,25 s pour une virgule, 0,33 s pour un deux-points, 0,45 s en fin de phrase ; les slogans courts conservent une pause d’un temps de 0,8 s)Conserver : seulement raccourcir, jamais allonger, se rapprochant ainsi des pauses des narrateurs professionnels
Uniformisation du volume (−20 LUFS par phrase), filtre passe-haut à 70 Hz, −2 dB à 300 Hz, léger dé-essorage, réverbération de petite pièce à 6 % (vo_post.py)Conserver : pas de dégradation du score de qualité audio
LimiteurSupprimer : Distill-MOS baisse d’environ 0,14, remplacer par un contrôle de gain linéaire pour les pics
Utilisation du vocodeur WORLD ou de Praat PSOLA pour relever la fin des phrases et augmenter la variation globale de hauteurAbandonner : les caractéristiques se rapprochent de la référence professionnelle, mais le score des évaluations strictes baisse (plus le traitement WORLD est fort, plus c’est mauvais ; la version la plus forte a un écart de −0,30, intervalle de confiance [−0,61, −0,03])

Principe : les problèmes de fin de phrase et de variation doivent être résolus en générant plusieurs fois et en sélectionnant, pas en modifiant la hauteur après coup.

5. Mixage : la musique ne doit pas « pomper » entre les phrases

scripts/duck_curve.py : lorsque la pause entre les phrases est inférieure à 2,5 secondes, la musique reste baissée (−11 dB) ; la baisse commence 0,25 s à l’avance, et la remontée utilise un lissage unipolaire de 0,9 s. La moyenne glissante de 0,3 s d’origine faisait remonter la musique à chaque pause, donnant l’impression de « halètement ». Le produit final est à −14 LUFS, avec un pic ne dépassant pas −1 dBFS ; le taux d’erreur ASR de la voix off dans le mix est compris entre 0 et 6,5 %.

6. Durée des images

  • Lorsque la voix off ne tient pas dans l’image, le segment animé peut être ralenti d’environ 5 %, et le segment d’enregistrement d’écran peut être prolongé ; ne comprimez pas la voix.
  • Les virgules nombreuses peuvent rendre la lecture TTS saccadée. Vous pouvez ajuster légèrement le texte sans changer le sens, par exemple remplacer « Here it is, live, on real footage » par « running live on real footage ».

7. Critères de validation

  1. Taux d’erreur par phrase (ASR) ≤ 0,08, confirmé également dans le mix.
  2. Vérification des défauts phrase par phrase avec Gemini (une phrase à la fois) : pas de coupure, de mot avalé, d’erreur de lecture, de fin de phrase en voix de gorge.
  3. Distance prosodique par rapport à la narration professionnelle, et test de naturel strict (échantillon unique, large échantillon, intervalle de confiance bootstrap) non inférieur à la référence, comme détaillé dans le document d’évaluation.
  4. Confirmation finale à l’oreille par l’utilisateur. L’évaluation AI ne peut pas prouver que cela ne sonne pas « étrange » (voir la section suivante).

8. Leçons sur « l’évaluation AI »

  • Comparaison deux à deux avec Gemini inutilisable : dans 86 % des cas, il choisit le fichier joué en premier, et l’ordre inverse donne des conclusions opposées.
  • Classement de plusieurs fichiers instable : deux classements du même ensemble se contredisent.
  • Score sans référence non fiable : un enregistrement amateur d’une vraie personne obtient environ 5, inférieur au score TTS d’environ 6.
  • Méthode fiable : test strict avec un seul échantillon, prenant comme référence une narration professionnelle, avec un grand échantillon et un intervalle de confiance. Même ainsi, le critère « jugé comme humain » reste très bruité (le même fichier peut obtenir 0/8 ou 3/8, et un acteur professionnel peut être jugé comme AI).
  • Les avis de l’évaluation AI doivent être vérifiés : par exemple, l’affirmation « le mix pompe » contredit la courbe de gain mesurée ; il faut se fier à la mesure.

Skills associés