Communitygithub.com

qiaomu-screen2video: grabación → demo bilingüe final

Convierte una grabación de pantalla con narración en un video terminado: alineación de micrófono y reducción de ruido opcionales, transcripción, subtítulos chino–inglés limpios con palabras resaltadas, flechas, focos, tarjetas de capítulo, stickers, música original ligera y portada, renderizado con FFmpeg/ASS.

¿Qué es qiaomu-screen2video: grabación → demo bilingüe final?

Paso 2 de la receta Video demo de producto (recorrido completo), de joeseesun/qiaomu-screen2video (creado el 2026-10-13, v0.16). El README muestra un fotograma real de FFmpeg con subtítulos bilingües resaltados. Conserva la voz original, acelera tutoriales a 1,35x sincronizado, usa glosarios OCR de pantalla y detección de movimiento, y solo cuenta los recursos que realmente produjo.

Compatible con✓Claude Code✓Codex CLI~Cursor
npx skills add joeseesun/qiaomu-screen2video

Preguntar en tu IA favorita

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

Documentación

Qiaomu Screen2Video

Grabación de pantalla + narración → alineación/reducción de ruido opcional → ASR → limpieza/traducción de texto → plan de efectos semánticos → producción final con ASS/FFmpeg. La portada y la música de fondo pueden prepararse en paralelo una vez completada la transcripción. Solo los activos realmente obtenidos se consideran completados.

