Communitygithub.com

WakaChobii/texto-tiktok

Quema texto en pantalla en un video para que se vea exactamente como la herramienta de texto integrada de TikTok (fuente TikTok Sans 'Clásica'; blanco sólido, blanco con contorno negro, amarillo pálido, amarillo dorado, lila; emoji de iPhone Apple), ya sea copiando los subtítulos de un TikTok de referencia con precisión de fotograma (redacción, saltos de línea, tamaño, posición, sincronización) o escribiendo nuevos subtítulos. Úsalo siempre que el usuario pida añadir texto, subtítulos, una superposición o un gancho a un video, para copiar/recrear el texto de un video de referencia, o diga 'con texto'.

¿Qué es texto-tiktok?

Esta habilidad añade texto al estilo TikTok a cualquier video, replicando fielmente la apariencia de la herramienta de texto integrada de TikTok. Soporta los estilos clásicos (blanco sólido, blanco con contorno negro, amarillo pálido, amarillo dorado, lila) y emojis de Apple iPhone. Funciona de dos maneras: copiando los subtítulos de un TikTok de referencia (detecta automáticamente los tiempos, estilos y posiciones) o creando nuevos subtítulos desde cero. Está diseñada para Claude Code y otros asistentes de IA, y utiliza scripts Python optimizados con un sistema de ajuste y verificación. La salida mantiene el tamaño y la tasa de fotogramas del video original (1080x1920) y nunca sobrescribe el archivo original. También incluye reglas de contenido para evitar afirmaciones engañosas penalizadas por TikTok, y maneja caracteres especiales como puntos suspensivos, comillas curvas y emojis reales de iPhone.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/WakaChobii/tiktok-text/tree/HEAD/plugins/tiktok-text/skills/add-text

Preguntar en tu IA favorita

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

Documentación

Añadir texto estilo TikTok a un video

Los archivos de esta habilidad están en ${CLAUDE_PLUGIN_ROOT}/skills/add-text/:

  • scripts/add_text.py: úsalo. Ejecuta todo el trabajo en dos comandos.
  • scripts/caption_match.py (detectar / ajustar / verificar) y scripts/tiktok_text.py (dibuja + quema): el motor.
  • scripts/setup_check.py: configuración y verificación inicial.
  • fonts/: TikTok Sans (código abierto, licencia OFL).

Los estilos se midieron con TikToks reales desde la aplicación. No renderices el texto de ninguna otra forma (drawtext de ffmpeg, una fuente simple, etc.). No coincidirá.

Paso 0: configuración (cada vez; toma unos 2 segundos una vez hecho)

Ejecuta, con el python / python3 que esté en PATH:

python "${CLAUDE_PLUGIN_ROOT}/skills/add-text/scripts/setup_check.py" "${CLAUDE_PLUGIN_DATA}"
  • La primera ejecución crea un entorno privado de Python en la carpeta de datos del plugin e instala los paquetes (aproximadamente 1-2 minutos). Indica al usuario lo que está sucediendo.

  • La última línea es READY PY=<ruta>. Usa esa <ruta> como python para cada comando a continuación (escrito PY).

  • NOT READY: ... dice qué falta y la solución exacta:

    • ffmpeg: pide al usuario y luego ejecuta el comando de instalación que da (winget en Windows, brew en Mac, apt en Linux). En Windows, puede ser necesario un nuevo terminal para que ffmpeg sea encontrado. Si es así, dile al usuario que reinicie Claude Code.
    • No Python 3.9+: el usuario debe instalarlo (python.org) y reiniciar Claude Code.

    Luego vuelve a ejecutar la configuración.

  • ¿No hay comando python? Prueba con python3 o py en Windows.

En los comandos siguientes, S = ${CLAUDE_PLUGIN_ROOT}/skills/add-text/scripts. Pon entre comillas cada ruta. En PowerShell, inicia cada comando con & (ej., & "PY" "S/add_text.py" ...).

Reglas

  • La salida mantiene el tamaño y la tasa de fotogramas del video de entrada (TikTok: 1080x1920). Guarda la versión con texto junto al original como <nombre> (CON TEXTO).mp4, y nunca sobrescribe el original.
  • Contenido: TikTok penaliza afirmaciones engañosas. Evita afirmaciones absolutas de resultados ("curado", "arreglado en 3 días", "garantizado"). Cuando el gancho de una referencia hace una afirmación, adapta la redacción (mismo ritmo y número de líneas), e informa al usuario de lo que cambiaste y por qué. Pregunta si no estás seguro.
  • El texto escrito debe ser lo que un iPhone produciría:
    • … no ...
    • comillas curvas ’ “ ” si la referencia las usa
    • emoji como caracteres emoji reales
  • Los espacios iniciales y finales importan: TikTok centra cada línea incluidos sus espacios. fit los añade por ti.

A. Copiar el texto de un TikTok de referencia

