Communitygithub.com

wael-wq/natural-voice

Haz que una locución de ElevenLabs suene a persona real y no a robot: reescribe el guion para el oído, dirígelo con etiquetas de audio, ajusta estabilidad y velocidad, genera tomas con semilla y elige la que fluye mejor.

¿Qué es natural-voice?

Esta skill está diseñada para solucionar el problema más común de las locuciones con IA: que suenen robóticas, entrecortadas o sin emoción. En lugar de cambiar de voz o modelo, se enfoca en reescribir el guion para que suene natural al oído, utilizando herramientas como `speakable.py` para detectar fragmentos mal escritos, `takes.py` para generar múltiples tomas con diferentes semillas, y `gaps.py` para analizar pausas internas en las oraciones que delatan a la IA. Además, enseña a usar etiquetas de audio en corchetes (como `[excited]`), ajustar la estabilidad a 0.30–0.40 y la velocidad a 1.0–1.08 en el modelo `eleven_v4`, y a elegir la mejor toma basándose en datos objetivos. Es compatible con ElevenLabs y funciona en cualquier sistema con Python 3.9+ y, opcionalmente, ffmpeg. Los resultados medidos muestran una reducción de pausas internas de 0.34 segundos a cero, pasando de un guion "para el ojo" a uno "hablable" al 100%.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace natural-voice?

La mayoría de las locuciones "robóticas" de ElevenLabs no son un problema de voz. Son un problema de guion. El modelo lee exactamente lo que se le da, y un guion escrito para el ojo (titulares, fragmentos con puntos, dígitos, guiones) sale entrecortado sin importar qué voz lo lea.

Las tres herramientas de esta carpeta realmente funcionan. Úsalas; no juzgues el flujo solo leyendo el texto.

python3 speakable.py guion.txt                  # ¿está escrito para el oído?
python3 takes.py guion.txt --voice VOICE_ID     # tomas con semilla (pago, pregunta primero)
python3 gaps.py tomas/                           # clasifica las tomas por pausas intermedias

Las tres son Python 3.9+ plano, sin paquetes. gaps.py usa ffmpeg si está en el PATH para confirmar las pausas contra el propio audio.

El ciclo

1. Diagnostica antes de cambiar nada. Si ya hay una toma, ejecuta gaps.py sobre ella. Una pausa de más de 0.2 s dentro de una oración (no después de una coma o un punto) es lo que la gente percibe como "IA". En nuestra propia toma anterior, la voz se detuvo 0.3 s antes de "run" y nuevamente antes de "Instagram", en medio del gancho. Nada en nuestra edición lo causó: las pausas estaban en el archivo original.

2. Reescribe para el oído. Ejecuta speakable.py y corrige cada marca. Las reglas:

  • Oraciones, no titulares. "13 habilidades gratuitas de Claude ahora ejecutan tu Instagram." es un título. "Trece habilidades gratuitas de Claude ejecutan todo tu Instagram." es algo que dice una persona.
  • Las listas llevan comas, no puntos. "Reels. Leyendas. Carruseles." hace que el modelo se detenga tres veces. "reels, leyendas, carruseles, historias" fluye.
  • Números escritos como palabras en la línea hablada: "ochenta y cuatro de cada cien", no "84 de 100". El texto en pantalla puede mantener los dígitos.
  • Contracciones (has, es, vamos). Nadie dice "tú has" en voz alta.
  • Une los fragmentos con "así que", "y", "luego". Un conector es una señal para que el modelo continúe.
  • Sin guiones. ElevenLabs trata un guion como una pausa corta y afirma que es "menos consistente". Usa una coma para continuar, o un punto suspensivo para una pausa.
  • Sin SSML. <break time="1s"/> no es compatible con Eleven v4 ni v3.

3. Dirígelo. Eleven v4 acepta etiquetas de audio entre corchetes. Pon una etiqueta al inicio de un compás, no en cada línea, y haz que coincida con lo que la línea está haciendo. Consulta tags.md para la lista. speakable.py marca las etiquetas que no reconoce, porque una etiqueta desconocida puede leerse como un efecto de sonido.

[emocionado] Trece habilidades gratuitas de Claude ejecutan todo tu Instagram.
[con picardía] Así que dejamos que escribiera este Reel...

La puntuación también es dirección. Un punto suspensivo añade una pausa con peso, un signo de exclamación añade energía, y las MAYÚSCULAS añaden énfasis (úsalas una vez, en la palabra que importa).

4. Ajustes. En eleven_v4:

ajusteusopor qué
estabilidad0.30 a 0.40Un valor más bajo da "rango emocional más amplio"; el valor predeterminado de 0.5 es más plano. Por debajo de 0.3 una toma puede desviarse.
incremento_de_similitud0.75el predeterminado; mantiene la voz en sí
estilo0el predeterminado; cualquier otro valor añade latencia
velocidad1.0 a 1.08el rango permitido es 0.7 a 1.2; la locución social se sitúa justo por encima de 1

5. Tres tomas, mismo texto, diferentes semillas. Una toma es un volado. Ejecuta takes.py con semillas 1, 2 y 3, luego gaps.py para clasificarlas. Escucha las dos mejores y elige al oído. Conserva la semilla: hace que una re-ejecución dé una toma cercana (ElevenLabs lo llama "mejor esfuerzo", no garantizado).

6. Edita con suavidad. Si tu editor recorta silencios, deja aproximadamente un segundo después de las oraciones y la mayor parte de un segundo después de las comas. Las pausas recortadas siempre a la misma longitud corta son la otra cosa que suena a máquina.

7. ¿Sigue sonando generado? Deja de ajustar perillas. Grábate diciendo la línea en tu teléfono y pásala por el Cambiador de Voz (speech-to-speech) de ElevenLabs hacia la voz que quieras. Tu ritmo, énfasis y emoción se transfieren; solo cambia la voz.

Lo que medimos

En uno de nuestros propios Reels (los archivos están en examples/):

antesdespués
guionescrito para el ojo: fragmentos, dígitosescrito para el oído: speakable.py limpio
etiquetasninguna[emocionado], [con picardía]
ajustesestabilidad 0.5, velocidad 1.0estabilidad 0.35, velocidad 1.05
tomas13 semillas, elegida por gaps.py luego al oído
speakable.py65, REESCRIBIR (una lista en puntos, dígitos, sin etiquetas)100, HABLABLE
pausas dentro de oraciones0.34 s entre "ahora" y "ejecutan", en el ganchoninguna

La voz también cambió (Will a Chris), así que esto no es una prueba de laboratorio de un solo ajuste. La reescritura del guion marcó la mayor diferencia que pudimos oír.

Reglas

  • Nunca envíes una solicitud paga sin decir cuánto cuesta. takes.py imprime el conteo de caracteres y se detiene a menos que pases --yes.
  • Nunca imprimas ni confirmes la clave API. takes.py lee ELEVENLABS_API_KEY del entorno y nada más.
  • Etiquétalo. Si la voz es generada, activa la etiqueta de IA de la plataforma.

Skills relacionados