/hyperframes-best-practices
Utilice este skill cada vez que necesite convertir una grabación de screencast en bruto, una grabación con cámara frontal (talking-head) o una exportación de OBS en un vídeo de producto pulido con HyperFrames. Este skill agrupa dos capas de conocimiento:
- Fundamentos de HyperFrames — los archivos de reglas ascendentes mantenidos por HeyGen en
github.com/heygen-com/hyperframes(creación de composiciones, líneas de tiempo GSAP, atributosdata-*, el CLI de bucle de desarrollo). Instálelos connpx vskill i heygen-com/hyperframes. - Reglas de producción — lecciones aprendidas de un ciclo de iteración largo al crear un vídeo de producto de SpecWeave real a partir de una única grabación de OBS de 8:47. Estas son las reglas que, si se siguen, producen un vídeo que el usuario puede publicar, y que, si se rompen, dejan pitidos, cortes a mitad de palabra, escenas de héroe vacías y superposiciones que bloquean la cámara del orador.
Lea ambas capas antes de comenzar a crear.
Alcance y aplicabilidad
Las reglas de la Capa 2 derivan de un proyecto específico: convertir una grabación de introducción de SpecWeave de 8:47 (Anton Abyzov, captura OBS, talking-head + pantalla compartida, mayo de 2026) en un vídeo promocional de 6:00 listo para producción. Reflejan la apariencia de ese producto: la estética de tarjetas tintadas de Studio, la paleta púrpura/verde de SpecWeave, un estilo de superposición de tarjetas iOS, y las realidades técnicas de las grabaciones de OBS (tics de inicio/parada, transitorios de reanudación de grabación, tomas duplicadas de repetir la misma línea tres veces).
Las constantes exactas son específicas del proyecto — posiciones de superposición para la ubicación de esa cámara frontal, el texto de corrección
Boris Cherny / Anthropic, las estadísticas600+/500+/3K+— tradúzcalas, no las copie.Utilice esta capa como referencia para la técnica subyacente: el algoritmo de corte inteligente basado en transcripción, la atenuación de entrada por clip para suprimir transitorios, el pipeline de renderizado con filtro
concatque evita los chasquidos del demultiplexorconcat, el limpiador quirúrgico de pitidos con silenciamiento, el patrón de superposición de tarjetas iOS, el mapeo de tiempo de origen a tiempo de corte, y la trampa de invalidación de la caché de formas de onda de Studio — esos son conceptos que se generalizan.
Cuándo usar
Active este skill cuando se cumpla CUALQUIERA de estas condiciones:
- Un usuario tiene una grabación de screencast en bruto o grabación de OBS y desea un vídeo más ajustado, con subtítulos y marca.
- La fuente tiene silencios, pausas o tomas duplicadas del tipo "déjame intentarlo otra vez".
- La fuente tiene clics, pitidos o artefactos transitorios en los límites de la grabación.
- El usuario desea superposiciones gráficas (llamadas, tarjetas de estadísticas, revelaciones de marca, logotipos de herramientas) que no cubran la cámara del orador.
- El usuario dijo las palabras "haz que esto esté listo para producción" o "listo para publicar".
- El usuario mencionó querer "estilo keynote de Apple" o "tarjetas flotantes iOS" o "vidrio esmerilado".
Si se presenta CUALQUIERA de esas señales, siga este flujo de trabajo. Si el usuario solo quiere una tarjeta de título rápida en una fuente limpia, el skill ascendente hyperframes es suficiente.
El pipeline (10 fases)
┌──────────────────────────────────────────────────────────────────┐
│ Fase 0 Inventariar herramientas │
│ Fase 1 Examinar la fuente (duración, códec, frecuencia de │
│ muestreo de audio) │
│ Fase 2 Transcribir con Whisper (sellos de tiempo a nivel de │
│ palabra) │
│ Fase 3 Detectar silencios + cambios de escena │
│ Fase 4 Construir la lista de cortes inteligente (con │
│ búferes de límite de palabra) │
│ Fase 5 Limpiar pitidos transitorios (silenciamiento quirúrgico │
│ + adeclick) │
│ Fase 6 Renderizar el máster mediante filtro concat (una sola │
│ pasada) │
│ Fase 7 Generar imágenes de héroe (Gemini 3 Pro Image) │
│ Fase 8 Crear la composición HyperFrames (tarjetas iOS) │
│ Fase 9 Revisar + verificar en Studio │
└──────────────────────────────────────────────────────────────────┘
Ejecute las fases secuencialmente. Itere dentro de una fase, no entre fases — una mala lista de cortes rompe la sincronización de todas las superposiciones posteriores, y perderá una hora re-resolviendo anclajes. Primero obtenga la lista de cortes correcta, luego renderice una vez, luego construya las superposiciones contra la línea de tiempo final.
Fase 0 — Inventariar herramientas
Antes de comenzar, confirme que estas herramientas están disponibles. El skill asume macOS / Linux; en Windows use WSL.
| Herramienta | Uso | Instalación |
|---|---|---|
ffmpeg (>= 6.0) | Todo el procesamiento de audio/vídeo | brew install ffmpeg |
ffprobe | Inspección de flujos | incluido con ffmpeg |
whisper (paquete Python de OpenAI) | Transcripción con sellos de tiempo de palabra | pip install openai-whisper |
python3 | Scripts de lista de cortes / limpiador de pitidos | sistema |
npx hyperframes@latest | CLI de composición (vista previa, renderizado, lint) | npx hyperframes init <proyecto> |
| API de Gemini 3 Pro Image | Imágenes de héroe (opcional) | variable de entorno GEMINI_API_KEY |
vskill (>= 1.0) | Instalación de skills | npm i -g vskill |
Si Whisper no está instalado, pip install openai-whisper lo instalará. No use large-v3 o large-v3-turbo en CPU — tardan de 10 a 15 minutos para un audio de 8 minutos. Use base.en para monólogos técnicos en inglés: ~30 segundos, suficientemente preciso para los límites de palabra.
Si la máquina de un usuario tiene auto-editor instalado, ignórelo — hace cortes por silencio pero no limpieza de pitidos ni búferes de límite de palabra, y genera cortes entrecortados de 50+ segmentos. Nosotros lo hacemos mejor manualmente.
Fase 1 — Examinar la fuente
Antes de hacer cualquier otra cosa, conozca la forma del archivo:
ffprobe -v error -show_entries stream=index,codec_type,codec_name,width,height,r_frame_rate,duration,sample_rate,channels \
-show_entries format=duration,size,bit_rate -of json "$SRC" | tee source_meta.json
Cosas que debe saber:
- Duración total — impulsa todos los cálculos de corte.
- Frecuencia de cuadros — OBS a menudo graba a 60 fps; el Studio de HyperFrames reproduce internamente a 30 fps para la revisión. Multiplique los segundos × 30 para obtener números de cuadro de Studio, no segundos × fps de origen. Esto causa problemas.
- Códec de audio y frecuencia de muestreo — OBS comúnmente graba
pcm_s24lea 48 kHz. Vuelva a codificar a AAC 192k para la entrega; mantenga 48 kHz para que coincida con todas las herramientas posteriores. - Contenedor —
.movde DaVinci,.mkvde OBS — ambos están bien, ffmpeg lee cualquiera.
Guarde la inspección en disco para que las fases posteriores puedan volver a leerla sin volver a inspeccionar.
Fase 2 — Transcribir con Whisper
Los sellos de tiempo a nivel de palabra son la base. Sin ellos no se puede:
- Ajustar los límites de corte a los bordes de las palabras (evitando cortes a mitad de palabra).
- Detectar tomas duplicadas (la misma línea dicha 2-3 veces).
- Colocar anclajes de superposición contra momentos de habla en lugar de tiempos de corte que se desplazan.
Extraiga el audio primero para que Whisper obtenga un WAV mono limpio de 16 kHz (ahorra el 80% de CPU en comparación con la calidad completa):
mkdir -p .work
ffmpeg -hide_banner -y -i "$SRC" -vn -ac 1 -ar 16000 -c:a pcm_s16le .work/source.wav
Ejecute Whisper con sellos de tiempo de palabra y salida JSON:
whisper .work/source.wav \
--model base.en \
--language en \
--word_timestamps True \
--output_dir .work \
--output_format json \
--verbose False
⚠️ Advertencia del CLI de Whisper: pasar --output_format json --output_format srt mantiene solo la última bandera en versiones antiguas. Si necesita múltiples, use --output_format all (escribe JSON + SRT + VTT + TSV + TXT).
Valide la salida: .work/source.json debe contener segments[].words[] con start, end, word. Si words está vacío, olvidó --word_timestamps True.
Lea la transcripción completa en esta etapa. No la omita. Detectará:
- Errores de escucha de nombres de marca. Whisper escucha "Claude Code at Anthropic" como "Cloud Code at Infropic" el 90% de las veces. "SpecWeave" sale como "spec with" o "specs". Estos necesitan correcciones de superposición, no regrabaciones.
- Tomas duplicadas. Busque la misma oración repetida textualmente. En nuestro proyecto, "And those systems cannot produce skills as you work" apareció tres veces en 01:14, 01:30, 01:47. Elimine dos de ellas.
- Reinicios con muletillas. Fragmentos de una sola palabra como "And…", "And…" que preceden a la oración real. El script de corte los detecta como segmentos "fantasma" — los eliminamos en la fase 4.
Fase 3 — Detectar silencios y cambios de escena
Dos detecciones paralelas alimentan el algoritmo de corte:
3a. Detección de silencios
ffmpeg -hide_banner -nostats -i "$SRC" -af "silencedetect=noise=-30dB:duration=1.2" -f null - 2>&1 \
| grep -E "silence_(start|end)"
-30 dB y 1.2s son el punto óptimo. Más permisivo (-25 dB, 0.8s) captura pausas de respiración que no desea cortar. Más estricto (-35 dB, 2s) pasa por alto el silencio real.
Analice los pares de inicio/fin en [(s, e, dur), ...] y escríbalos en silences.json. Consulte scripts/build_cuts.py.
3b. Detección de cambios de escena
ffmpeg -hide_banner -nostats -i "$SRC" -filter:v "select='gt(scene,0.05)',showinfo" -f null - 2>&1 \
| grep "showinfo" | grep -oE "pts_time:[0-9.]+$" | sed 's/pts_time://' > scenes.txt
scene>0.05 es lo suficientemente sensible para detectar cuando el orador abre una nueva pestaña del navegador, cambia de aplicación, se desplaza significativamente. No baje de 0.03 — obtendrá falsos positivos por parpadeos del cursor.
Estas dos juntas permiten tomar la decisión de corte inteligente: silencio + sin cambio de escena = silencio muerto puro, córtelo. Silencio + cambio de escena = el orador está mostrando algo en pantalla, manténgalo (se espera que la audiencia mire la pantalla, no que escuche la narración).
Fase 4 — Construir la lista de cortes inteligente
El algoritmo de corte tiene 5 reglas estrictas aprendidas de la manera difícil:
Regla 1 — El silencio muerto puro se corta, pero no todo
Para cada segmento silencioso > MIN_CUT_LEN (1.5s) sin cambio de escena en su interior: corte todo excepto un RESPIRO de 0.30s. El respiro preserva el ritmo natural — eliminar el 100% del silencio hace que el habla suene editada por máquina.
if not in_scenes and (cut_end - cut_start) > MIN_CUT_LEN:
cuts.append((cut_start + 0.30, cut_end, f"silencio muerto {dur:.1f}s"))
Regla 2 — Los silencios con actividad en pantalla se mantienen (limitados a 3.5s)
Si el silencio tiene cambios de escena, el orador está dejando que la audiencia lea. Mantenga la ventana desde primera_escena - 0.4s hasta última_escena + 0.8s, pero nunca más de 3.5s — mirar un fotograma fijo más de 3.5s hace perder a la audiencia.
Regla 3 — Ajustar a los límites de palabra
Después de calcular los rangos aproximados a mantener, ajuste cada límite al borde de palabra más cercano de Whisper, dentro de una tolerancia de 0.4s:
def snap(t, words):
best, bd = t, 0.4
for s, e, _ in words:
for cand in (s, e):
if abs(cand - t) < bd:
best, bd = cand, abs(cand - t)
return best
Esto es lo que evita que los cortes trunquen palabras a la mitad. Sin esto, uno de cada dos cortes recorta una 's' final o una consonante de respiración.
Regla 4 — Añadir búferes de límite de palabra (este es el que los usuarios notan)
Incluso con el ajuste al borde de palabra, las consonantes finales se extienden ligeramente más allá de la marca de tiempo de fin de palabra reportada por Whisper. Whisper mide el inicio de la vocal hasta el final de la vocal, no la cola de la consonante. Por lo tanto, un corte literal en palabra.final recorta la 's', el respiro o la 'k' finales.
La solución: extender cada rango a mantener:
- Final:
+ 0.30sdespués del final de la última palabra, limitado a la mitad del espacio hasta el siguiente segmento a mantener. - Inicio:
- 0.10santes del inicio de la primera palabra, limitado a la mitad del espacio hasta el segmento a mantener anterior.
END_BUF, START_BUF = 0.30, 0.10
for i, (s, e) in enumerate(keep):
gap_next = keep[i+1][0] - e if i+1 < len(keep) else TOTAL - e
gap_prev = s - keep[i-1][1] if i > 0 else s
add_end = min(END_BUF, max(0, gap_next * 0.5))
add_start = min(START_BUF, max(0, gap_prev * 0.5))
if gap_next < 0.6: add_end = max(add_end, gap_next - 0.05) # absorber espacios pequeños
if gap_prev < 0.6: add_start = max(add_start, gap_prev - 0.05)
final.append([s - add_start, e + add_end])
El resultado: el corte "find the tickets" se extiende desde origen 08:09.26 hasta 08:09.56 — la 's' final sobrevive. Sin esto, el usuario le dirá que el audio "suena apresurado" o "se traga los finales".
Regla 5 — Eliminación manual de tomas duplicadas
La deduplicación programática de n-gramas idénticos es frágil y peligrosa (puede eliminar repeticiones legítimas). En su lugar: lea la transcripción, encuentre duplicados textuales usted mismo y agregue rangos de eliminación explícitos en tiempo de origen:
DUP_RANGES = [
(78.86, 113.82), # 01:18.86 - 01:53.82: 2 de 3 tomas de "skills as you work"
]
for ds, de in DUP_RANGES:
# recortar cada segmento a mantener que se superponga con este rango
...
Reduce el corte del 35% ahorrado al 32% ahorrado (los duplicados son espacios en silencio + habla), pero el resultado se lee limpiamente.
Salida
El script escribe:
cuts.json— rangos a mantener + rangos de corte + estadísticas de resumen + mapeo de tiempo de origen (utilizado por la Fase 8 para anclajes de superposición).edl.txt— EDL legible por humanos con fragmentos de transcripción por segmento a mantener (verifique visualmente esto antes de renderizar).
Consulte scripts/build_cuts.py para la implementación completa.
Fase 5 — Limpiar pitidos transitorios
Las grabaciones de OBS a menudo contienen artefactos transitorios cortos — pitidos de arranque, clics de conmutación de tecla, oclusivas de micrófono que golpean una entrada caliente. Estos viajan a través de las decisiones de corte de silencio porque son ruidosos (por lo que la detección de silencio los ignora) y están rodeados de silencio. Suenan como un "clic" en el vídeo final en 4:11 o 0:52 o donde sea.
No intente solucionar esto con una puerta de ruido global o un eliminador de ruido. Difuminará las consonantes y hará que el habla suene bajo el agua. En su lugar: detecte transitorios y silencie quirúrgicamente cada ventana de 60–100ms.
Algoritmo de detección (el que no silencia el habla)
Un transitorio es un "pitido" si y solo si:
RMS(ventana 5ms) > BEEP_RMS_MIN (p. ej., > 800)
RMS(150ms anterior) < PRE_QUIET (p. ej., < 200)
RMS(200ms posterior) < POST_QUIET (p. ej., < 350)
La tercera condición es crítica. Sin ella, capturará los inicios de consonantes ('p', 't', 'k') del habla, porque se ven idénticos en los primeros 5ms — pero el habla es seguida por una vocal sostenida, mientras que un pitido regresa al silencio. Filtre con post_avg < 350 y solo silenciará transitorios aislados.
También limite el lapso silenciado a 0.30s — una clasificación errónea nunca puede eliminar una palabra completa.
Aplicar los silenciamientos quirúrgicos
Construya una expresión de filtro volume de ffmpeg con los rangos específicos:
ffmpeg -hide_banner -y -i "$SRC" -af "volume=enable='between(t,52.110,52.180)+between(t,169.850,169.920)+between(t,251.245,251.315)':volume=0" \
-c:v copy .work/scrubbed.mp4
Advertencia de rendimiento: la expresión volume de ffmpeg es lenta para cientos de entre between() a pesar de lo que afirme la documentación. Para > 50 transitorios, use un flujo de trabajo asegment o asilencer con atenuación de entrada en su lugar. Consulte scripts/scrub_beeps.py.
Verifique que el habla no se vea afectada
aplay .work/scrubbed.wav 2>/dev/null || afplay .work/scrubbed.wav
Si escucha un 'p' o 't' faltante, reduzca BEEP_RMS_MIN en un 10% y vuelva a ejecutar. Si todavía hay un clic, aumente la duración de la ventana de silencio en 10ms.
Fase 6 — Renderizar el máster mediante filtro concat (una sola pasada)
Ahora que tiene rangos a mantener limpios (sin pitidos), renderice el vídeo recortado final.
No use el demultiplexor concat de ffmpeg (-f concat). Produce un chasquido en casi todos los cortes porque el demultiplexor crea un nuevo contexto de códec en cada frontera, reiniciando predictores de audio y produciendo una muestra de 0.03s cada vez. En su lugar, use el filtro concat:
echo "file ${PWD}/$SRC" > .work/concat.txt
echo "file ${PWD}/$SRC" >> .work/concat.txt # ¡Sí, dos veces! El filtro necesita al menos dos entradas para activar la rama de concat
ffmpeg -hide_banner -y -safe 0 -f concat -i .work/concat.txt -i .work/concat.txt \
-filter_complex_script .work/filter.txt -map "[v]" -map "[a]" .work/master.mp4
Donde .work/filter.txt codifica todos los segmentos a mantener como cadenas [0:v]trim, [1:v]trim conectadas a través del filtro concat. Consulte scripts/render_concat.py para la generación.
Por qué esto funciona: el filtro concat concatena los flujos sin recodificación dentro de cada segmento y vuelve a codificar solo en las fronteras donde se une a un nuevo contexto. No hay chasquidos porque no hay reinicio del códec de audio.
Vista previa de audio antes de renderizar
Para una iteración rápida, renderice solo el audio:
ffmpeg -hide_banner -y -f concat -i .work/concat.txt -f concat -i .work/concat.txt \
-filter_complex_script .work/filter.txt -map "[a]" .work/master.wav
Verifique la línea de tiempo completa en busca de transiciones que suenen extrañas antes de comprometer la pasada de vídeo completa (que lleva tiempo).
Fase 7 — Generar imágenes de héroe (Gemini 3 Pro Image)
Para las tomas de héroe de estilo "keynote de Apple" (p. ej., "Boris Cherny / Anthropic" + logotipo de Claude en un degradado púrpura/verde), use la API de Gemini 3 Pro Image de Anthropic:
GEMINI_API_KEY="sk-ant-..." # de la variable de entorno o 1Password
curl -s -X POST https://api.anthropic.com/v1/images:generate \
-H "x-api-key: $GEMINI_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-3-5-sonnet-20241022",
"prompt": "Tecnología futurista, degradado púrpura a verde oscuro, resplandor suave. Un solo logotipo blanco de Claude (un círculo con puntos) flotando centrado. Sin texto, limpio, cinematográfico, adecuado para una presentación de producto de IA. 1920x1080.",
"n": 1,
"size": "1920x1080"
}' | jq -r '.data[0].url' | xargs curl -o .work/hero_bg.png
Consejos de prompt:
- Siempre especifique "sin texto" y "limpio" — el modelo de imagen sobrescribe texto a menos que se le indique que no lo haga.
- Use degradados de la paleta de la marca. Para SpecWeave:
#6B21A8→#059669. - Genere exactamente a 1920x1080 (o la resolución de salida de su proyecto) para que coincida perfectamente con la composición de HyperFrames.
Alternativa: Fondo generado por IA sin API
Si no hay ninguna clave API disponible, cree un fondo degradado con ImageMagick:
convert -size 1920x1080 gradient:'#6B21A8'-'#059669' -font Helvetica -pointsize 80 -fill white -gravity center -annotate +0+0 'Claude' .work/hero_bg.png
No es tan impresionante como Gemini 3 Pro, pero es suficiente para una tarjeta de título de trabajo.
Fase 8 — Crear la composición HyperFrames (tarjetas iOS)
Aquí es donde el vídeo se convierte en un producto. La composición HyperFrames se basa en dos patrones del proyecto SpecWeave:
Patrón 1 — Superposiciones de tarjetas de vidrio esmerilado (estilo iOS)
El orador aparece en pantalla completa detrás. Las tarjetas flotan en la parte inferior, mostrando logotipos de iconos de marca reales (no emoji) con etiquetas.
Estructura HTML:
<!-- La animación GSAP escala cada tarjeta -->
<div data-hyperframes-card="fade-scale">
<div class="ios-card">
<img src="assets/logos/claude-code.svg" alt="Claude Code" class="ios-card-logo" />
<span class="ios-card-label">Claude Code</span>
<span class="ios-card-subtitle">Boris Cherny · Anthropic</span>
</div>
<div class="ios-card">
<img src="assets/logos/cursor.svg" alt="Cursor" class="ios-card-logo" />
<span class="ios-card-label">Cursor</span>
<span class="ios-card-subtitle">Editor de IA</span>
</div>
<div class="ios-card">
<img src="assets/logos/codex.svg" alt="Codex" class="ios-card-logo" />
<span class="ios-card-label">Codex</span>
<span class="ios-card-subtitle">Terminal de IA</span>
</div>
</div>
CSS para el efecto de vidrio esmerilado (debe coincidir con el tono de Studio):
.ios-card {
background: rgba(255,255,255,0.12);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255,255,255,0.20);
border-radius: 18px;
padding: 18px 22px;
display: inline-flex;
flex-direction: column;
align-items: center;
gap: 6px;
/* Las sombras de Studio son sutiles, evite el negro sólido */
box-shadow: 0 8px 32px rgba(0,0,0,0.12);
}
.ios-card-logo {
width: 48px;
height: 48px;
object-fit: contain;
}
.ios-card-label {
color: #fff;
font-size: 15px;
font-weight: 600;
}
.ios-card-subtitle {
color: rgba(255,255,255,0.70);
font-size: 12px;
font-weight: 400;
}
Posicionamiento: Las tarjetas deben estar en la parte inferior central, sin cubrir la cámara del orador (que está en el tercio superior derecho). Use justify-content: flex-end en el contenedor flex del diseño, o posicionamiento absoluto con bottom: 40px y left: 50%; transform: translateX(-50%).
Patrón 2 — Tomas de héroe (apropiación total de la pantalla)
Para transiciones de sección (p. ej., "Ahora, lo que estamos construyendo."): la imagen de héroe ocupa toda la pantalla durante 2.5s, luego se desvanece gradualmente para revelar al orador detrás.
<section data-hyperframes-section="hero-takeover">
<img src=".work/hero_bg.png" class="hero-bg" alt="" />
<div class="hero-message">
<h1>Skills Expertos</h1>
<p>Automatización de flujos de trabajo impulsada por IA</p>
</div>
</section>
GSAP:
// La tarjeta de héroe se desvanece después de 2.5s para revelar al orador
heroTL.to(".hero-overlay", { opacity: 0, duration: 1.2, ease: "power2.inOut" });
Mapeo de tiempo de origen a tiempo de corte
Cada anotación de superposición debe anclarse a un tiempo-de-corte, no a un tiempo-de-origen. La lista de cortes de la Fase 4 produce un mapa source_cut_map: [(src_s, src_e, cut_s, cut_e), ...]. Cuando coloca una tarjeta en "01:23" (tiempo de origen), conviértalo a tiempo de corte usando la función de mapeo. De lo contrario, las superposiciones se sincronizarán con el momento equivocado.
def source_to_cut(source_s, source_cut_map):
"""Devuelve (cut_s, cut_e) para una marca de tiempo de origen dada."""
for ss, se, cs, ce in source_cut_map:
if ss <= source_s <= se:
span = se - ss
if span == 0:
return (cs, ce)
frac = (source_s - ss) / span
return (cs + frac * (ce - cs),)
return (None,)
Sin esto, sus tarjetas aparecerán 0.5–3s demasiado tarde o demasiado temprano.
Fase 9 — Revisar + verificar en Studio
Studio de HyperFrames tiene dos trampas que le harán perder tiempo a menos que las conozca:
Trampa 1 — Almacenamiento en caché de formas de onda
Studio almacena en caché las formas de onda de audio. Cuando renderiza un nuevo máster .work/master.mp4 (Fase 6) y lo vuelve a cargar en Studio, Studio a menudo muestra la forma de onda antigua durante 5–10 segundos antes de actualizar. No decida la ubicación de los cortes basándose en la forma de onda de los primeros 10 segundos después de la recarga. Espere 15 segundos, luego verifique.
Si no se actualiza después de 30 segundos: cierre la pestaña de Studio, limpie la caché del navegador y vuelva a cargar.
Trampa 2 — Anclajes de capas y bloqueo de línea de tiempo
HyperFrames Studio bloquea las líneas de tiempo de la composición cuando arrastra una capa de superposición. Si intenta ajustar la sincronización de una tarjeta de héroe y la línea de tiempo se niega a desplazarse: desbloquéela haciendo clic en el icono de candado en la parte superior derecha del panel de la línea de tiempo.
Lista de verificación pre-publicación
| Elemento | Criterio de aprobación |
|---|---|
| Sin pitidos | Escuche todo el máster en busca de clics o pitidos no eliminados por la Fase 5 |
| Sin cortes a mitad de palabra | Reproduzca 10 cortes aleatorios; ningún corte debe truncar el habla |
| Tarjetas visibles | Las tarjetas de vidrio esmerilado no cubren la cámara del orador |
| Sincronización de tarjetas | Las tarjetas aparecen en el momento correcto (verifique con el mapeo de tiempo de origen → tiempo de corte) |
| Tomas de héroe | La imagen de héroe ocupa toda la pantalla, se desvanece suavemente sin parpadeo de borde |
| Subtítulos | Los subtítulos están sincronizados con el audio recortado, no con la fuente original |
| Sin duplicados | La transcripción final no tiene oraciones repetidas |
| Marca | Los logotipos son vectores SVG, no versiones rasterizadas con alias |
Referencias
- HyperFrames upstream: github.com/heygen-com/hyperframes
- OpenAI Whisper: github.com/openai/whisper
- FFmpeg filter concat: trac.ffmpeg.org/wiki/FilteringGuide#concat
- Gemini 3 Pro Image API: docs.anthropic.com/en/docs/claude-3-5-sonnet-image
Este skill fue destilado del proyecto SpecWeave Intro (Mayo 2026). Reutilice las técnicas, no las constantes.
