Communitygithub.com

businessbaum/vedit

Habilidad para ajuste mecánico de material ya seleccionado: elimina pausas, muletillas, repeticiones y mejora la higiene de empalmes. No decide el contenido del video, eso es tarea de cut-story.

¿Qué es vedit?

Esta habilidad implementa un editor de video mecánico (rough cut) que aplica recortes automáticos basados en silencios, muletillas, repeticiones y reglas de empalme sin costura. Está diseñada para plataformas como Claude Code, Cursor o Codex, y opera sobre archivos de proyecto JSON donde cada segmento tiene habilitación booleana y trazabilidad de decisión. El skill sigue un orden estricto: primero ejecuta pasadas de detección de silencios (con pausas escaladas según puntuación), muletillas en tres niveles (A: no léxicas eliminadas automáticamente, B: léxicas con seguridad, C: partículas modales solo marcadas), detección de retomas y empalmes con crossfade y ajuste de cruce por cero. Los cortes se fijan a fotogramas enteros para evitar deriva AV. Finalmente, reporta estadísticas como un editor humano, ofreciendo deshacer por decisión. Un aspecto clave es que el material rechazado nunca se elimina, solo se deshabilita con una razón, permitiendo reversión completa. Tiene precondiciones estrictas: requiere ejecutar cut-story primero, y no debe automatizar el nivel C de muletillas.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/businessbaum/vedit/tree/HEAD/.agents/skills/cut-rough

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

cut-rough

Ajuste mecánico: silencios, muletillas, repeticiones, higiene de empalmes. Todo aquí es reversible y cada decisión tiene trazabilidad.

El argumento $project es el slug; la solicitud completa va en $ARGUMENTS. Un marcador de posición $ vacío significa que la habilidad se autoactivó en lugar de invocarse con barra: toma el proyecto de PIPELINE_STATE en el contexto de la sesión e indica cuál elegiste. Los nombres de verbos siguen el contrato de construcción; python engine/ve.py --help prevalece en caso de conflicto.

Precondiciones, y por qué son estrictas

Ejecuta cut-story primero. Si falta story.blocks, indícalo y ofrece cut-story en lugar de continuar: el corte mecánico sobre material que está a punto de descartarse por completo desperdicia tiempo en detección de repeticiones y muletillas que nadie escuchará.

Si el usuario quiere explícitamente un pase mecánico sobre todo ("einfach nur die Ähms raus"), eso es legítimo. Hazlo e indica que no se realizó selección de contenido.

La regla del fotograma

Los puntos de corte se fijan a fotogramas completos. Esto no es orden: los puntos de corte fuera de la cuadrícula de fotogramas hacen que el filtro de concatenación acumule 8.33 ms de deriva AV por corte, 1250 ms en 150 cortes. Con ajuste, los mismos 150 cortes se desvían exactamente 0 muestras.

in_frame  = floor(t_in  * fps + 0.5)    # redondear mitad hacia arriba -> los empates caen después
out_frame = ceil (t_out * fps - 0.5)    # redondear mitad hacia abajo  -> los empates caen antes
if out_frame <= in_frame: out_frame = in_frame + 1

out es exclusivo: ffmpeg implementa trim=end como un < estricto, y el intervalo semiabierto [in, out) es lo que hace que la concatenación sea exacta. Si el redondeo de SALIDA es incorrecto, cada segmento se vuelve de un fotograma de largo; 200 cortes son 6.7 s de deriva y sincronización audiblemente rota.

Nunca hagas esta aritmética a mano. vedit/timebase.py la posee: snap_in / snap_out.

Paso 1 - Ejecutar las pasadas

python engine/ve.py cut $project

