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) yscripts/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 (escritoPY). -
NOT READY: ...dice qué falta y la solución exacta:- ffmpeg: pide al usuario y luego ejecuta el comando de instalación que da (
wingeten Windows,brewen Mac,apten 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.
- ffmpeg: pide al usuario y luego ejecuta el comando de instalación que da (
-
¿No hay comando
python? Prueba conpython3opyen 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.
fitlos 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/.
- 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.jsoncon"text": "??", y un recorte ampliadoWORKDIR/caption_<n>.pngde cada uno. - Omite la marca de agua "TikTok @usuario" de TikTok.
- ¿Necesitas descargar primero la referencia?
yt-dlpfunciona si está instalado. De lo contrario, pide el archivo al usuario.
- 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_ty 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]. - ¿
styledevolvió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).
- Deja los otros campos. Los que empiezan con
- 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).mp4junto 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.
- Ajusta tamaño, posición y espacios en el json, y escribe
- Mira
check.jpgy 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_1080malo 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-fitunos 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>.pngmuestra 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.