Communitygithub.com

wael-wq/natural-voice

Transformez une voix off ElevenLabs robotique en une voix naturelle : réécrivez le script pour l'oreille, dirigez-le avec des tags audio, réglez la stabilité et la vitesse, générez des prises seedées et choisissez la meilleure. Idéal quand une TTS ou une voix off IA sonne mécanique, saccadée, plate, « trop IA » ou sans émotion, ou avant de payer pour une longue génération.

Qu'est-ce que natural-voice ?

Ce skill résout le problème des voix off ElevenLabs qui sonnent robotiques non pas en changeant la voix, mais en réécrivant le script pour l'oreille humaine. Il fournit trois outils Python sans dépendances : `speakable.py` pour détecter les phrases écrites pour l'œil, `takes.py` pour générer des prises seedées (avec avertissement de coût), et `gaps.py` pour classer les prises par pauses intra-phrase. Le flux complet comprend le diagnostic des pauses internes (supérieures à 0,2 s), la réécriture du script en phrases fluides avec contractions et connecteurs, l'ajout de tags audio Eleven v4 (comme [excited] ou [mischievously]), le réglage de la stabilité entre 0,30 et 0,40, et la génération de trois prises seedées pour sélectionner la meilleure. Une méthode alternative consiste à enregistrer sa voix naturelle et à utiliser le Voice Changer (speech-to-speech) d'ElevenLabs pour conserver le phrasé original. Le skill interdit les requêtes payantes non annoncées et la divulgation de la clé API.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wael-wq/natural-voice-skill/tree/HEAD

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 natural-voice ?

La plupart des voix off ElevenLabs dites « robotiques » ne sont pas un problème de voix. Ce sont un problème de script. Le modèle lit exactement ce qu'on lui donne, et un script écrit pour l'œil (titres, fragments en points, chiffres, tirets) ressort saccadé, peu importe la voix qui le lit.

Trois outils dans ce dossier sont réellement exécutables. Utilisez-les ; ne jugez pas le flux en lisant le texte.

python3 speakable.py script.txt                  # est-ce écrit pour l'oreille ?
python3 takes.py script.txt --voice VOICE_ID     # prises seedées (payant, demande d'abord)
python3 gaps.py takes/                           # classe les prises par les pauses intra-phrase

Tous les trois sont en Python 3.9+ pur, sans paquets. gaps.py utilise ffmpeg s'il est dans le PATH pour confirmer les pauses avec l'audio lui-même.

Le cycle

1. Diagnostiquez avant de changer quoi que ce soit. S'il existe déjà une prise, lancez gaps.py dessus. Une pause de plus de 0,2 s à l'intérieur d'une phrase (pas après une virgule ou un point) est ce que les gens entendent comme « IA ». Dans notre propre prise de départ, la voix s'est arrêtée 0,3 s avant « run » et à nouveau avant « Instagram », en plein milieu de l'accroche. Rien dans notre montage ne l'a causé : les pauses étaient dans le fichier brut.

2. Réécrivez pour l'oreille. Lancez speakable.py et corrigez chaque drapeau. Les règles :

  • Phrases, pas de titres. « 13 compétences Claude gratuites gèrent maintenant votre Instagram. » est un titre. « Treize compétences Claude gratuites gèrent tout votre Instagram. » est ce qu'une personne dit.
  • Les listes prennent des virgules, pas des points. « Reels. Légendes. Carrousels. » oblige le modèle à s'arrêter trois fois. « reels, légendes, carrousels, stories » coule.
  • Les nombres en toutes lettres dans la ligne parlée : « quatre-vingt-quatre sur cent », pas « 84 sur 100 ». Le texte à l'écran peut garder les chiffres.
  • Les contractions (t'as, c'est, on va). Personne ne dit « tu as » à voix haute.
  • Reliez les fragments avec « donc », « et », « puis ». Un connecteur est un signal pour que le modèle continue.
  • Pas de tirets. ElevenLabs traite un tiret comme une courte pause et dit lui-même que c'est « moins cohérent ». Utilisez une virgule pour continuer, ou des points de suspension pour une pause.
  • Pas de SSML. <break time="1s"/> n'est pas pris en charge sur Eleven v4 ou v3.

3. Dirigez-le. Eleven v4 accepte des tags audio entre crochets. Mettez un tag au début d'un segment, pas sur chaque ligne, et faites-le correspondre à ce que fait la ligne. Voir tags.md pour la liste. speakable.py signale les tags qu'il ne connaît pas, car un tag inconnu peut être lu comme un effet sonore.

[excited] Treize compétences Claude gratuites gèrent tout votre Instagram.
[mischievously] Alors on l'a laissé écrire ce Reel...

La ponctuation est aussi une direction. Des points de suspension ajoutent une pause pesante, un point d'exclamation ajoute de l'énergie, et les MAJUSCULES ajoutent de l'emphase (utilisez-les une fois, sur le mot important).

4. Réglages. Sur eleven_v4 :

réglageutilisationpourquoi
stability0,30 à 0,40Plus bas donne une « gamme émotionnelle plus large » ; le défaut 0,5 est plus plat. En dessous de 0,3 une prise peut dériver.
similarity_boost0,75le défaut ; conserve la voix elle-même
style0le défaut ; tout autre chose ajoute de la latence
speed1,0 à 1,08la plage autorisée est 0,7 à 1,2 ; une voix off sociale se situe juste au-dessus de 1

5. Trois prises, même texte, graines différentes. Une seule prise est un coup de pile ou face. Lancez takes.py avec les graines 1, 2 et 3, puis gaps.py pour les classer. Écoutez les deux premières et choisissez à l'oreille. Gardez la graine : elle permet une réexécution proche de la même prise (ElevenLabs appelle cela « best effort », non garanti).

6. Montez doucement. Si votre éditeur coupe les silences, conservez environ une seconde après les phrases et la majeure partie d'une seconde après les virgules. Des pauses coupées à la même courte longueur à chaque fois sont l'autre chose qui sonne artificiel.

7. Ça sonne toujours généré ? Arrêtez de tourner les boutons. Enregistrez-vous en disant la ligne sur votre téléphone et passez-la dans le Voice Changer (speech-to-speech) d'ElevenLabs vers la voix que vous voulez. Votre rythme, votre emphase et votre émotion sont conservés ; seule la voix change.

Ce que nous avons mesuré

Sur l'un de nos propres Reels (les fichiers sont dans examples/) :

avantaprès
scriptécrit pour l'œil : fragments, chiffresécrit pour l'oreille : speakable.py propre
tagsaucun[excited], [mischievously]
réglagesstability 0,5, speed 1,0stability 0,35, speed 1,05
prises13 graines, choisies par gaps.py puis à l'oreille
speakable.py65, REWRITE (une liste en points, chiffres, pas de tags)100, SPEAKABLE
pauses dans les phrases0,34 s entre « now » et « run », dans l'accrocheaucune

La voix a aussi changé (Will en Chris), donc ce n'est pas un test en laboratoire d'un seul réglage. La réécriture du script a fait la plus grande différence que nous ayons entendue.

Règles

  • N'envoyez jamais une requête payante sans dire combien elle coûte. takes.py affiche le nombre de caractères et s'arrête sauf si vous passez --yes.
  • N'imprimez ni ne commitez jamais la clé API. takes.py lit ELEVENLABS_API_KEY à partir de l'environnement et rien d'autre.
  • Étiquetez-la. Si la voix est générée, activez l'étiquette IA de la plateforme.

Skills associés