Selecciones predeterminadas

  • Se conserva íntegramente el audio original, sin recortar muletillas ni pausas. Los tutoriales de pantalla se sincronizan por defecto con speed: 1.35 acelerando la imagen, la narración y los subtítulos; cuando el usuario solicita explícitamente velocidad original se usa 1.0. En los subtítulos se eliminan las muletillas sin sentido ("eh", "ah", "entonces"), pero se conservan "entonces" con valor lógico, negaciones, números y nombres propios. Se mantienen la transcripción original y las diferencias textuales.
  • Combinación predeterminada fija signature: chino 霞鹜新晰黑 Regular 400, inglés Atkinson Hyperlegible Next SemiBold 600. El chino tiene una estructura clara con un toque humano sin ser excesivamente redondeado; el inglés refuerza la distinción entre letras y números fácilmente confundibles; adecuado para subtítulos bilingües en pantallas pequeñas de móvil. Se incluyen ambas fuentes originales y sus respectivas licencias (chino IPA Font License 1.0, inglés OFL-1.1) con el skill, y se copian en la caché durante la ejecución.
  • Texto chino en blanco con borde negro, texto inglés en negro con borde blanco; el chino arriba, el inglés abajo. La misma unidad de subtítulo comparte el código de tiempo. El tamaño base para altura 1080 es 56/38, el inglés es aproximadamente el 68% del chino; el chino usa 1.2px de sombra negra al 55% de opacidad, el inglés usa 0.8px de sombra negra al 40% de opacidad, tanto el borde como la sombra escalan proporcionalmente con la altura de la imagen. Se utiliza un espaciado compacto de subtítulos cinematográfico, con la línea base del inglés situada aproximadamente en el 7.5% inferior de la zona segura. No confundir el "tamaño de letra 7" de CapCut con 7px de FFmpeg.
  • Por defecto se activan los efectos dinámicos basados en contenido: las palabras clave con marcas de tiempo por palabra usan resaltado gradual en rojo sol; las conclusiones, números y nombres de producto pueden mostrar texto decorativo breve; las operaciones explícitas de interfaz usan flechas, bordes y máscaras de foco; solo se usan tarjetas de capítulo para transiciones reales de estructura. Todas las duraciones se evalúan según la línea de tiempo final del vídeo, y deben tener en cuenta speed: las tarjetas de capítulo a pantalla completa requieren al menos 1.8 segundos, normalmente 2.2–4.0 segundos según la cantidad de texto; en vídeos de menos de 60 segundos se permite como máximo 1 tarjeta por defecto, y las demás transiciones se reemplazan con texto decorativo o guías de interfaz. Solo se mantiene un elemento visual principal a la vez entre texto decorativo, guías y tarjetas de capítulo. Los efectos de sonido pop/click/whoosh/chime se sintetizan originalmente mediante script, mezclados de forma ligera por defecto, sin depender de material externo con derechos de autor. Los colores de marca son negro árbol #111513, rojo sol #F05A3C, blanco cálido #F5F0E8. Leer primero Métodos de edición; para el esquema específico ver Efectos semánticos.
  • Se prioriza la conservación de la relación de aspecto, el contenido y el tamaño de píxel originales. Por defecto se usa overlay al estilo de subtítulos cinematográficos, sin añadir barras negras de forma automática. El chino va encima del inglés, y el inglés cerca del 7% inferior de la zona segura; si hay obstrucción se ajusta primero la posición del subtítulo o el salto de línea, y solo se usa band cuando el usuario lo selecciona explícitamente.
  • La portada por defecto añade 0.7 segundos al inicio; el vídeo original y ambos subtítulos se desplazan hacia atrás. Cuando el usuario solo quiere una portada independiente se establece intro_seconds: 0.
  • El final fijo por defecto terminal dura 6 segundos: aproximadamente 3 segundos para la aparición del avatar, escritura en terminal y entrada de la línea de cuentas, imagen completa congelada durante unos 2.15 segundos, luego 0.7 segundos de fundido a negro y se mantiene aproximadamente 0.15 segundos de cuadro final completamente negro. El texto usa una sombra semitransparente leve que escala con el tamaño de fuente, separándose suavemente del fondo oscuro; no usar texto brillante. El área de cuentas incluye fijamente X, GitHub, la cuenta pública de WeChat 「向阳乔木推荐看」 y el sitio web qiaomu.ai, cada uno con su icono correspondiente. Se reorganiza automáticamente en formato horizontal o nativo vertical según la relación de aspecto del vídeo de origen, prohibiendo recortar un final horizontal para hacerlo pasar por vertical.
  • Todos los vídeos finales miden el volumen de mezcla final y lo escriben en output/render.json. Por defecto se unifica a -17 LUFS-I, LRA objetivo 7 LU, pico verdadero no superior a -1.5 dBTP: si es demasiado bajo se aumenta, si es demasiado alto se reduce; si supera ±1 LU o el pico verdadero supera -1 dBTP no se entrega. voice_lufs solo se usa para voces originales particularmente inestables, por defecto null; ver Volumen y percepción auditiva.
  • La música de fondo por defecto es instrumental. Los tutoriales usan "alegre, concentrada, con sensación de avance", por defecto 96–112 BPM, percusión ligera, motivos cortos y simples, y graves contenidos; no convertir "alegre" en ritmos intensos, drops fuertes o melodías que compitan con la voz. Volumen bajo, fundido de entrada de 0.5 segundos con curva semisinusoidal, fundido de salida de 3 segundos; durante la voz se reduce mediante sidechain; la música debe cubrir completamente el final y el apagón final; después de que la voz termine, el sidechain se libera naturalmente, la música sube ligeramente y se desvanece junto con la imagen. La pista de narración seleccionada es la entrada del sidechain.
  • Cada paso actualiza review.html sin esperar a que el usuario lo abra, seleccione o apruebe. Los comentarios del usuario afectan a los siguientes pasos o a la re-renderización; el HTML por sí mismo no puede iniciar tareas.

Ruta rápida (por defecto en este orden, para reducir repeticiones)

  1. init → ASR (en segundo plano); simultáneamente visual.py analyze (aproximadamente 0.4× la duración de la fuente): movimiento de cámara, ventana estable, OCR de vocabulario en pantalla. ASR lee automáticamente el vocabulario como pista y vuelve a reconocer automáticamente la sincronización de palabras anómalas (una palabra que dura varios segundos).
  2. En cuanto sale la transcripción: comparar con work/visual-analysis.json.vocabulary para corregir la ortografía de nombres de productos/modelos (las pistas de Whisper no son suficientes, corrección manual obligatoria), escribir captions.json (los subtítulos que se fusionan, dividen o reajustan deben tener un nuevo ID + parent_ids), motion-plan.json, brief.json.
  3. En paralelo: generar tres fondos de portada (tres llamadas a la vez), music_synth.py para la música de fondo, outro_compose.py.
  4. Verificación de motion → una vez render → extracción de fotogramas + revisión de volumen por segmentos → entrega. Solo se renderiza una vez el vídeo final; se vuelve a renderizar solo con comentarios del usuario.
  5. Antes de entregar, informar al usuario de la ruta del vídeo final y luego realizar mejoras adicionales del skill.

