解説ショート・リールの公開
Only Sci Factsチャンネル(YouTube @onlyfactsci、Instagram onlyfactsci)向けのエンドツーエンドワークフロー:
エピソードを選ぶ → アップロード用に圧縮 → カバーを作成 → キャプションを書く → YouTubeショートとInstagramリールに投稿 → 確認。
任意の9:16 MP4解説動画フォルダで動作します。
スクリプトはこのファイルの隣の scripts/ にあります。ない場合は、https://github.com/pranaykrpiyush/video-publishing-skill をクローンして publish-explainer-shorts/scripts/ を使用してください。
スクリプトには ffmpeg、ffprobe、Python 3(Pillow、numpy)、およびInter Displayフォントが必要です。太字のサンセリフフォントであれば、FONT_DIR 環境変数で指定することで使用可能です。
0. 開始前の確認
- エピソードフォルダをユーザーに確認する(または見つける)。エピソードは
NN-slug.mp4という名前です(例:14-falling-into-a-black-hole.mp4)。 - リクエストに明記されていない場合は、投稿するエピソード数とプラットフォームをユーザーに尋ねる。
- ユーザーがChromeでYouTube StudioとInstagramにサインインしていることを確認する:各サイトを一度開いて確認する。
- すでに投稿済み? YouTube Studioのショート一覧とInstagramのグリッドを確認し、同じエピソードを二重投稿しないようにする。
1. 最もバズりそうなエピソードを選ぶ
-
在庫確認:
scripts/inventory.sh <folder>を実行し、各ファイルの再生時間、解像度、オーディオレベルを表示する。 -
以下の条件に該当するものを除外する:
- 60秒を超えるもの(ショートとして機能はするが、完視率が低下する)、または1080×1920でないもの。
- 無音または音声がクリッピングしているもの(最大音量が-0.5 dBを超える)。
- プラットフォームが抑制するトピック(例:「LSD mirrors」エピソードのような薬物、グラフィックまたは医療コンテンツ)。
- すでに投稿済みのエピソード。
-
内容を確認する。
scripts/contact_sheet.sh <video> <out.jpg>で4秒ごとのフレームを1枚の画像にまとめる。そのシートを読む。 -
残った各エピソードを以下の基準で5点満点で評価する:
- 最初の1秒でフックするか:大きな数字、パラドックス、「もし〜したらどうなるか」。
- 好奇心のギャップ:直感に反する答え。
- 視覚的なドラマ:ブラックホール、銀河、爆発は図表より優れている。
- コメントを誘発するか:自由回答の質問や複数の競合する答え。
- 幅広い魅力:宇宙や人体はニッチなトピックより優れている。
宇宙のパラドックス(ブラックホール、フェルミのパラドックス、スターダスト、ダークマター)は通常、最高得点になる。
-
各エピソードの選定理由を一言添えてユーザーに伝え、その後続行する。ユーザーが選択を依頼した場合を除き、承認を待たない。
2. アップロード用に圧縮する
Chrome拡張機能の file_upload ツールは 3.8 MB を超えるファイルを拒否する。再エンコードされたファイルは、ユーザーが自分でファイルを選択した場合にも保持される。
scripts/compress_for_upload.sh <in.mp4> <out.mp4>
このスクリプトは、-preset slow を指定したCRF 26のx264、96kのAAC、+faststart で実行する。その後、元の動画とのSSIMとサイズを表示する:
- 目標SSIMは少なくとも0.995、視覚的にロスレス。
- ファイルがまだ3.8 MBを超える場合は、
CRF=28で再実行する。
出力はエピソードフォルダ内の upload-ready/ サブフォルダに配置する。元のファイルを上書きしない。
3. カバーを作成する
python3 scripts/make_cover.py --style blackhole \
--kicker "もしも" --headline "落ちたら?" \
--tagline "2つの結末。|どちらも真実。" --out 14-cover.png
python3 scripts/make_cover.py --style galaxy \
--kicker "100,000,000,000の星" --headline "みんなは|どこに?" \
--tagline "宇宙船なし。|信号なし。" --out 12-cover.png
python3 scripts/make_cover.py --style frame --video 05-why-the-sky-is-blue.mp4 --at 12 \
--kicker "なぜ空は" --headline "青いの?" --tagline "海を映して|いるわけじゃない。" --out 05-cover.png
引数の説明:
--headline内の|は改行を挿入する。--tagline内の|はテキストを白の部分とオレンジの部分に分割する。--style frameは、エピソードの焼き込みキャプションの間にあるアートワークを持ち上げる。アートの端にラベルが表示される場合は、--art-top/--art-bottomでバンドを移動する。デフォルトはソースフレームの420ピクセルと1300ピクセル。
各カバーは1080×1920で、すべてのテキストは中央の1080×1350領域内に収まるため、Instagramのグリッドクロップでも保持される。
コピーライティングのルール:
- 見出しは質問または衝撃的な数字。大文字で2〜4単語に抑える。
- キッカーはその設定をする。
- タグラインは、答えを明かさずに結果をほのめかす。
使用前にすべてのカバーを確認する:Readで開く。
4. キャプションを書く
YouTubeのタイトル。 70文字以内に抑え、動画が答える質問として表現し、絵文字と #shorts を追加する。例:What happens if you fall into a black hole? 🕳️ #shorts
説明とInstagramのキャプション。 両方のプラットフォームで同じテンプレートを使用する:
<フックライン:パラドックスまたは大きな数字> <絵文字>
<2文:結果を平易な言葉で>
<コメント誘発質問:「どちらを信じますか?👇」/「どちらのバージョンを体験したいですか?👇」>
Follow (@onlyfactsci on IG) for a new mind-bending science fact every day 🚀
#<トピック> #<トピック2> #space #science #universe #astronomy #spacefacts #shorts|#reels
5. YouTubeショートに投稿する(Chrome上のClaude)
- chrome-browserスキルを読み込む。
tabs_context_mcpを実行し、新しいタブを開く。 https://studio.youtube.com/channel/<CHANNEL_ID>/videos/upload?d=udにアクセスする。チャンネルIDはサインイン後のStudio URLに表示される。- ファイルを添付する:
- まず
find"file-input" を試し、次にデバイスパスを指定してfile_uploadを実行する。 - 既知の制限:
file_uploadは、ユーザーの接続フォルダにあるファイルを拒否することが多い(「このセッションで読み取りが許可されているファイルのみ」)。再試行は1回まで。ユーザーに Select files をクリックしてupload-ready/<file>.mp4を選択するよう依頼する。自分で Select files をクリックしない。ネイティブダイアログが開き、表示できないため。
- まず
- 詳細:
- タイトルフィールド:クリックし、
ctrl+a、その後入力。 - 説明:クリックし、その後入力。
#タグを入力すると候補ドロップダウンが開く。Escapeキーではなく、ダイアログの空の部分をクリックして閉じる。- 視聴者設定:
findで「いいえ、子供向けではありません」を見つけ、scroll_toしてクリックする。 - サムネイル:ユーザーがサムネイルの下の Upload file をクリックし、カバーを選択する。Studioはカスタムショートサムネイルを受け付ける。
- タイトルフィールド:クリックし、
- Next を3回クリックする(動画要素、チェック、公開設定)。公開 を選択し、公開 をクリックする。
- 確認:
/videos/shortを開き、get_page_textを実行する。新しいタイトルに 公開済み と表示されていることを確認する。
6. Instagramリールに投稿する(Chrome上のClaude)
https://www.instagram.com/を開く。「通知をオンにする」は 後で で閉じる。- サイドバーの 作成 をクリックし、投稿 をクリックする。
- ユーザーが Select from computer をクリックし、MP4ファイルを選択する。YouTubeと同じファイル選択の制限あり。
- クロップ手順: Instagramのデフォルトは 1:1 で、動画が正方形にクロップされる。
- プレビューの左下にあるクロップアイコンをクリックし、オリジナル を選択する。
- プレビューが縦長(9:16)であることを確認し、次へ をクリックする。
- 編集手順: ユーザーが「カバー写真」の横にある Select From Computer をクリックし、カバーPNGを選択する。
- カバーが動画と一致していることを確認する。 プレビューを再生し、内容とトリム長(例:フェルミは55秒、ブラックホールは47秒)を比較する。ユーザーは間違ったカバーを選びやすい。
- 次へ をクリックする。
- キャプション手順:
- キャプションボックスをクリックし、キャプションを入力する。
- 末尾にスペースを入れて、ハッシュタグのドロップダウンを閉じる。
- ユーザーから依頼がない限り、「Facebookと共有」はオフのままにする。
- 共有 をクリックする。
findで「新しいリールダイアログヘッダーの共有ボタン」を見つけ、参照でクリックする(座標はダイアログのサイズ変更でずれるため)。 - 「リールが共有されました。」というメッセージが表示されるまで待ち(20〜40秒)、完了 をクリックする。
7. プロフィールとブランディング(依頼があった場合)
python3 scripts/brand_assets.py --outdir <dir>で以下を生成する:onlyscifacts-profile-picture.png:1024²、オレンジのリングを持つブラックホール。onlyscifacts-youtube-banner.png:2560×1440、1546×423の安全領域内にテキスト。
- Instagram:
- 自己紹介:
instagram.com/accounts/edit/、その後 送信。 - 名前:
accountscenter.instagram.com/profiles/、アカウントを選択、名前、その後 完了。14日間に2回しか変更できない。 - 画像:アカウントセンター、プロフィール写真、新しい写真をアップロード。ユーザーがファイルを選択する。
- 自己紹介:
- YouTube:
studio.youtube.com/channel/<ID>/editing/profileにアクセスする。- 説明:入力する。
- 画像:変更。バナー:アップロード。ユーザーが両方のファイルを選択する。
- 公開 をクリックする。
- チャンネル名は14日間に2回しか変更できない。名前を変更する前に確認する。
- 保存する前に、必ず自己紹介と説明テキストをユーザーに表示し、承認を得る。プロフィールの変更は公開される。
ルール
- 投稿は公開され、元に戻すのが難しい。ユーザーが依頼したものだけを投稿する。リクエスト以外の操作(以前の投稿の編集、投稿のアーカイブ、チャンネル名の変更など)は、まず確認する。
- パスワードを絶対に入力しない。サイトがサインインを求める場合は、ユーザーが行う。
- 公開された内容をタイトルと公開状態とともに報告する。ファイル選択など、ユーザーに残された作業があれば言及する。