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 :
| Option | Coût | Qualité | Synchronisation des sous-titres |
|---|---|---|---|
| Voix gratuite (par défaut) | Gratuit | Claire, un peu plate | Exacte, chaque mot s'allume quand il est dit |
| ElevenLabs | Leur abonnement payant ou crédits gratuits | La plus naturelle | Exacte quand le modèle fournit les timings |
| Sa propre voix | Gratuit | La plus personnelle | Estimé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 :
| Type | Son | Idéal pour |
|---|---|---|
whoosh swell | Air qui monte | Changements, objets qui entrent |
swipe | Coup d'air rapide | Déplacements rapides |
pop | Petit pop rond | Apparitions d'objets |
tick | Petit tic sec | Compteurs, petits moments |
click | Clic d'interrupteur net | Interrupteurs lumineux, boutons |
knock | Coup de jointure sur bois | Portes, tables |
thump | Bruit sourd faible | Ouvertures, grandes révélations |
stamp | Gifle dure avec poids | Verdicts, 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.