Inicio y ejecución

La ruta del skill es el directorio donde se encuentra este SKILL.md. El código fuente personal solo está en /Users/joe/Nutstore Files/.agents/skills/qiaomu-screen2video; otras rutas de descubrimiento usan enlaces simbólicos. La instalación portátil no depende de esta ruta absoluta.

# El entorno se crea una sola vez; las fuentes de subtítulos por defecto se incluyen con el skill, otras fuentes opcionales se almacenan en caché según sea necesario.
uv venv ~/.cache/qiaomu-screen2video/venv
uv pip install --python ~/.cache/qiaomu-screen2video/venv/bin/python 'fonttools[woff]' pillow numpy opencv-python-headless ocrmac
# En adelante, $PY se refiere al Python de ese entorno, $SKILL al directorio raíz del skill, $JOB al directorio de salida actual.
"$PY" "$SKILL/scripts/fonts.py"
# Timbre de instrumentos reales para música de fondo (recomendado, una vez): FluidSynth + GeneralUser GS (32 MB, uso comercial permitido); si falta, se vuelve automáticamente a síntesis pura por código.
brew install fluid-synth   # Linux: apt install fluidsynth
mkdir -p ~/.cache/qiaomu-screen2video/soundfonts && curl -fL -o ~/.cache/qiaomu-screen2video/soundfonts/GeneralUser-GS.sf2 \
  https://raw.githubusercontent.com/mrbumpy409/GeneralUser-GS/684543d5e5efaef08d02be50dcda8d552478fa60/GeneralUser-GS.sf2
"$PY" "$SKILL/scripts/s2v.py" init "$VIDEO" --project "$JOB"
# Si se necesita reducción de ruido o alineación de grabación independiente, ejecutar primero local_audio.py de la siguiente sección y luego iniciar ASR.
"$PY" "$SKILL/scripts/visual.py" analyze "$JOB"   # Vocabulario en pantalla y movimiento de cámara, para ASR, subtítulos y callouts
"$PY" "$SKILL/scripts/asr.py" "$JOB" --engine auto --context 'Nombres de productos y términos de este vídeo'

El FFmpeg del sistema debe tener libass; el script detecta preferentemente ffmpeg-full en macOS. Solo se instalan las dependencias necesarias, no se carga qiaomu-cut ni se instala todo el framework de vídeo. Antes del reconocimiento, consultar ASR para decidir el motor y la precisión temporal.

Procesamiento opcional del audio de narración

Cuando el usuario solicita reducción de ruido, o proporciona una grabación de micrófono externo de la misma narración, leer Audio local. Ejecutar después de init y antes de ASR; la misma pista de audio procesada se usa para reconocimiento, mezcla y sidechain. Los cambios de audio invalidan la caché de reconocimiento anterior, subtítulos y vídeos finales; se debe volver a ejecutar ASR y limpieza/traducción de texto. Por defecto se mantiene el audio original.

"$PY" "$SKILL/scripts/local_audio.py" "$JOB" --denoise
# Estima automáticamente el desplazamiento temporal de la grabación independiente y puede reducir ruido simultáneamente:
"$PY" "$SKILL/scripts/local_audio.py" "$JOB" --voice "$VOICE" --denoise
# Restaurar el audio original y luego volver a ejecutar ASR y renderizado:
"$PY" "$SKILL/scripts/local_audio.py" "$JOB" --reset

El adaptador solo admite las bibliotecas/modelos hash de CapCut 11.5.0 en macOS Apple Silicon verificados; la inferencia nativa prohíbe la conexión a internet; no inicia la interfaz de usuario de CapCut ni empaqueta bibliotecas/modelos propietarios. Si la detección falla, se informa claramente; no se puede llamar reducción de ruido exitosa a un vídeo final con audio original. Las funciones como segmentación de planos, separación de voz o detección automática de puntos de corte, que aún no funcionan o tienen calidad insuficiente, no entran en este flujo.

