/minara-music — Generar música + efectos de sonido a partir del guión
Convierte el guión por segundo del video en una hoja de referencia musical, cues.json, y luego sintetiza el BGM y los efectos de sonido sincronizados con la imagen de forma local. La síntesis es puramente local con numpy y la salida es determinista (las mismas señales + semilla siempre producen el mismo audio). No llama a ningún servicio externo y no tiene costo.
Fuente: el enfoque de puntuación del video de lanzamiento de Minara V2, generalizado en un script reutilizable; examples/v2-launch.json es la hoja de referencia de ese video.
Flujo de trabajo (en orden)
- Leer el guión: obtén el guión por segundo del proyecto minara-video (o del storyboard / la hoja de tiempos de la voz en off). Si el guión tiene columnas de "ambiente sonoro" o "música", síguelas; si no, deduce el estado de ánimo de la imagen.
- Escribir la hoja de referencia: en
audio-src/cues.jsondel proyecto, escribe:duration(= duración final del video),bpm(por defecto 120),key(por defectoA minor; para piezas brillantes/celebratorias puedes usarC major),seed.sections: divide el guión en secciones musicales, elige unaenergypor sección y usanotepara describir la imagen correspondiente (para facilitar la referencia cruzada).sfx: cada acción visible en el guión (toque, escritura, pedido completado, notificación emergente, transición, bloqueo de destino) recibe un efecto de sonido, sincronizado al segundo indicado en el guión.
- Mostrar la hoja al operador primero; no renderizar aún: en tablas markdown, enumera "rango de tiempo / energía / imagen correspondiente" y "tiempo SFX / tipo / acción correspondiente", y espera a que digan OK antes de renderizar. Ellos editan la hoja, no el código.
- Renderizar:
python3 ~/.claude/skills/minara-music/scripts/make_music.py <proyecto>/audio-src/cues.json -o <proyecto>/assets [--vo <proyecto>/assets/vo.wav] - Autocomprobación: el script imprime cada sección; luego mide la sonoridad por sección para confirmar que el clímax es el más fuerte, que el breakdown/outro bajan claramente y que el ducking funciona. Para problemas de escucha (demasiado cargado, un efecto de sonido roba el foco), ajusta
level/gainy vuelve a renderizar; cada renderizado toma unos segundos. - Entregar: proporciona la ruta a
bgm.wav(obgm-duck.wav) y usaopen -Rpara resaltarpreview-mix.wavpara que puedan escucharlo. En HyperFrames, agrégalo como pista de audio, con la voz en off en una pista separada.
Salida
| Archivo | Contenido |
|---|---|
bgm.wav | Música + efectos de sonido, 48 kHz estéreo, pico de -1 dBFS, fundido de entrada de 0.4 s al inicio y fundido de salida de 3.2 s al final |
bgm-duck.wav | Se genera cuando hay voz en off: la música se reduce en duck_db (por defecto -8 dB) donde ocurre el habla; los efectos de sonido no se atenúan |
preview-mix.wav | Se genera cuando hay voz en off: música + voz en off mezcladas, solo para escuchar, no para el video final |
Tipos de sección de energía
| Energía | Sonido | Usado para |
|---|---|---|
silent | Sin música | Pausas que necesitan silencio total |
intro | Zumbido bajo + pad suave | Apertura, logotipo, datos convergiendo |
light | Pad + arpegio ligero + ritmo disperso | Interacciones móviles, demostraciones de funciones ligeras |
build | Añade bajo y un kick en cada tiempo, con riser automático al final de la sección | Acumulación gradual hacia un momento clave |
full | Kit de batería completo + clap + bajo + arpegio | Demostración continua de funciones principales (backtesting, puesta en marcha, automatización) |
breakdown | Elimina batería y bajo, dejando solo pad y un arpegio suave; el kick regresa en el último compás | Cambios de escena, secciones sobre seguridad/privacidad que necesitan "respirar" |
climax | Máximo: kit de batería completo + melodía principal + crash al inicio de la sección; añade automáticamente un riser si la sección anterior no es build | Aparición del nombre del producto / reclamo de lanzamiento |
outro | Resuelve en el acorde tónico + campana de marca, fundido de salida con toda la mezcla | Tarjeta final, CTA |
Cada sección puede tomar "level": 0.5–1.3 para ajustar su volumen. Los acordes siguen los compases globales (menor i–VI–III–VII, mayor I–V–vi–IV), por lo que no se rompen entre secciones.
Tipos de efectos de sonido (sfx)
| Tipo | Sonido | Acción típica | Parámetros opcionales |
|---|---|---|---|
tap | Clic corto | Toque de botón, selección | gain |
typing | Tics continuos de escritura | Escritura en un campo de entrada | chars, cps (caracteres/segundo, que coincida con la velocidad de escritura en pantalla) |
success | Dos tonos de campana ascendentes | Pedido completado, estrategia en ejecución | gain |
notify | Alerta de tres notas | Notificación o recordatorio emergente | gain |
bell | Un solo tono de campana | Aparición de avatar/logotipo | note (MIDI, por defecto 81) |
blips | Tonos cortos ascendentes | Progreso de backtest, carga de datos | count, step (segundos), note |
sparkle | Granos brillantes + ruido suave | Partículas convergiendo, apertura | dur |
riser | Ruido ascendente | Acumulación de transición añadida manualmente | dur |
whoosh | Barrido inverso | Ventana colapsando, transición push/pull | dur |
thud | Golpe grave de bloqueo | Bloqueo, confirmación, aterrizaje pesado | gain |
crash | Platillo | Acento extra | gain |
Cada efecto de sonido puede tomar gain para ajustar su volumen.
Reglas
- Los efectos de sonido siguen solo las acciones visibles: si no hay una acción correspondiente en pantalla, no agregues ningún efecto de sonido, igual que "no agregues texto casualmente".
- Copia los tiempos del guión; no los estimes: el
tde sfx usa los segundos reales del guión por segundo / la línea de tiempo de la animación;cpspara escritura usa la velocidad de escritura en la animación. - Si la longitud o el orden del guión cambian, actualiza primero
cues.jsony vuelve a renderizar; no estires el audio manualmente. - No uses servicios de música AI externos ni pistas descargadas de la web; cuando se necesite música con licencia comercial, el operador proporciona el archivo.