Cuatro pasadas sobre la lista de palabras aplanada, luego el ajuste:

  1. Nivelación de silencios. Los huecos por debajo de min_gap nunca se cortan. Por encima, la pausa retenida escala con la puntuación de la palabra anterior: .?! x1.5 (mínimo 0.40 s), ,;: x1.0, mitad de cláusula x0.7 (mínimo 0.20 s), cambio de tema x2.0 (mínimo 0.60 s). Una longitud de pausa uniforme es la señal más reconocible de una edición automática: el oído espera una respiración más larga después de un punto final.
  2. Nivelación de muletillas. Ver más abajo.
  3. Detección de retomas. N-gramas repetidos donde la toma posterior reemplaza a la anterior.
  4. Higiene de empalmes. Relleno, crossfades, ajuste de cruce por cero, límite de densidad de cortes.

Paso 2 - Niveles de muletillas, y el que no debe automatizarse

  • Nivel A - no léxicas (äh ähm hm mh uh um er): eliminar automáticamente. Nadie las quiere.
  • Nivel B - muletillas léxicas (weißt du, sozusagen, quasi, im Prinzip, you know, I mean): eliminar automáticamente con protección: no al inicio de una oración, no cuando la eliminación deja un fragmento menor a min_clip.
  • Nivel C - partículas modales: also halt eben ja mal doch schon eigentlich genau, y en inglés like just well right so basically actually. Solo marcar. Nunca eliminar automáticamente.

El nivel C es donde los editores automáticos arruinan el habla en alemán. doch, eben, halt y ja transmiten actitud y estructura del discurso; eliminarlas no hace que el hablante suene más conciso, sino como una traducción. Si el usuario pide eliminarlas de todos modos, hazlo, pero di una vez lo que cuesta, luego deja de mencionarlo.

Orden de señal de detección: coincidencia léxica, luego duración/caracter >= 0.12 s, luego hueco flanqueante >= 0.10 s, luego energía dentro de 6 dB del habla circundante.

Nunca uses score de WhisperX como señal de muletilla. Mide alineación, no duda. Las puntuaciones bajas se agrupan en palabras raras y nombres propios, lo opuesto a las muletillas. Úsalo solo como indicador de fiabilidad de marca de tiempo: score < 0.35 amplía el relleno en 60 ms y prohíbe un corte dentro de esa palabra.

Paso 3 - Valores predeterminados y su estado

parámetropredeterminadonota
pad_in0.08 scierre de oclusiva antes de /p t k b d g/
pad_out0.10 slas liberaciones de /t k s/ sobrepasan el end del alineador
keep_pausemínimo 0.18 sel espacio de respiración que queda donde había silencio
min_gap0.55 spor debajo de esto, nunca cortar
min_removal0.20 seliminaciones más cortas no merecen un empalme
max_cut_density1 por 1.5 sfatiga por cortes bruscos
min_clip0.35 sclips conservados más cortos se fusionan con un vecino
crossfade20 ms (10 min, 40 max)curve=tri misma toma, qsin entre tomas
búsqueda de cruce por cero+/-5 ms (240 muestras)solo audio, nunca mueve video

Estos se derivan de investigación, no de pruebas perceptivas. Mientras project.json tenga "calibrated": false, indícalo cada vez que defiendas un corte. No presentes un umbral no calibrado como ajustado. El hook de sesión expone esta bandera cada sesión por esa razón.

Vale la pena entender el ajuste de cruce por cero: un corte brusco en un punto que no es cruce por cero produce un salto de muestra 29.5 veces mayor que el máximo natural de la señal: un clic audible. Tanto el ajuste de cruce por cero como un crossfade de 20 ms lo devuelven a la línea base. Usa ambos. El ajuste mueve solo audio, nunca video; un desplazamiento de video subfotograma no es representable.

Paso 4 - Cortes J/L

4-12 fotogramas es el rango útil; predeterminado 6.

Rechaza cualquier corte J/L donde ambos lados compartan un source_id y ninguno esté cubierto por B-roll o una superposición de fotograma completo. En una boca visible que no es un corte J, es un error de sincronización labial, y se percibe como fallo técnico más que como edición.

Paso 5 - Escribir segmentos