Cuatro tareas de contenido del agente

  1. Leer $JOB/transcript.raw.json y fotogramas representativos. Generar $JOB/captions.json: {"segments":[{"id":"c0001","start":0.1,"end":2.3,"zh":"Texto chino limpio","en":"Natural English."}]}. Conservar ID y tiempo; al dividir intencionadamente en segmentos, usar un nuevo ID, parent_ids y códigos de tiempo dentro del rango temporal original; priorizar el uso de words; no se puede decir que dividir la longitud del texto por igual sea una alineación precisa. Las muletillas vacías pueden dejarse vacías tanto en chino como en inglés. Traducir usando el contexto completo del segmento, y luego mapear a estos ID; no traducir palabra por palabra mecánicamente, no usar Whisper turbo para realizar la traducción.
  2. Leer la transcripción completa, las marcas de tiempo por palabra y los fotogramas representativos. Primero, según Métodos de edición, confirmar el gancho, el cuerpo principal, la prueba y el cierre; luego, según Efectos semánticos, escribir $JOB/motion-plan.json. Entender primero "por qué esta frase necesita un efecto dinámico", y luego elegir entre resaltado gradual por palabra, texto decorativo de palabras clave (label / stroke (borde estilo Douyin) / card, unificado en todo el vídeo, reglas estéticas en el documento de efectos semánticos), pegatinas de expresión/meme, guías de interfaz o tarjetas de capítulo; si no hay función semántica, no añadir. El texto decorativo y las pegatinas usan at_word para sincronizarse con la pronunciación; reglas de densidad y posición en el documento de efectos semánticos. El target de las guías de interfaz debe basarse en la observación real de la imagen, usando coordenadas normalizadas 0–1; no se puede adivinar la posición del botón basándose en los subtítulos. La duración de las tarjetas de capítulo debe convertirse al vídeo final, y ser legible en las tres fases: entrada, permanencia completa y salida. Después de escribir, ejecutar la verificación motion; las advertencias entran en el HTML, pero no bloquean la generación normal; si la tarjeta de capítulo final visible es inferior a 1.8 segundos, se impide directamente el renderizado.
  3. Escribir $JOB/brief.json a partir de la narración real, formato en Contenido y activos. El título prometido debe tener evidencia de transcripción. Por defecto, diseñar tres portadas simultáneamente: la portada de inicio debe coincidir exactamente con los píxeles y la relación de aspecto del vídeo de origen; la miniatura de plataforma se hace por separado en 16:9; la distribución vertical se hace por separado en 9:16; las tres se recomponen, prohibiendo usar barras negras para ajustar la proporción o recortar mecánicamente. Cuando el usuario no solicita rondas de candidatas, elegir automáticamente la dirección más clara (YouTube/Bilibili) y continuar. Usar preferentemente el imagegen integrado en el Codex actual; si no está disponible, llamar a la API/skill de terceros configurado. La generación de imágenes se encarga de fondos sin texto; el título exacto lo compone cover_compose.py. No falsificar herramientas, API, resoluciones o estados de éxito.
  4. La música de fondo por defecto se compone originalmente con código: scripts/music_synth.py escribe la partitura según brief.json.music_profile; si está disponible FluidSynth + banco de sonidos, se renderiza con timbre de instrumento real (aproximadamente 2 segundos); de lo contrario, síntesis pura por código; registrar provider como code-synth (el engine del json de resultado registra el renderizador real). Solo cuando el usuario solicite explícitamente YuE2/Suno o proporcione su propia música, se sigue la ruta correspondiente: YuE2 lee el flujo de trabajo de música instrumental yue2-music (Apple Silicon usa --device auto para MPS, una sola canción lleva aproximadamente 30 minutos o más, en segundo plano, entregar primero la versión con música de código), Suno lee qiaomu-suno-master. Cada vez solo se registra el audio realmente obtenido y reproducible. No se debe cargar todo el flujo de qiaomu-cut solo para la música.
