Communitygithub.com

viral-voice

Ajoute la voix off, les sous-titres synchronisés mot par mot et les effets sonores à un reel sans visage, et produit la vidéo finale.

Qu'est-ce que viral-voice ?

L'outil viral-voice est la quatrième étape du pack viral, conçu pour ajouter une voix off, des sous-titres synchronisés mot par mot (word-timed captions) et des effets sonores à un reel animé sans visage, puis exporter la vidéo finale. Il prend en charge plusieurs options de voix : une voix gratuite multilingue (malayalam, anglais, hindi, tamoul, etc.) via le service de lecture à voix haute de Microsoft Edge (edge-tts), une voix naturelle premium via ElevenLabs (avec clé API), ou un enregistrement audio personnel de l'utilisateur. Le script génère des sous-titres exacts ou estimés selon l'option choisie. Il inclut également un générateur d'effets sonores synthétiques (sans droits de licence) comme des pops, whoosh, clics, etc., qui se synchronisent automatiquement avec les transitions du reel. L'utilisateur peut ajuster le débit de parole, les pauses, et vérifier la prononciation en écoutant la piste audio ou en utilisant un outil de transcription externe. Une fois la voix et les effets finalisés, finish.py rend la vidéo complète (avec mixage audio et normalisation LUFS) et produit final.mp4.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/hadi-a-azeez/viral-agent/tree/main/skills/viral-voice

Demander à votre IA préférée

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

Documentation

Que fait viral-voice ?

Exécutez la configuration une fois : bash setup.sh. Les scripts de ce guide se trouvent à côté de ce fichier, utilisez donc leur chemin complet.

1. Choisir une voix

Demandez à l'utilisateur laquelle il souhaite et soyez direct sur les compromis :

OptionCoûtQualitéSynchronisation des sous-titres
Voix gratuite (par défaut)GratuitClaire, un peu plateExacte, chaque mot s'allume quand il est dit
ElevenLabsLeur abonnement payant ou crédits gratuitsLa plus naturelleExacte quand le modèle fournit les timings
Sa propre voixGratuitLa plus personnelleEstimée par ligne. Plus précise si enregistrée par beat

Leur propre voix donne généralement les meilleurs résultats, car on peut entendre quand quelqu'un parle avec sincérité. Un reel sans visage n'a pas à être sans voix.

# Voix gratuite. Choisit Midhun pour le malayalam. --voice ml-IN-SobhanaNeural pour l'autre voix malayalam.
python3 voice.py <projet>

# ElevenLabs. Nécessite ELEVENLABS_API_KEY et un identifiant de voix. Le malayalam nécessite un modèle qui le prend en charge, comme eleven_v3.
python3 voice.py <projet> --engine elevenlabs --voice <id voix> --model eleven_v3

# Son propre enregistrement, une seule prise du script complet dans l'ordre
python3 voice.py <projet> --engine file --audio prise.m4a

# Son propre enregistrement, un fichier par beat (voice/b1.m4a, voice/b2.m4a). La synchronisation est plus serrée ainsi.
python3 voice.py <projet> --engine file --audio voice/

L'audio de tout autre outil fonctionne aussi via --engine file. Ainsi, si un outil de génération vocale est connecté, générez un fichier par beat et passez le dossier.

Pour les enregistrements, chaque ligne est chronométrée par la longueur des mots entre les pauses, donc un sous-titre peut être décalé d'environ une seconde dans une longue prise unique. Lors de notre test sur un vrai reel malayalam de 48 secondes, la plupart des sous-titres étaient précis à une demi-seconde près. Si le rendu semble décalé, enregistrez par beat.

La voix gratuite utilise le service de lecture à voix haute de Microsoft Edge via l'outil open-source edge-tts. Il ne s'agit pas d'une API officielle, elle pourrait donc changer ou cesser de fonctionner. Toute personne l'utilisant pour un travail client ou commercial doit d'abord vérifier les conditions d'utilisation. Mentionnez ce point si l'utilisateur crée des vidéos pour une entreprise.

2. Quelqu'un doit écouter

Vous ne pouvez pas entendre l'audio via ces outils, et timing.json n'affiche que les mots du script, jamais ce que la voix a réellement dit. Rien ici ne peut donc confirmer la prononciation. Demandez à l'utilisateur d'écouter voice.wav, ou si un outil de transcription est connecté, transcrivez-le et comparez. Dites clairement que c'est inaudible si rien de tout cela n'est fait.

Quand la voix prononce un mot de travers, ajoutez "tts" à ce beat dans script.json avec une orthographe qu'elle dit correctement, puis relancez. Le sous-titre continue d'utiliser say. Conservez le même nombre de mots dans tts que dans say quand c'est possible. S'ils diffèrent, voice.py affiche une note et les temps de sous-titres de ce beat deviennent estimés.

Si une ligne semble précipitée, modifiez --rate (par défaut +8%). --gap définit la pause entre les beats.

Les estimations de durée de lint_script.py et timing.py ne sont qu'approximatives et peuvent être 10 à 15% trop courtes. La durée réelle est celle affichée par voice.py. Pour atteindre une cible, modifiez --rate ou réduisez les mots, puis relancez.

3. Regarder à nouveau l'image

La voix réelle a tout décalé, alors vérifiez avant le rendu final :

node <dossier viral-animate>/render.mjs <projet> --stills beats

Ouvrez stills/beats.jpg. Les mouvements liés à k, d ou kit.at ont suivi la voix. Ceux avec des secondes fixes ne l'ont pas fait, corrigez-les dans scenes.js.

4. Effets sonores

sfx.py s'exécute automatiquement : un faible bruit sourd au début et un chuchotement discret à chaque changement de beat. Pour une pièce calme et émotionnelle, désactivez-les avec "sfx_auto": false dans script.json. Pour en ajouter, listez-les, sur un mot pour qu'ils restent synchronisés :

"sfx": [{ "beat": "b2", "word": "chargeur", "kind": "pop", "db": -14 }]

Utilisez "at": 1.1 au lieu de word pour les secondes écoulées du beat. Un mot que le beat ne prononce pas s'arrête avec un message clair. Types :

TypeSonIdéal pour
whoosh swellAir qui monteChangements, objets qui entrent
swipeCoup d'air rapideDéplacements rapides
popPetit pop rondApparitions d'objets
tickPetit tic secCompteurs, petits moments
clickClic d'interrupteur netInterrupteurs lumineux, boutons
knockCoup de jointure sur boisPortes, tables
thumpBruit sourd faibleOuvertures, grandes révélations
stampGifle dure avec poidsVerdicts, argument décisif

Ils sont tous synthétiques, donc sans risque de licence. Le pack n'ajoute pas de musique : il garde la voix claire et évite les problèmes de droit d'auteur. Si l'utilisateur souhaite de la musique, il peut l'ajouter dans l'éditeur d'Instagram.

5. Terminer

python3 finish.py <projet>

Cela rend l'image en pleine qualité sur le timing réel de la voix, mixe les effets, règle le volume à environ -14 LUFS et écrit final.mp4. Ajoutez --no-render pour ne remixer que le son.

Versions d'essai : pour tester les autres accroches, copiez le dossier du projet, placez la say d'une autre accroche dans b1 et son label dans le label de niveau supérieur, puis exécutez voice.py et finish.py sur la copie. Les mouvements liés à k, d ou kit.at suivent. Vérifiez que tout mot de kit.at est toujours dans la nouvelle accroche.

Ensuite, allez dans /viral-check. Ne considérez pas le reel comme terminé avant cela.

Skills associés