Narración AI para Videos de Producto: De "Un Poco Extraño" a Nivel Profesional
Esta habilidad proviene de un retrabajo real. Un video de producto de hackathon en inglés de 2 minutos y 43 segundos (11 frases de narración, sincronizadas con las imágenes) recibió comentarios de que la voz "sonaba un poco extraña". Después de 9 versiones, más de una docena de motores TTS y voces, una revisión calibrada y muestras estadísticas grandes, se adoptó el siguiente enfoque: generación continua única con MOSS-TTS + verificación de contenido al dividir en frases + postprocesado clásico sin dañar la voz, lo cual fue aprobado por el usuario.
Los métodos de evaluación se encuentran en references/evaluation.md, las decisiones técnicas de procesamiento acústico en references/acoustic-polish.md, y los scripts reutilizables en scripts/.
1. Primero, Diagnosticar el "Extrañeza": Generalmente No es la Calidad, Sino la Prosodia
[!IMPORTANT] Los buenos TTS ya superan en calidad de sonido a las grabaciones promedio. Las puntuaciones UTMOS / Distill-MOS son más altas que las de locuciones humanas limpias (LibriSpeech), por lo que lo "extraño" proviene casi siempre de la prosodia. Tomando como referencia locuciones profesionales de dominio público (documentales de la NASA, voz separada con Demucs), las características medidas son las siguientes:
| Característica | Locutor Profesional | TTS Clonado Frase por Frase (Versión Inicial) |
|---|---|---|
| Variación de tono (desviación estándar F0, semitonos) | 4.6 | 2.7 (plano) |
| Caída al final de la frase (semitonos) | 0.7 | 2.3 (caída fuerte) |
| Velocidad de habla (sílabas/segundo) | 4.2 | 4.55 (ligeramente rápido) |
| Pausa media (segundos) | 0.39 | 0.54 |
Usa scripts/prosody_compare.py, scripts/end_fall.py y scripts/take_features.py para comparar las candidatas y la referencia con el mismo conjunto de características, basándote en datos, no en impresiones.
2. Generación: Leer el Texto Completo de una Sola Vez, No Frase por Frase
- Priorizar la generación continua. Al generar frase por frase, cada una tiene su propio patrón de variación, énfasis y respiración, y al unirlas resulta "extraño". Haz que el TTS lea toda la narración de una sola vez, separando las frases con líneas en blanco; así, el modelo ve el contexto y las frases se conectan. En este ejemplo, se usó el modo de clonación de MOSS-TTS v1.5 con un audio de referencia de unos 15 segundos con un tono adecuado. Se generaron 4 versiones con diferentes semillas aleatorias; cada una duró unos 2 minutos 10 segundos y tuvo una tasa de error de palabras (WER) del 2-6%.
- Resultados de la comparación de candidatas (misma evaluación):
- MOSS generación continua única: Distancia prosódica respecto al locutor profesional 0.29 (la más cercana), con menos defectos.
- Qwen3-TTS VoiceDesign generación frase por frase, con instrucciones de actuación y selección según prosodia: Distancia 0.37, naturalidad similar a MOSS.
- OpenAI gpt-audio: Distancia 0.57.
- Clonación frase por frase: Distancia 0.89.
- Trampas conocidas:
- MOSS-VoiceGenerator (que usa descripciones textuales de la voz) se detiene antes de tiempo con textos largos (aproximadamente a los 33 segundos), por lo que no sirve para generación continua.
- Gemini TTS debe usar un formato de segmentación especial ("AUDIO PROFILE / DIRECTOR'S NOTES / TRANSCRIPT"), de lo contrario leerá las instrucciones. La capa gratuita solo permite 10 llamadas al día por modelo.
- Las voces de OpenAI tienden a poca variación de tono en las revisiones. Si se usan voces AI comerciales, se debe indicar al final del video.
- Selección de semillas según características prosódicas: Con una tasa de error de palabras aceptable, elige la semilla con la menor distancia prosódica respecto a la referencia. Si una frase en particular tiene mal resultado (por ejemplo, un eslogan final que suena grave), puedes reemplazar solo esa frase con la misma voz de referencia pero de otra semilla.
3. División en Frases: Verificar por Contenido, No Confiar Solo en Marcas de Tiempo
El audio completo generado de forma continua debe dividirse en frases para sincronizarlo con las imágenes. El método de scripts/align_split.py:
- Obtén marcas de tiempo a nivel de palabra con SenseVoice y alinéalas con el guion usando la distancia de Levenshtein.
- Corta en los silencios entre dos frases.
- Verifica por contenido: Prueba a cortar en cada silencio dentro de 1.5 segundos alrededor del punto de corte. Vuelve a reconocer los segmentos izquierdo y derecho, y elige la posición que minimice la suma de las tasas de error de palabras de ambos segmentos.
Solo confiar en las marcas de tiempo puede causar errores: el TTS a menudo hace pausas dentro de una frase (por ejemplo, "Just | sentences.") y, en cambio, une las frases. Las marcas de tiempo a nivel de palabra también se retrasan con respecto al inicio real del habla. Sin esta verificación, "does | it" y "Just | sentences" pueden cortarse al inicio de la siguiente frase.
4. Postprocesado: Solo Corregir Problemas Cuantificables, No Tocar el Tono
| Procesamiento | Conclusión |
|---|---|
Regularizar pausas según puntuación (pause_fix_en.py: 0.10 s dentro de frases, 0.25 s en comas, 0.33 s en dos puntos, 0.45 s al final de frase; conservar 0.8 s para eslóganes cortos) | Conservar: Solo acortar, nunca alargar; se acerca más a las pausas del locutor profesional. |
Normalizar sonoridad (-20 LUFS por frase), filtro pasa altos 70 Hz, -2 dB a 300 Hz, ligero de-esser, 6% de reverberación de sala pequeña (vo_post.py) | Conservar: No reduce la puntuación de calidad de sonido. |
| Limitador | Eliminar: Reduce el Distill-MOS en aproximadamente 0.14. En su lugar, usa control de ganancia lineal para limitar los picos. |
| Usar vocoder WORLD o Praat PSOLA para elevar el final de las frases o aumentar la variación general del tono | Abandonar: Las características se acercan más al locutor profesional, pero las puntuaciones en revisiones estrictas empeoran (cuanto más se modifica con WORLD, peor; la versión más agresiva obtiene -0.30, con intervalo de confianza [-0.61, -0.03]). |
Principio: Los problemas de final de frase y variación de tono se resuelven generando más versiones y seleccionando la mejor, no modificando el tono después.
5. Mezcla: Que la Música No "Bombee" Entre Frases
scripts/duck_curve.py: Cuando la pausa entre frases es menor de 2.5 segundos, la música se mantiene baja (−11 dB). La reducción comienza 0.25 segundos antes y la recuperación usa un suavizado de un solo polo de 0.9 segundos. El promedio móvil de 0.3 segundos anterior hacía que la música subiera en cada pausa, dando una sensación de "jadeo". El video final tiene −14 LUFS, con picos que no superan −1 dBFS. La tasa de error de palabras (ASR) de la narración en la mezcla final está entre 0% y 6.5%.
6. Duración de las Imágenes
- Si la narración no cabe en las imágenes, la animación se puede ralentizar un 5% o se puede alargar la pausa en las grabaciones de pantalla, pero nunca comprimir la voz.
- Las comas densas pueden hacer que el TTS suene rígido. Se puede ajustar ligeramente el texto sin cambiar el significado, por ejemplo, cambiando "Here it is, live, on real footage" por "running live on real footage".
7. Criterios de Aprobación
- Tasa de error de palabras por frase inferior a 0.08; verificar de nuevo en la mezcla final.
- Cada frase se revisa individualmente con Gemini (una sola frase a la vez) para detectar defectos: sin cortes de edición, sin palabras omitidas, sin errores de lectura, sin caídas a voz gutural al final.
- La distancia prosódica respecto al locutor profesional, así como las pruebas de naturalidad estrictas (muestra grande, intervalo de confianza bootstrap) no deben ser inferiores a la referencia. Ver documento de evaluación.
- Aprobación final del usuario mediante escucha. La revisión AI no puede probar que "no suene extraño", como se explica en la siguiente sección.
8. Lecciones sobre la "Revisión AI"
- Comparación por pares de Gemini no es fiable: En el 86% de los casos, selecciona la pista que se reproduce primero, y el orden inverso da el resultado opuesto.
- Clasificación de múltiples pistas es inestable: Las clasificaciones del mismo conjunto de materiales en dos rondas son contradictorias.
- Puntuaciones sin referencia no son fiables: Grabaciones de aficionados reales obtienen solo unos 5 puntos, inferiores a las puntuaciones de TTS de unos 6 puntos.
- Método utilizable: Pruebas estrictas de una sola muestra con un locutor profesional como referencia, combinadas con muestras grandes e intervalos de confianza. Incluso así, el indicador "considerado humano" tiene mucho ruido (el mismo audio puede obtener 0/8 o 3/8, y los actores profesionales también pueden ser clasificados como AI).
- Las opiniones de la revisión AI deben verificarse: Por ejemplo, la afirmación "la mezcla bombea" contradice la curva de ganancia medida; se debe confiar en la medición.