動画にTikTokスタイルのテキストを追加する
このスキルのファイルは ${CLAUDE_PLUGIN_ROOT}/skills/add-text/ にあります:
scripts/add_text.py:これを使用します。 2つのコマンドでジョブ全体を実行します。scripts/caption_match.py(検出/適合/チェック)とscripts/tiktok_text.py(描画+焼き付け):エンジン部分です。scripts/setup_check.py:初回セットアップとチェックを行います。fonts/:TikTok Sans(オープンソース、OFLライセンス)。
スタイルは実際のアプリ内TikTok動画に対して測定されています。他の方法でテキストをレンダリングしないでください(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を再起動する必要があります。
その後、セットアップを再度実行します。
- ffmpeg:ユーザーに確認してから、表示されるインストールコマンドを実行します(Windowsは
-
pythonコマンドがない場合は?python3を試すか、Windowsの場合はpyを試してください。
以下のコマンドでは、S = ${CLAUDE_PLUGIN_ROOT}/skills/add-text/scripts とします。すべてのパスは引用符で囲んでください。PowerShellでは、各コマンドの先頭に & を付けます(例:& "PY" "S/add_text.py" ...)。
ルール
- 出力は入力動画のサイズとフレームレートを維持します(TikTok:1080x1920)。テキストバージョンは元の動画の隣に
<name> (WITH TEXT).mp4として保存し、元の動画を上書きしないでください。 - 内容について: TikTokは誤解を招く主張を罰します。「治った」「3日で治る」「保証」などの絶対的な結果主張は避けてください。参照動画のフックが主張を含む場合、同じリズムと行数で表現を調整し、変更内容と理由をユーザーに伝えてください。不明な場合は確認してください。
- 入力されたテキストはiPhoneで生成されるものと一致している必要があります:
...ではなく…- 参照が使用している場合は曲線引用符
'「 」 - 絵文字は実際の絵文字文字として
- 先頭と末尾のスペースは重要です:TikTokは各行をスペースを含めて中央揃えにします。
fitが自動的に追加します。
A. 参照TikTokのテキストをコピーする
ユーザーの動画の隣にワークフォルダを使用します(例:text work/)。
- 開始:
"PY" "S/add_text.py" start "REF.mp4" "WORKDIR"- 各キャプションを表示:開始/終了(フレーム単位、参照タイムライン)、スタイル、塗りつぶし色、ボックス。
WORKDIR/captions.jsonに"text": "??"を、各キャプションのズームクロップWORKDIR/caption_<n>.pngを書き込みます。- TikTok自身の「TikTok @user」透かしはスキップします。
- 最初に参照をダウンロードする必要がありますか?
yt-dlpがインストールされていれば機能します。それ以外の場合はユーザーにファイルを依頼してください。
- テキストを入力する。 各クロップ画像を読み、各
"??"を置き換えます。- 他のフィールドはそのままにします。
_で始まるフィールド(_ref_t、_bbox_1080、...)はfinishで使用されます。 - 改行は
\nで、絵文字は文字です。先頭や末尾のスペースは気にしないでください。 - 2行が通常の間隔の約2倍離れている場合、それは空白行です:
"A\n\nB"。 - 1つのキャプション内に2つの別々のテキストボックスがある場合(サイズが非常に異なる、大きな隙間がある、同じxで中央揃えされていない):それらを同じ開始/終了、
_ref_t、スタイルを持つ2つのエントリに分割します。各エントリに独自の_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(秒、endは排他)を編集します。Fitとcheckは引き続き参照をその時刻(_ref_t)で見ます。
- 他のフィールドはそのままにします。
- 終了:
"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 を理由とともに表示します。
- jsonにサイズ、位置、スペースを適合させ、
- 確認
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" を実行します。テキストを焼き付け、preview.jpg(キャプションごとに1フレーム)をjsonの隣に書き込みます。ユーザーに表示します。
- style:
classic(プレーンホワイト)、outline(ホワイト+黒枠)、yellow(淡い)、yellow_gold、lilac。 - size: 約50(小)〜85(大)。一般的なフックは54〜77です。
- y: 0.4〜0.5 = 画面中央、0.65 = 下3分の1。下部20%(TikTokのキャプション/UI)と右端(ボタン)を避けてください。
- Optional:
x(水平中央、デフォルトは0.5)、weight、color(カスタム塗りつぶし用の"#RRGGBB")。 - スマートフォンで入力する人が行うように行を区切ります。サイズ70の場合、1行あたり約20〜28文字です。
動画をレンダリングせずに簡単に確認するには:"PY" "S/tiktok_text.py" --png "text\nmore" out.png(classicスタイル)。
注意点
- 典型的なタイミング:開始約25秒、終了1〜3分(キャプション数による。アウトラインキャプションの適合が最も遅い)、
--no-fit約40秒。 - 絵文字:新しい絵文字はそれぞれ1回ダウンロードされます(Appleセット、emoji-data CDN on jsDelivr)。そのため、初回はインターネット接続が必要です。ダウンロードに失敗した場合、スクリプトはエラーを発生させます。絵文字を省略するのではなく、ユーザーに伝えてください。
- 意図的に影はありません:実際のTikTokテキストには影がありません。圧縮された参照と比較した「クリーン」な見た目は正常であり、TikTokがアップロードを再エンコードするとなくなります。
- 2行のみの場合、fitのスペース修正機能はどの行が中央からずれているかを判別できません。
fit_<n>.pngで1行が約5pxずれて表示され、重複が約0.6未満のままの場合は、各行に自分で末尾または先頭のスペースを追加して再実行してみてください。 - Windows:他のPythonスニペットで絵文字が奇妙に出力される場合は、
PYTHONIOENCODING=utf-8を設定してください。これらのスクリプトはそれを処理します。