Communitygithub.com

hadi-a-azeez/viral-voice

Añade voz en off, subtítulos sincronizados por palabra y efectos de sonido a un reel sin rostro, y produce el video finalizado.

¿Qué es viral-voice?

Esta habilidad es el cuarto paso del paquete viral y se encarga de añadir narración, subtítulos con sincronización palabra por palabra y efectos de sonido a un reel animado sin rostro creado con viral-animate. Soporta tres opciones de voz: una voz gratuita basada en IA (que incluye malayalam, inglés, hindi, tamil y muchos otros idiomas) a través del servicio de lectura en voz alta de Microsoft Edge, voces premium de ElevenLabs con calidad más natural, o la propia grabación del usuario para un toque más personal. La herramienta genera subtítulos sincronizados por palabra para las voces gratuitas y de ElevenLabs, mientras que para grabaciones propias estima el tiempo dentro de cada línea. También incluye una biblioteca de efectos de sonido sintéticos (sin riesgo de licencias) que se sincronizan automáticamente con los latidos del guion, y produce el video final en formato 'final.mp4' con normalización de audio. Es útil para creadores que desean añadir voz, subtítulos o efectos a un reel ya animado, o para finalizar, renderizar o exportar un proyecto creado con viral-animate.

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

Preguntar en tu IA favorita

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

Documentación

¿Qué hace viral-voice?

Ejecuta la configuración una vez: bash setup.sh. Los scripts de esta guía están junto a este archivo, así que usa su ruta completa.

1. Elige una voz

Pregunta cuál quieren y sé claro sobre las ventajas y desventajas:

OpciónCostoCalidadSincronización de subtítulos
Voz gratuita (predeterminada)GratisClara, un poco planaExacta, cada palabra se ilumina al decirse
ElevenLabsSu plan de pago o créditos gratuitosLa más naturalExacta cuando el modelo da marcas de tiempo
Su propia vozGratisLa más personalEstimada dentro de cada línea. Más precisa si se graba por latido

Su propia voz suele funcionar mejor, porque la gente puede oír cuando alguien lo dice con sentimiento. Un reel sin rostro no tiene por qué ser sin voz.

# Voz gratuita. Elige Midhun para malayalam. Usa --voice ml-IN-SobhanaNeural para la otra voz en malayalam.
python3 voice.py <proyecto>

# ElevenLabs. Necesita ELEVENLABS_API_KEY y un ID de voz. El malayalam necesita un modelo que lo incluya, como eleven_v3.
python3 voice.py <proyecto> --engine elevenlabs --voice <id de voz> --model eleven_v3

# Su propia grabación, una sola toma de todo el guion en orden
python3 voice.py <proyecto> --engine file --audio take.m4a

# Su propia grabación, un archivo por latido (voice/b1.m4a, voice/b2.m4a). La sincronización es más precisa así.
python3 voice.py <proyecto> --engine file --audio voice/

El audio de cualquier otra herramienta también funciona con --engine file, así que si tienes una herramienta de generación de voz conectada, genera un archivo por latido y pasa la carpeta.

Para grabaciones, cada línea se sincroniza por la longitud de las palabras entre pausas, por lo que un subtítulo puede desviarse hasta aproximadamente un segundo en una sola toma larga. En nuestra prueba con un reel real de 48 segundos en malayalam, la mayoría de los subtítulos se ajustaron dentro de medio segundo. Si se ve mal, graba por latido.

La voz gratuita funciona mediante el servicio de lectura en voz alta de Microsoft Edge a través de la herramienta de código abierto edge-tts. No es una API oficial, por lo que podría cambiar o dejar de funcionar, y cualquiera que la use para trabajos con clientes o comerciales debe verificar los términos primero. Di esto si el usuario está haciendo videos para un negocio.

2. Alguien tiene que escuchar

No puedes oír el audio a través de estas herramientas, y timing.json solo muestra las palabras del guion, nunca lo que realmente dijo la voz. Así que nada aquí puede confirmar la pronunciación. Pide al usuario que escuche voice.wav, o si hay una herramienta de transcripción conectada, transcríbelo y compara. Di claramente que no se ha escuchado si no ocurre ninguna de las dos cosas.

Cuando la voz dice una palabra incorrectamente, añade "tts" a ese latido en script.json con una ortografía que sí diga correctamente, y ejecútalo de nuevo. El subtítulo sigue usando say. Mantén el mismo número de palabras en tts que en say cuando sea posible. Si difieren, voice.py imprime una nota y el tiempo de ese latido se convierte en una estimación.

Si una línea suena apresurada, cambia --rate (predeterminado +8%). --gap establece la pausa entre latidos.

Las estimaciones de duración de lint_script.py y timing.py son solo aproximadas y pueden quedar entre un 10 y un 15% cortas. La duración real es la que imprime voice.py. Para alcanzar un objetivo, cambia --rate o recorta palabras, luego ejecuta de nuevo.

3. Mira la imagen otra vez

La voz real lo ha movido todo, así que mira antes del renderizado final:

node <carpeta de viral-animate>/render.mjs <proyecto> --stills beats

Abre stills/beats.jpg. El movimiento vinculado a k, d o kit.at ha seguido a la voz. Cualquier cosa con segundos fijos no lo ha hecho, así que ajústalos en scenes.js.

4. Efectos de sonido

sfx.py se ejecuta automáticamente: un golpe bajo al inicio y un soplido suave en cada cambio de latido. Para una pieza tranquila y emotiva, desactívalos con "sfx_auto": false en script.json. Para añadir más, enuméralos sobre una palabra para que se mantengan sincronizados:

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

Usa "at": 1.1 en lugar de word para segundos dentro del latido. Una palabra que el latido no dice se detiene con un mensaje claro. Tipos:

TipoSuena comoBueno para
whoosh swellAire ascendenteCambios, cosas que vuelan
swipeCepillado rápido de aireMovimientos rápidos
popPequeño pop redondoCosas que aparecen
tickPequeño tic secoContadores, momentos pequeños
clickClic de interruptorInterruptores de luz, botones
knockGolpe de nudillo en maderaPuertas, mesas
thumpGolpe bajoAperturas, grandes revelaciones
stampPalmada fuerte con pesoVeredictos, sentar un punto

Todos son sintetizados, por lo que no hay riesgo de licencias. El paquete no añade música: mantiene la voz clara y evita reclamaciones de derechos de autor. Si el usuario quiere música, puede añadirla en el editor de Instagram.

5. Finalizar

python3 finish.py <proyecto>

Esto renderiza la imagen de máxima calidad con la sincronización real de la voz, mezcla los efectos, ajusta el volumen a aproximadamente -14 LUFS y escribe final.mp4. Añade --no-render para solo mezclar el sonido.

Versiones de prueba: para probar otros ganchos, copia la carpeta del proyecto, pon el say de otro gancho en b1 y su label en el label de nivel superior, luego ejecuta voice.py y finish.py en la copia. El movimiento vinculado a k, d o kit.at sigue. Verifica que cualquier palabra kit.at siga estando en el nuevo gancho.

Luego ve a /viral-check. No des el reel por terminado antes de eso.

Skills relacionados