Communitygithub.com

WakaChobii/tiktok-text

동영상에 틱톡 스타일의 온스크린 텍스트를 추가합니다. 틱톡의 인앱 텍스트 도구와 동일한 글꼴(TikTok Sans 'Classic'), 색상(흰색, 검은색 테두리 흰색, 연한 노란색, 금색, 라일락), 그리고 애플 아이폰 이모지를 사용합니다. 참조 동영상의 자막을 프레임 단위로 정확하게 복사하거나 새로운 자막을 작성할 수 있습니다.

tiktok-text란 무엇인가요?

이 스킬(Skill)은 동영상에 틱톡(TikTok) 앱 내 텍스트 도구와 완전히 동일한 스타일의 온스크린 텍스트를 추가하는 전문 도구입니다. 틱톡의 'TikTok Sans' 클래식 폰트와 주요 색상(일반 흰색, 검은색 테두리 흰색, 연한 노란색, 금색, 라일락), 그리고 애플 아이폰 이모지 세트를 사용하여 텍스트를 렌더링하므로, ffmpeg drawtext와 같은 다른 방식으로는 구현할 수 없는 정확한 시각적 일치를 보장합니다. 주요 사용 사례는 두 가지입니다. 첫째, 기존 틱톡 영상을 참조하여 해당 영상의 자막(단어, 줄바꿈, 크기, 위치, 타이밍)을 프레임 단위로 정확하게 복사할 수 있습니다. 둘째, 사용자가 직접 새로운 캡션을 작성하여 동영상에 추가할 수 있습니다. 두 경우 모두 최종 결과물은 원본 파일은 유지한 채 ' (WITH TEXT).mp4' 파일로 저장됩니다. 이 스킬은 클로드 코드(Claude Code), 커서(Cursor), 코덱스(Codex) 등 AI 에이전트 환경에서 사용되며, Python 스크립트(add_text.py)를 통해 실행됩니다. 기본적으로 틱톡의 1080x1920 해상도를 유지하고, 참조 영상이 없어도 동작합니다. 텍스트 스타일, 크기, 위치(y축), 가로 정렬(x축), 색상 등을 세밀하게 제어할 수 있으며, 줄바꿈, 공백, 이모지 등도 정확히 처리합니다. 특히 참조 영상의 텍스트를 복사할 때는 각 캡션의 시작/종료 시간(프레임 정밀도), 스타일, 채우기 색상 및 박스 정보를 자동으로 감지하고, 결과물의 정확성을 시각적 비교 이미지(check.jpg)로 확인할 수 있어 매우 정밀한 작업이 가능합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/WakaChobii/tiktok-text/tree/HEAD/plugins/tiktok-text/skills/add-text

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

동영상에 틱톡 스타일 텍스트 추가하기

이 스킬의 파일은 ${CLAUDE_PLUGIN_ROOT}/skills/add-text/에 있습니다:

  • scripts/add_text.py: 이것을 사용하세요. 두 개의 명령어로 전체 작업을 실행합니다.
  • scripts/caption_match.py (감지/맞춤/확인) 및 scripts/tiktok_text.py (그리기 + 합성): 엔진입니다.
  • scripts/setup_check.py: 첫 실행 설정 및 확인.
  • fonts/: TikTok Sans (오픈 소스, OFL 라이선스).

스타일은 실제 앱 내 틱톡을 기준으로 측정되었습니다. 다른 방식으로 텍스트를 렌더링하지 마십시오 (ffmpeg drawtext, 일반 폰트 등). 일치하지 않습니다.

0단계: 설정 (매번 수행; 한 번 완료되면 약 2초 소요)

PATH에 있는 python / python3으로 다음을 실행하세요:

python "${CLAUDE_PLUGIN_ROOT}/skills/add-text/scripts/setup_check.py" "${CLAUDE_PLUGIN_DATA}"
  • 첫 번째 실행은 플러그인의 데이터 폴더에 개인 Python 환경을 생성하고 패키지를 설치합니다 (약 1-2분). 사용자에게 어떤 일이 일어나고 있는지 알려주세요.

  • 마지막 줄은 READY PY=<path>입니다. 아래 모든 명령어에 대해 그 <path>를 python으로 사용하세요 (PY로 표기).

  • NOT READY: ...는 누락된 것과 정확한 해결 방법을 알려줍니다:

    • ffmpeg: 사용자에게 물어본 후 제공된 설치 명령어를 실행하세요 (Windows는 winget, Mac은 brew, Linux는 apt). Windows에서는 ffmpeg를 찾기 전에 새 터미널이 필요할 수 있습니다. 그렇다면 사용자에게 Claude Code를 다시 시작하라고 알리세요.
    • Python 3.9+ 없음: 사용자가 직접 설치(python.org)하고 Claude Code를 다시 시작해야 합니다.

    그런 다음 설정을 다시 실행하세요.

  • python 명령어가 없나요? python3 또는 Windows에서는 py를 시도해보세요.