"$PY" "$SKILL/scripts/s2v.py" asset "$JOB" cover "$INTRO_COVER" --provider codex-imagegen
"$PY" "$SKILL/scripts/s2v.py" asset "$JOB" music "$BGM" --provider yue2-music
"$PY" "$SKILL/scripts/s2v.py" motion "$JOB"
"$PY" "$SKILL/scripts/outro_compose.py" "$JOB"
# Música de fondo original por código (fallback o por petición del usuario); --seconds toma la duración del vídeo final:
"$PY" "$SKILL/scripts/music_synth.py" "$JOB/work/code-music/bed.wav" --seconds "$FINAL_SECONDS" --profile calm_explainer
"$PY" "$SKILL/scripts/s2v.py" asset "$JOB" music "$JOB/work/code-music/bed.wav" --provider code-synth
# Cuando se necesiten activos de final para ambas plataformas:
"$PY" "$SKILL/scripts/outro_compose.py" "$JOB" --variants
"$PY" "$SKILL/scripts/s2v.py" render "$JOB"

El fallo de activos opcionales no bloquea otros trabajos autorizados. Los activos existentes antes de la exportación se usan directamente; solo se espera por las transcripciones/traducciones realmente dependientes. Si el usuario solicita explícitamente todos los activos, la versión generada primero se marca como "versión de previsualización de subtítulos", y se vuelve a renderizar después de que los activos tengan éxito.

HTML y modificaciones

review.html es una página local de visualización/decisión; al abrirla se puede reproducir el vídeo final, ver los subtítulos frase por frase y la línea de tiempo de efectos semánticos, revisar la portada y la música de fondo. Se pueden alternar todos los efectos dinámicos, el resaltado gradual por palabra y los efectos de sonido ligeros, y ajustar la ganancia de los efectos de sonido. El CSS de los subtítulos en la página inicial es ilustrativo; la fuente real, el borde, los saltos de línea, la posición objetivo y los efectos dinámicos son renderizados por ASS y verificados mediante extracción de fotogramas.

"$PY" "$SKILL/scripts/s2v.py" report "$JOB"
"$PY" "$SKILL/scripts/s2v.py" apply "$JOB" /path/to/decisions.json
"$PY" "$SKILL/scripts/s2v.py" render "$JOB"

La configuración de descarga no cambia las tareas en segundo plano. Solo surten efecto después de que el agente las aplique explícitamente; los cambios de entrada, configuración, subtítulos o material marcan el vídeo final anterior como caducado. Por defecto no se crean servidores, procesos en segundo plano ni pasos de espera de confirmación.

Entrega y verificación

  • El script verifica el emparejamiento de subtítulos, rango temporal/solapamiento, cobertura de fuentes, saltos de línea, duración, tamaño de imagen, pistas de audio y decodificación completa. Si falla, se mantiene el registro; al reintentar no se sobrescribe el vídeo original.
  • Revisar los fotogramas extraídos reales (inicio, subtítulo más largo, al menos un ejemplo de cada tipo de efecto dinámico, antes, durante y después del vídeo principal) y ver el vídeo final completo a la velocidad final 1×, no solo revisar los códigos de tiempo del material original. El resaltado gradual por palabra debe sincronizarse con la pronunciación; los cuadros indicadores deben apuntar a controles reales; las tarjetas de capítulo deben revisarse al menos en el punto medio de entrada, en la permanencia completa y un fotograma antes de la salida, confirmando que el texto se puede leer y que no oculta operaciones clave que están ocurriendo. Luego escuchar un fragmento de voz + música + efectos de sonido ligeros. visual_review/audio_review en output/render.json solo se cambia a passed después de la revisión real; las mediciones numéricas no pueden suplantar la escucha/visualización humana.
  • Entregar output/final.mp4, zh.srt, en.srt, bilingual.srt, subtitles.ass, motion-plan.json, output/motion-qa.json, portada, review.html. Informar del motor ASR y la precisión temporal, y enumerar los activos opcionales no obtenidos.
  • No subir/publicar el vídeo final en plataformas de vídeo; esto requiere una solicitud adicional del usuario.

Juicio de edición y ritmo: Métodos de edición. Fundamento de estilo y decisiones: Métodos de subtítulos. Momento de efectos, esquema y zona segura: Efectos semánticos. Reglas de finales: Finales y guía de suscripción. Aceptación de audio: Volumen y percepción auditiva. Configuración de ASR: ASR. Portada/música: Contenido y activos.

Skills relacionados