Sonido del video
Fecha: 2026-10-22 · Tipo: skill · Estado: vigente
Resumen: el sonido de un video parte de una lista de eventos (uno por elemento que aparece, sale o golpea la pantalla) y de un comando, som.py, que coloca cada efecto con el pico en el cuadro correcto, asienta la música bajo la voz y entrega la mezcla con un informe. El sonido no espera al render: con el tiempo de la animación asentado, ya se puede realizar. Los números de la mezcla tienen un único dueño, 06-metodo/reglas.md; esta skill trae el método, los comandos y la tabla principal.
Cuándo usar
- Cualquier video con motion, interfaz, tutorial, anuncio o video solo con música que necesite efectos sincronizados.
- Video narrado: voz seca al frente, música de fondo, efectos discretos.
- Video con personas o lugares que parece "mudo": sonido de ambiente (ambiencia y foley). Ver references/som-de-cena.md.
- Para tratar una canción: medir beats y drop (
batida.py) o separar la voz (separar.py).
El método
- Un sonido por cada acción visible, y el sonido describe la acción. Tarjeta que entra hace pop, botón hace clic, cambio de pantalla hace whoosh, sello golpea, número rueda. La densidad es por acción, no por palabra: máximo dos efectos sonando juntos bajo la voz.
- Solo entra sonido que la imagen motiva. Whoosh en corte estático, reloj sin reloj en escena y riser sin nada subiendo despegan el sonido del video. Antes de mezclar, mira el video y anota qué se mueve, cuándo y con qué material.
- El pico cae en el cuadro del evento. Clic, pop, sello e impacto: el pico en el cuadro donde el elemento toca. Whoosh: el pico en medio del gesto (~0.2 s después del inicio; el mapa estándar ya lo hace). Riser: termina seco en el drop o en el corte.
- Tonal solo en hype, transición y sorpresa. Golpe en el tono en el impacto, en el sello y en el logo; pad corto en la transición grande; campana en la revelación. Nunca en clic, pop o tecla, que se vuelven "musiquita" y cansan. Usa
--tom(ej.:Am) solo cuando la canción tenga tono conocido. - Música por momentos, no una alfombra. Apertura suave; desaceleración antes del drop; respiro; clímax en el bombo. Con narración, la música queda muy por debajo de la voz y sube en los respiros y en los tramos sin habla.
- Respiro antes del drop. El instrumental cae seco por ~0.3–0.5 s en el último beat antes del drop (
--drop Thace esto), y la palabra clave o el mayor cambio de imagen va en el primer cuadro del drop. Mide el drop conbatida.py, no a ojo. - Capas solo en los picos. 2–3 sonidos juntos en el drop, en el logo y en el cierre; en el resto, un sonido por acción. Varía la altura cuando el mismo sonido se repite (el mapa rota entre las variaciones de la categoría).
- Voz seca. Narración sin reverb ni eco.
- Escucha las capas separadas.
som.pygrabaescuta/voz.wav,musica.wav,efeitos.wavytonais.wav. La sincronía se comprueba en el stem de efectos, nunca en la mezcla.
Números principales
Dueño: 06-metodo/reglas.md. Si allí dice otro número, vale el de allí. La Mesa ya aplica estos valores por sí sola.
| Qué | Valor |
|---|---|
| Master con voz o música | −14 LUFS integrado, pico verdadero ≤ −1 dBTP (limitador a 4×) |
| Música bajo la voz | ~15 dB por debajo cuando hay habla (el informe mide; acepta 12–18) |
| Mezcla sin voz con música real | pista nivelada a −19 LUFS antes de efectos; efectos ×2.2; limitador; master −14 |
| Pieza solo de sonido de ambiente | −25 LUFS integrado (techo −24), corto plazo ≤ −20, momentáneo ≤ −16, pico ≤ −3. Nunca normalizar a −14 |
| Sonido de ambiente con voz | stem del sonido de ambiente ≥ 15 LU por debajo de la voz |
| Biblioteca de efectos | cortos −20 LUFS de pico momentáneo, fondos −24, pico ≤ −3 dBTP; posición at = evento − pico_ms/1000 |
| Sincronía | mediana ≤ 25 ms en el stem de efectos |
| Beats | beat_this, File2Beats(checkpoint_path="final0"); corte a ≤ 2 cuadros del beat |
Paso a paso
Todos los comandos se ejecutan desde la raíz del estudio.
- ¿Biblioteca lista? Si
05-biblioteca/som/sfx/catalogo.jsonno existe:uv run scripts/som/sintetizar_sfx.py. Sonidos grabados:uv run scripts/som/nivelar.py <carpeta del pack>(detalles en 05-biblioteca/som/README.md). - Eventos. Exporta desde el motor de animación un
eventos.jsonen la carpetaaudio/del proyecto. Formato, tipos aceptados y cómo exportar desde After Effects, HyperFrames y Remotion: references/eventos.md. - ¿Música con beat?
uv run scripts/som/batida.py musica.mp3 --fps 30da BPM, tiempos fuertes y drop probable. Anima los cortes en esa cuadrícula. - ¿Necesitas la voz o el instrumental de la canción?
uv run scripts/som/separar.py musica.mp3(voz + instrumental) o--modo 6(seis stems). - Mezcla:
Generauv run scripts/som/som.py --eventos 04-projetos/<video>/audio/eventos.json \ --voz 04-projetos/<video>/audio/voz.wav --musica 04-projetos/<video>/audio/musica.wav \ --video 04-projetos/<video>/render/previa.mp4 --drop 12.4mix.wav,escuta/*.wav,relatorio-som.jsonyprevia-som.mp4(la imagen se copia; solo cambia el sonido). - Lee el informe y corrige hasta que no haya advertencias. "eventos sem som" = tipo que el mapa no conoce: cambia el tipo por uno conocido, pon
"som": "categoria"en el evento o escribe un--mapa(abajo). LUFS, pico y "música bajo la voz" fuera del objetivo también aparecen. - ¿Sonido de ambiente?
uv run scripts/som/verificar_som_de_cena.py <mezcla solo de ambiente>o... escuta/efeitos.wav --voz escuta/voz.wav. Si no pasa, no se entrega. - Escucha. La vista previa con sonido va al dueño del estudio para aprobar. En el video final, ejecuta el mismo comando con
--video render/final.mp4: es solo remux, sin renderizar de nuevo.
Sonidos propios del proyecto (--mapa)
Un archivo .py con MAPA = {tipo: función(M, e)} sobrescribe el mapa estándar solo en los tipos que listes:
# 04-projetos/<video>/audio/mapa.py
MAPA = {
"logo": lambda M, e: (M.poe("logo", e["t"], -11), M.poe("impacto", e["t"], -16), M.golpe(e["t"], -20)),
"moeda": lambda M, e: M.poe("sucesso/sucesso-2", e["t"], -14, st=3), # st = semitonos arriba
}
Funciones de la Mesa que sirven en el mapa: M.poe(sonido, t, ganancia_db, pan, alinea="pico"|"ini"|"fin", st=semitonos, fin=duración, fade=s, sala=True), M.tonal(t, lufs), M.golpe(t, lufs), M.textura(t0, t1, lufs), M.riser(t_pico). sonido acepta una categoría ("whoosh", rota entre las variaciones), un archivo de la biblioteca ("whoosh/whoosh-2") o una ruta.
Comandos
| Script | Para qué |
|---|---|
uv run scripts/som/som.py --eventos E.json [--voz V] [--musica M] [--video P.mp4] [--tom Am] [--drop T] [--mapa mapa.py] | la mezcla completa, el informe y el sonido pegado al video |
uv run scripts/som/sintetizar_sfx.py [--amostra prueba.wav] | genera la biblioteca inicial sintetizada |
uv run scripts/som/nivelar.py CARPETA [--categoria X] [--cama] [--destino D] | pone un pack en el estándar y actualiza el catálogo |
uv run scripts/som/verificar_som_de_cena.py MEZCLA.wav [--voz VOZ.wav] | rechaza sonido de ambiente demasiado alto (código de salida 1) |
uv run scripts/som/batida.py MUSICA [--fps 30] [--json grade.json] [--video render.mp4] | beats, tiempos fuertes, BPM y drop (beat_this) |
| `uv run scripts/som/separar.py MUSICA [--modo voz | 6] [--saida CARPETA]` |
Otras opciones de som.py: --voz-entra, --musica-entra, --musica-de (alinear tramos), --dur, --impacto T0 T1 (música sube al nivel de la voz), --lufs, --pico, --fx -10 (efectos en LUFS relativos a la voz), --saida.
batida.py y separar.py usan IA y necesitan el extra: uv sync --extra cpu (o --extra gpu con placa NVIDIA). Los modelos se descargan solos en el primer uso (beat_this ~80 MB; cada modelo de separación ~300–700 MB, guardados en ~/.cache/estudio-ia/). Sin el extra, ambos se detienen con la instrucción de instalación.
Errores comunes
| Síntoma | Causa probable | Qué hacer |
|---|---|---|
| Efectos "demasiado altos" en un video de ambiente | sonido de ambiente normalizado a −14 | som.py sin voz ni música ya apunta a −25; comprueba con verificar_som_de_cena.py |
| Efectos desaparecen bajo la música en un video sin voz | pista masterizada (−8 a −11 LUFS) | la Mesa nivela la pista a −19 y sube los efectos ×2.2; si aún desaparecen, vol mayor en el evento |
| Sonido "retrasado" en el whoosh | evento marcado al final del gesto | marca el inicio del gesto; el mapa pone el pico 0.2 s después |
| Mismo sonido repetido suena a robot | categoría con una sola variación | nivela más sonidos en esa categoría o usa st diferente en --mapa |
| Informe: "categorías intercambiadas" | la biblioteca no tiene la categoría | ejecuta sintetizar_sfx.py o nivela un pack con ella |