아래 명령어에서 S = ${CLAUDE_PLUGIN_ROOT}/skills/add-text/scripts입니다. 모든 경로를 따옴표로 묶으세요. PowerShell에서는 각 명령어를 & 로 시작하세요 (예: & "PY" "S/add_text.py" ...).

규칙

  • 출력은 입력 비디오의 크기와 프레임 속도를 유지합니다 (틱톡: 1080x1920). 텍스트 버전을 원본 옆에 <name> (WITH TEXT).mp4로 저장하고, 원본을 절대 덮어쓰지 마세요.
  • 콘텐츠: 틱톡은 오해의 소지가 있는 주장에 불이익을 줍니다. 절대적인 결과 주장("완치", "3일 안에 고침", "보장")은 피하세요. 참조의 훅이 주장을 할 때는 동일한 리듬과 줄 수로 표현을 조정하고, 변경한 내용과 이유를 사용자에게 알리세요. 확실하지 않으면 물어보세요.
  • 입력된 텍스트는 iPhone이 생성하는 것과 같아야 합니다:
    • ...가 아닌 …
    • 참조에서 사용하는 경우 둥근 따옴표 ’ “ ”
    • 실제 이모지 문자로 이모지
  • 앞뒤 공백이 중요합니다: 틱톡은 공백을 포함하여 각 줄을 중앙에 배치합니다. fit이 대신 추가해줍니다.

A. 참조 틱톡의 텍스트 복사하기

사용자 비디오 옆에 작업 폴더를 사용하세요. 예: text work/.

  1. 시작: "PY" "S/add_text.py" start "REF.mp4" "WORKDIR"
    • 모든 캡션 출력: 시작/종료 (프레임 정확, 참조 타임라인), 스타일, 채우기 색상 및 상자.
    • WORKDIR/captions.json을 "text": "??"로 작성하고 각 캡션의 확대된 자르기 WORKDIR/caption_<n>.png를 생성합니다.
    • 틱톡 자체의 "TikTok @user" 워터마크는 건너뜁니다.
    • 참조를 먼저 다운로드해야 하나요? 설치되어 있다면 yt-dlp가 작동합니다. 그렇지 않으면 사용자에게 파일을 요청하세요.
  2. 텍스트 채우기. 각 자르기 이미지를 읽고 각 "??"를 교체하세요.
    • 다른 필드는 그대로 두세요. _ 접두사 필드(_ref_t, _bbox_1080, ...)는 finish에서 사용됩니다.
    • 줄 바꿈은 \n이고, 이모지는 문자입니다. 앞뒤 공백은 신경 쓰지 마세요.
    • 두 줄 사이의 간격이 일반 간격의 약 두 배라면 빈 줄입니다: "A\n\nB".
    • 하나의 캡션에 두 개의 개별 텍스트 상자가 있는 경우 (크기가 매우 다르거나, 큰 간격이 있거나, 같은 x에 중앙 정렬되지 않음): 동일한 시작/종료, _ref_t 및 스타일로 두 항목으로 분할하세요. 각각 고유한 _bbox_1080을 지정하세요: 해당 줄의 _lines_1080 (detect는 각 줄의 상자와 높이를 출력함)에서 나온 선들의 합집합으로, fit이 올바른 텍스트를 보도록 합니다. 예: 1행:[346,1126,735,1167] 및 2+3행 → [346,1126,735,1167] 및 [204,1272,887,1389].
    • style이 custom / custom_outline으로 반환되었나요? 이 도구에 없는 다른 글꼴, 배경 상자 또는 다른 색상입니다. 사용자에게 알리고 가장 가까운 스타일을 선택하세요. 조용히 추측하지 마세요.
    • 사용자의 컷이 참조와 다른 경우 여기서 시간을 다시 조정하세요: start/end를 편집하세요 (초, 종료는 제외). Fit과 check는 여전히 자체 시간(_ref_t)의 참조를 봅니다.
  3. 마무리: "PY" "S/add_text.py" finish "REF.mp4" "VIDEO.mp4" "WORKDIR"
    • 크기, 위치 및 공백을 json에 맞추고 WORKDIR/fit_<n>.png를 작성합니다 (참조가 위, 우리 것이 아래).
    • 비디오 길이를 초과하는 모든 캡션을 비디오 길이에서 종료합니다.
    • 비디오 옆에 VIDEO (WITH TEXT).mp4를 합성합니다 (또는 (no text) → (WITH TEXT)). 4번째 인수로 다른 출력 이름을 선택할 수 있습니다.
    • 결과를 확인하고 WORKDIR/check.jpg를 작성합니다 (참조 왼쪽, 우리 것 오른쪽).
    • SUMMARY: PASS 또는 REVIEW를 이유와 함께 출력합니다.
  4. check.jpg를 보고 완료되었다고 말하기 전에 사용자에게 보여주세요.
    • "가장자리가 참조와 N px 이내로 일치" 상태에서 낮은 중첩: 크기와 위치가 정확합니다. 압축된 금색 또는 노란색 텍스트는 올바른 경우에도 종종 0.45-0.7 점수를 받습니다. 눈으로 단어만 확인하세요.
    • "가장자리가 N px 차이" 상태에서 낮은 중첩: 일반적으로 오타, 줄 바꿈 누락, 잘못된 스타일 또는 분할 후 잘못된 _bbox_1080 때문입니다. json을 수정하고 finish를 다시 실행하세요.
    • 수동으로 조정된 크기/y/x를 유지하려면 --no-fit을 추가하세요.

