Edición Automática Completa de Videos Tutoriales (Ruta sin Jianying)
¿Qué Problema Resuelve?
Después de que el usuario graba un video tutorial, esta habilidad automatiza toda la cadena de "transcripción → corrección → eliminación de pausas → eliminación de tartamudeos y repeticiones → corrección de errores → salida de video final". Todo el proceso se realiza sin abrir Jianying, y el producto final es un video listo para publicar (con subtítulos fijos (hardcoded) y barras de corrección amarillas en la parte superior). Para modificar cualquier parámetro (tamaño de fuente, segmentos eliminados, texto), simplemente se edita y se vuelve a ejecutar el script; el costo de iteración es de un minuto.
Límite con jianying-subtitle-fixer: Allí se modifica el borrador de Jianying (el usuario debe exportar manualmente); aquí se utiliza ffmpeg para la salida directa del video final. Si el usuario no menciona Jianying, se usa este skill.
Dependencias del Entorno (Ya Disponibles Localmente)
- Python:
C:\Users\44162\AppData\Local\Programs\Python\Python312\python.exe(ya tiene instalado faster-whisper 1.2.1 + torch; el caché del modelo está en ~/.cache/huggingface, con modelo small) - ffmpeg:
D:\software\ffmpeg\bin\ffmpeg.exe(el script lo detecta automáticamente)
Flujo de Trabajo Estándar (El AI lo Sigue)
Paso 0 ffprobe para obtener duración/resolución del video (para escalado automático del tamaño de fuente posterior)
Paso 1 Transcripción: transcribe.py -> raw.json (marcas de tiempo a nivel de frase y palabra)
Paso 2 Análisis por AI (valor central de este skill, ver más abajo) -> escribir cut_plan.json
Paso 3 Preguntar al usuario mediante AskUserQuestion para que apruebe los elementos de eliminación (preguntar todo de una vez, sin hacerlo poco a poco)
Paso 4 Renderizado: render.py --plan cut_plan.json -> video final
Paso 5 Inspección de calidad por fotogramas clave (extraer un fotograma en cada punto de corrección, leer + verificar visualmente que el texto esté completo y no se desborde)
Paso 6 Entrega: informar qué se eliminó, qué se corrigió y dónde está el archivo
Paso 1 Comando de Transcripción
& "C:\Users\44162\AppData\Local\Programs\Python\Python312\python.exe" "<skill>/scripts/transcribe.py" --video "<ruta del video>" --outdir "<directorio de trabajo>" --prompt "Tutorial técnico en chino sobre XXX, YYY y otros temas"
--prompt usa el tema del video + términos técnicos de alta frecuencia (tomados del glosario ~/.claude/skills/jianying-subtitle-fixer/config/terms.json), lo que mejora significativamente la precisión en nombres propios. Directorio de trabajo recomendado: D:\sistema de producción de contenido\edición\workspace\<fecha-job>\.
Paso 2 Análisis por AI (Paso No Sustituible por Humanos, Metodología en references/cut-heuristics.md)
Después de leer todo el raw.json, se producen cuatro cosas:
- Corrección de subtítulos fixed: Corregir uno por uno los errores de homófonos y términos mal escuchados. Mantener el lenguaje hablado original, solo corregir errores, no refinar (los subtítulos deben coincidir con el audio; reescribir causaría desajuste audio-visual). Patrones de errores de whisper en references.
- Eliminación de contenido content_cuts: Segmentos completos que deben eliminarse (código de tiempo + razón), con tipos y criterios de evaluación en references. Las repeticiones a nivel de palabra (como "publiqué un... publiqué un" dentro de una oración) se localizan con precisión usando las marcas de tiempo de las palabras.
- deleted_ids: IDs de las líneas de subtítulos cubiertas por content_cuts (estas líneas no se incluyen en los subtítulos).
- Barras de corrección corrections: Párrafos donde se habló incorrectamente, barra amarilla en la parte superior del video. Se escribe en cut_plan.json.
Paso 3 Aprobación del Usuario (Principios)
- Lo claramente eliminable (tartamudeo repetido, inicio de error, frase abandonada a medio decir): incluirlo directamente en el plan, solo se debe informar al usuario al reportar.
- Párrafos con contenido incorrecto: preguntar al usuario "Eliminar / Conservar + barra de corrección", para contenido subjetivo se prefiere conservar + corregir.
- El texto de la barra de corrección y las conclusiones de verificación de hechos (si se necesita verificar en línea, primero buscar con WebSearch el texto original) deben ser revisados por el usuario.
- Usar AskUserQuestion para preguntar todos los elementos pendientes de aprobación de una sola vez.
Paso 4 Comando de Renderizado
& "C:\Users\44162\AppData\Local\Programs\Python\Python312\python.exe" "<skill>/scripts/render.py" --plan "<directorio de trabajo>/cut_plan.json"
Formato de cut_plan.json (los comentarios en el encabezado de render.py tienen una explicación completa):
{
"video": "C:/video original.mp4",
"out": "C:/video final.mp4",
"raw": "raw.json",
"content_cuts": [[213.45, 230.98, "Error al mencionar experimento"]],
"deleted_ids": [48, 49, 50],
"fixed": {"1": "texto corregido"},
"corrections": [[12.95, 20.14, "Corrección: el nombre correcto es XX"]],
"silence": {"min_dur": 1.0, "keep": 0.25},
"style": {"sub_size": 64, "cor_size": 48}
}
Todos los códigos de tiempo deben usar la línea de tiempo del video original (el script reasigna automáticamente a la línea de tiempo recortada). silence/style se pueden omitir. El estilo de subtítulos por defecto es para letra grande en dispositivos móviles (base de 2560 de ancho, 64/48, escalado proporcional automático según la resolución). Si el usuario dice que la letra es pequeña, se ajustan los valores de style y se vuelve a ejecutar.
Paso 5 Inspección de Calidad por Fotogramas
Leer los tiempos reales de las correcciones desde final.ass (líneas Cor), extraer fotogramas según la nueva línea de tiempo:
& "D:\software\ffmpeg\bin\ffmpeg.exe" -y -i "<video final>" -vf "select='eq(n\,<número de fotograma>)',scale=1100:-1" -vsync vfr "<directorio qc>/qc_%d.jpg"
Número de fotograma = segundos × 20fps. Leer fotograma por fotograma + inspección visual: texto completo, no desbordado, sin conflictos con los subtítulos inferiores.
Archivo de Errores (Experiencias, No Repetir)
- Fallo silencioso de aselect: En algunos flujos AAC, aselect no corta ningún fotograma y no reporta error → la eliminación de audio debe usar
asplit+atrim+concat(ya integrado en render.py, no cambiarlo de vuelta a aselect) - concat no se puede poner después de un select de flujo único como concatenador (error de desajuste en el recuento de pads); select+setpts ya produce una salida continua
- La verificación del video final debe usar ffprobe para ambos flujos (video y audio) por separado: la duración del formato puede ser extendida por el flujo más largo, ocultando que "no se cortó nada" (ya se ha visto: renderizado "exitoso" pero el audio se conservó completamente)
- Ruta del filtro subtitles: ass y el directorio de trabajo actual (cwd) del renderizado deben usar rutas relativas para evitar problemas de escape en rutas con chino
- La eliminación de silencios debe incluir una zona de protección de palabras (strip_guard integrado en render.py): las marcas de tiempo de las palabras de whisper pueden diferir de las de silencedetect; las palabras suaves (como términos técnicos en inglés al inicio de una oración) pueden caer dentro del "silencio". Cortar directamente según el silencio eliminaría media palabra
- El script de transcripción maneja la codificación GBK en stderr de ffmpeg (error común en Windows, ignorar los mensajes de este hilo)
Costo de Iteración
Cambiar tamaño de fuente / texto de corrección / agregar o eliminar segmentos eliminados → modificar los campos correspondientes en cut_plan.json y volver a ejecutar render.py, cada iteración toma 1-2 minutos. El video final se sobrescribe, el video original nunca se modifica.