Los segmentos se escriben en segments[] con src_in_frames (inclusive) y src_out_frames (exclusivo) como única autoridad. También se requiere en cada segmento:

  • enabled - el material rechazado es false con una razón, nunca se elimina. Cada decisión automática debe ser reversible cambiando un booleano. Esta es la propiedad que hace seguro un valor predeterminado agresivo.
  • order - orden de salida explícito, denso sobre segmentos habilitados.
  • provenance - stage (content para eliminaciones a nivel de historia, silence, filler, retake), rule, confidence, applied_by, y el valor medido que lo desencadenó (original_gap_s). La trazabilidad es lo que permite al usuario decir "deshacer todas las eliminaciones de nivel B".
  • word_range y text desnormalizado. El texto es solo para lectura y nunca es autoritario: si discrepa con word_range, el rango de palabras gana.

Las posiciones en la línea de tiempo son derivadas, nunca almacenadas. Son una suma acumulativa sobre segmentos habilitados escrita en _computed al cargar. Nunca escribas _computed a mano.

Establece stage en "rough_cut".

Paso 6 - Informar como editor, no como script

Informa: duración de la fuente, duración del corte, porcentaje eliminado, cantidad de cortes, densidad de cortes (cortes por minuto), y la cantidad por regla de trazabilidad. Luego marca cualquier cosa que parezca sobre-corte: un tramo con más de un corte cada 1.5 s, cualquier clip conservado cerca de min_clip, y la cantidad de muletillas de nivel C marcadas pero dejadas intactas.

Ofrece tres pasos siguientes: previsualizar una sección, ajustar un umbral, o pasar a créditos/subtítulos.

Modos de fallo

SíntomaCausaSolución
Cada segmento tiene 1 fotogramaSALIDA redondeada hacia arriba en lugar de hacia abajoUsa snap_out; nunca hagas la matemática en línea
Clics audibles en los empalmesAjuste de cruce por cero omitidoAjuste más un crossfade de 20 ms
El habla suena entrecortada y sin alientoPausa retenida uniformeAplica la tabla escalada por puntuación
El hablante suena robótico y no alemánNivel C eliminadoEl nivel C es solo marcar; restaura por trazabilidad
Los cortes caen en medio de una palabraLa transcripción es nivel 3 (tokens BPE)Re-transcribir; las marcas de tiempo de tokens no se pueden cortar
La deriva AV crece a lo largo del videoLos puntos de corte no están fijados a fotogramasFija cada punto de corte, luego re-ejecuta la verificación de control de calidad (a)

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

businessbaum/vedit

This skill should be used when the user asks for subtitles or on-screen text of what is being said - "brenn die Untertitel ein", "mach Untertitel", "Untertitel drauf", "leg Untertitel drüber", "brenn die Subs ein", "mach die Captions", "Wort für Wort Untertitel", "Karaoke-Untertitel", "korrigier den Untertitel-Text", "burn in the captions", "add subtitles", "burn the subs", "word-by-word captions", "fix a caption typo". Covers ASS generation, the pixel-width grouping rule for German, the font table, and burn-in through libass.

businessbaum/vedit

This skill should be used when the user asks to decide what the video is actually about before any mechanical cutting - "bau die Story", "was soll ins Video", "was kann raus", "welche Themen bleiben", "kürz das auf 6 Minuten", "mach daraus ein kurzes Video", "wo ist der Hook", "sortier die Themen", "worum geht es hier eigentlich", "build the story", "decide what stays", "structure this", "cut this down to N minutes", "find the hook", "reorder the topics". This is the CONTENT-selection pass that writes the "story" block in project.json; it runs after transcribe and before cut-rough.

businessbaum/vedit

This skill should be used when the user asks for the finished video file - "exportier das", "render das fertig", "mach das final", "renderte das Video", "mach den Endexport", "bau das Video zusammen", "mach es fertig für YouTube", "gib mir die MP4", "export the final", "render the final cut", "make the master", "export for TikTok", "give me the mp4". Covers segment rendering with the cache, guarded concat, the one-pass audio, loudness normalisation and the single mux.

Skills relacionados