Usa una carpeta de trabajo junto al video del usuario, ej., text work/.

  1. Iniciar: "PY" "S/add_text.py" start "REF.mp4" "WORKDIR"
    • Imprime cada subtítulo: inicio/fin (precisión de fotograma, línea de tiempo de referencia), estilo, color de relleno y caja.
    • Escribe WORKDIR/captions.json con "text": "??", y un recorte ampliado WORKDIR/caption_<n>.png de cada uno.
    • Omite la marca de agua "TikTok @usuario" de TikTok.
    • ¿Necesitas descargar primero la referencia? yt-dlp funciona si está instalado. De lo contrario, pide el archivo al usuario.
  2. Rellenar el texto. Lee cada imagen de recorte y reemplaza cada "??".
    • Deja los otros campos. Los que empiezan con _ (_ref_t, _bbox_1080, ...) son usados por finish.
    • Los saltos de línea son \n, y los emoji son caracteres. No te preocupes por los espacios iniciales o finales.
    • Si dos líneas están separadas aproximadamente el doble del espaciado normal, es una línea en blanco: "A\n\nB".
    • Dos cuadros de texto separados en un mismo subtítulo (tamaños muy diferentes, un gran espacio, o no centrados en la misma x): divídelos en dos entradas con el mismo inicio/fin, _ref_t y estilo. Dale a cada una su propio _bbox_1080: la unión de sus líneas de _lines_1080 (detect imprime la caja y altura de cada línea), para que fit mire el texto correcto. Ejemplo: líneas 1:[346,1126,735,1167] y 2+3 → [346,1126,735,1167] y [204,1272,887,1389].
    • ¿style devolvió custom / custom_outline? Es otra fuente, una caja de fondo u otro color que esta herramienta no tiene. Informa al usuario y elige el estilo más cercano. No adivines en silencio.
    • Reajusta el tiempo aquí si los cortes del usuario difieren de la referencia: edita start/end (segundos, final exclusivo). Fit y check siguen mirando la referencia en su propio tiempo (_ref_t).
  3. Finalizar: "PY" "S/add_text.py" finish "REF.mp4" "VIDEO.mp4" "WORKDIR"
    • Ajusta tamaño, posición y espacios en el json, y escribe WORKDIR/fit_<n>.png (referencia arriba, la nuestra abajo).
    • Termina cualquier subtítulo que se extienda más allá del video al final de este.
    • Quema VIDEO (CON TEXTO).mp4 junto al video (o (sin texto) → (CON TEXTO)). Un cuarto argumento elige otro nombre de salida.
    • Verifica el resultado y escribe WORKDIR/check.jpg (referencia izquierda, nuestra derecha).
    • Imprime un RESUMEN: APROBADO o REVISAR con las razones.
  4. Mira check.jpg y muéstralo al usuario antes de decir que está listo.
    • Superposición baja con "los bordes coinciden con la referencia dentro de N px": el tamaño y la posición son correctos. El texto dorado o amarillo comprimido a menudo puntúa 0.45-0.7 incluso cuando es correcto. Simplemente confirma la redacción visualmente.
    • Superposición baja con "bordes desviados por N px": generalmente un error tipográfico, un salto de línea perdido, el estilo incorrecto, o un _bbox_1080 malo después de una división. Corrige el json y vuelve a ejecutar finish.
    • Para mantener el tamaño/y/x ajustados manualmente, añade --no-fit.

B. Nuevos subtítulos (sin referencia)

Escribe un captions.json:

[{"text": "línea uno\nlínea dos", "start": 0, "end": 3.5, "style": "outline", "size": 70, "y": 0.5}]

Luego ejecuta "PY" "S/add_text.py" new "VIDEO.mp4" "WORKDIR/captions.json". Quema el texto y escribe preview.jpg (un fotograma por subtítulo) junto al json. Muéstralo al usuario.

  • style: classic (blanco sólido), outline (blanco + contorno negro), yellow (pálido), yellow_gold, lilac.
  • size: aproximadamente 50 (pequeño) a 85 (grande). Los ganchos típicos son 54-77.
  • y: 0.4-0.5 = centro de la pantalla, 0.65 = tercio inferior. Mantén alejado del 20% inferior (subtítulos/UI de TikTok) y del borde derecho (botones).
  • Opcional: x (centro horizontal, por defecto 0.5), weight, color ("#RRGGBB" para un relleno personalizado).
  • Rompe líneas donde lo haría una persona escribiendo en un teléfono. Las líneas tienen aproximadamente 20-28 caracteres con tamaño 70.

Vistazo rápido sin renderizar un video: "PY" "S/tiktok_text.py" --png "texto\nmás" out.png (estilo clásico).

Advertencias

  • Tiempos típicos: inicio unos 25 s, final 1-3 min dependiendo del número de subtítulos (los subtítulos con contorno se ajustan más lentamente), --no-fit unos 40 s.
  • Emoji: cada nuevo se descarga una vez (conjunto de Apple, CDN de emoji-data en jsDelivr), por lo que necesita internet la primera vez. Si falla una descarga, el script lanza una excepción. Informa al usuario en lugar de omitir el emoji.
  • Sin sombra, a propósito: el texto real de TikTok no tiene ninguna. El aspecto "más limpio" junto a la referencia comprimida es esperado y desaparece una vez que TikTok re-codifica la subida.
  • Con solo 2 líneas, el corrector de espacios de fit no puede determinar qué línea está descentrada. Si fit_<n>.png muestra una línea desplazada unos 5 px y la superposición se mantiene por debajo de aproximadamente 0.6, prueba añadiendo un espacio al inicio o final en cada línea tú mismo y vuelve a ejecutar.
  • Windows: si los emoji se imprimen de forma extraña en otros fragmentos de Python, establece PYTHONIOENCODING=utf-8. Estos scripts lo manejan.

Skills relacionados