B. 새 캡션 (참조 없음)

captions.json을 작성하세요:

[{"text": "line one\nline two", "start": 0, "end": 3.5, "style": "outline", "size": 70, "y": 0.5}]

그런 다음 "PY" "S/add_text.py" new "VIDEO.mp4" "WORKDIR/captions.json"을 실행하세요. 텍스트를 합성하고 json 옆에 preview.jpg (캡션당 한 프레임)를 작성합니다. 사용자에게 보여주세요.

  • 스타일: classic (일반 흰색), outline (흰색 + 검은색 외곽선), yellow (옅은), yellow_gold, lilac.
  • 크기: 약 50 (작게) ~ 85 (크게). 일반적인 훅은 54-77입니다.
  • y: 0.4-0.5 = 화면 중간, 0.65 = 하단 1/3. 하단 20% (틱톡의 캡션/UI)와 오른쪽 가장자리 (버튼)을 피하세요.
  • 선택 사항: x (수평 중앙, 기본값 0.5), weight, color (사용자 정의 채우기용 "#RRGGBB").
  • 휴대폰으로 입력하는 사람이 하는 것처럼 줄을 나누세요. 크기 70에서 줄은 약 20-28자입니다.

비디오를 렌더링하지 않고 빠르게 보기: "PY" "S/tiktok_text.py" --png "text\nmore" out.png (클래식 스타일).

주의사항

  • 일반적인 시간: 시작 약 25초, 캡션 수에 따라 완료 1-3분 (외곽선 캡션이 가장 느림), --no-fit 약 40초.
  • 이모지: 각 새 이모지는 한 번 다운로드됩니다 (Apple 세트, jsDelivr의 emoji-data CDN). 따라서 처음에는 인터넷이 필요합니다. 다운로드가 실패하면 스크립트가 오류를 발생시킵니다. 이모지를 삭제하지 말고 사용자에게 알리세요.
  • 의도적으로 그림자 없음: 실제 틱톡 텍스트에는 그림자가 없습니다. 압축된 참조 옆의 "더 깔끔한" 모양은 예상된 것이며 틱톡이 업로드를 재인코딩하면 사라집니다.
  • 2줄만 있는 경우, fit의 공간 수정기는 어느 줄이 중앙에서 벗어났는지 알 수 없습니다. fit_<n>.png에서 한 줄이 약 5px 이동되었고 중첩이 0.6 미만으로 유지되면 각 줄에 직접 앞 또는 뒤 공백을 추가하고 다시 실행해보세요.
  • Windows: 다른 Python 스니펫에서 이모지가 이상하게 출력되면 PYTHONIOENCODING=utf-8을 설정하세요. 이 스크립트는 이를 처리합니다.

관련 스킬