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:
- Nivelación de silencios. Los huecos por debajo de
min_gapnunca 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. - Nivelación de muletillas. Ver más abajo.
- Detección de retomas. N-gramas repetidos donde la toma posterior reemplaza a la anterior.
- 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 amin_clip. - Nivel C - partículas modales:
also halt eben ja mal doch schon eigentlich genau, y en ingléslike 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ámetro | predeterminado | nota |
|---|---|---|
pad_in | 0.08 s | cierre de oclusiva antes de /p t k b d g/ |
pad_out | 0.10 s | las liberaciones de /t k s/ sobrepasan el end del alineador |
keep_pause | mínimo 0.18 s | el espacio de respiración que queda donde había silencio |
min_gap | 0.55 s | por debajo de esto, nunca cortar |
min_removal | 0.20 s | eliminaciones más cortas no merecen un empalme |
max_cut_density | 1 por 1.5 s | fatiga por cortes bruscos |
min_clip | 0.35 s | clips conservados más cortos se fusionan con un vecino |
| crossfade | 20 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 esfalsecon 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(contentpara 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_rangeytextdesnormalizado. El texto es solo para lectura y nunca es autoritario: si discrepa conword_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íntoma | Causa | Solución |
|---|---|---|
| Cada segmento tiene 1 fotograma | SALIDA redondeada hacia arriba en lugar de hacia abajo | Usa snap_out; nunca hagas la matemática en línea |
| Clics audibles en los empalmes | Ajuste de cruce por cero omitido | Ajuste más un crossfade de 20 ms |
| El habla suena entrecortada y sin aliento | Pausa retenida uniforme | Aplica la tabla escalada por puntuación |
| El hablante suena robótico y no alemán | Nivel C eliminado | El nivel C es solo marcar; restaura por trazabilidad |
| Los cortes caen en medio de una palabra | La 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 video | Los puntos de corte no están fijados a fotogramas | Fija cada punto de corte, luego re-ejecuta la verificación de control de calidad (a) |