¿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ón | Costo | Calidad | Sincronización de subtítulos |
|---|---|---|---|
| Voz gratuita (predeterminada) | Gratis | Clara, un poco plana | Exacta, cada palabra se ilumina al decirse |
| ElevenLabs | Su plan de pago o créditos gratuitos | La más natural | Exacta cuando el modelo da marcas de tiempo |
| Su propia voz | Gratis | La más personal | Estimada 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:
| Tipo | Suena como | Bueno para |
|---|---|---|
whoosh swell | Aire ascendente | Cambios, cosas que vuelan |
swipe | Cepillado rápido de aire | Movimientos rápidos |
pop | Pequeño pop redondo | Cosas que aparecen |
tick | Pequeño tic seco | Contadores, momentos pequeños |
click | Clic de interruptor | Interruptores de luz, botones |
knock | Golpe de nudillo en madera | Puertas, mesas |
thump | Golpe bajo | Aperturas, grandes revelaciones |
stamp | Palmada fuerte con peso | Veredictos, 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.