YouTube Daily Shorts
1日1本、完全自動、コストゼロ。このチャンネルは「知ってた?」形式の豆知識と短いモチベーション動画を投稿します。英語の日とウルドゥー語の日が交互に来ます。
固定設定(ユーザーが変更した場合はここを変更)
| 設定 | 値 |
|---|---|
| GitHubメディアリポジトリ | Hammadbaig-hub/daily-shorts-media(公開、ブランチ main)— tools/ にレンダリングツールも格納 |
| Metricoolブランド(blogId) | 7592220、タイムゾーン Asia/Karachi |
| チャンネル | 「Bright Life」、ハンドル @Bright-Life-m4(script.jsonに記載。CTAでは「Bright Life」と記載) |
| 公開時間 | パキスタン時間19:00(既に過ぎている場合は次の空きスロット。現時点から少なくとも15分後) |
| 公開設定 | 公開(ユーザーが完全自動アップロードを選択) |
この構成の理由
- 無料: ユーザーに予算がないため、動画はPillow + ffmpegで描画(リポジトリ内
tools/scripts/make_short.py)、音楽も同じスクリプトで合成。これによりContent ID著作権クレームも発生しません。 - ナレーション: ナレーションにはKokoroを使用。これはオフラインでCPU上で動作する小さな無料ニューラルTTSモデルです(
tools/scripts/voice.py)。その約350MBのモデルファイルは、GitHubリリースから一度~/ttsにダウンロードされます。英語はam_michael、ウルドゥー語はウルドゥー文字テキストからヒンディー語音声hm_omegaが話します(いくつかの音素を再マッピング)。各スライドの長さはナレーションに合わせ、音楽はその下にダックされます。クラウドTTS(Microsoft/Google)はワークスペースからブロックされているため、オフラインで行います。 - GitHubホスティング: Metricoolは公開ビデオURLを必要とします。クラウドワークスペースはGitHubにプッシュでき、rawファイルURLは公開されるため、これが橋渡しとなります。
- 事実確認: 豆知識チャンネルは正確性で成否が決まります。YouTubeは大量生産された低価値または誤解を招くコンテンツを抑制し、間違った「豆知識」は低評価と修正コメントを招きます。すべての事実は使用前に検証されます。これが実際に価値を付加する仕事の部分です。
日次ワークフロー
1. リポジトリを取得してその日を計画
cd ~ && (git -C daily-shorts-media pull -q || git clone https://github.com/Hammadbaig-hub/daily-shorts-media.git)
pip install -q --break-system-packages kokoro-onnx soundfile pillow numpy
python daily-shorts-media/tools/scripts/plan_today.py daily-shorts-media/history.json
リポジトリがセッションにない場合は、最初に add_repo でアタッチ(オーナー Hammadbaig-hub、リポジトリ daily-shorts-media、アクセス push)してクローンします。
plan_today.py は、その日の lang、theme、既にその日に動画が投稿されたかどうか、そしてこれまでに使用されたすべてのトピックを返します。posted_today が true の場合は停止してそれを報告します。決して1日に2回投稿しないでください。
2. トピックを選ぶ
チャンネルに変化を持たせるため、カテゴリをローテーションします:宇宙、動物、人体、歴史、地理、科学、テクノロジー、食べ物、海洋、発明、言語。そして約5日に1回はモチベーション作品(実際の研究や十分に文書化された実話に基づく教訓や習慣)。already_done に含まれておらず、それと重複しないものを選びます。
以下は避けてください:医療や食事のアドバイス、政治、宗派や宗教の議論、実際の私人に関するもの、そしてよく繰り返される誤った「豆知識」(例:金魚の3秒記憶、万里の長城が宇宙から見えるなど)。
3. スクリプトを書き、検証する
フック(12語以内、好奇心を刺激)、3~5個の豆知識(それぞれ1文、25語以内)、CTAを書きます。
すべての豆知識について、WebSearchを実行し、信頼できる情報源(NASA、ナショナルジオグラフィック、ブリタニカ、大学、査読付き研究、主要な百科事典)から確認します。確認できない、または情報源が一致しない豆知識は破棄し、別のものを使います。ソースURLは保持します。動画の説明に含めます。
ウルドゥー語の日:自然でシンプルなウルドゥー語をウルドゥー文字(ローマ字ウルドゥーではなく)で書きます。パキスタン人の視聴者が話すような言葉で、単なる逐語訳ではありません。数字はウルドゥー語の単語(بیس فیصد、ہزاروں)で書き、音声が正しく発音できるようにします。
CTAの例 — 英語:「Follow Bright Life for a new fact every day」、ウルドゥー語:「روزانہ نئے حقائق کے لیے برائٹ لائف کو فالو کریں」。
script.json として保存:
{"lang": "en", "hook": "...", "facts": ["...", "..."], "cta": "...",
"handle": "@Bright-Life-m4", "theme": 2}
4. レンダリング
python daily-shorts-media/tools/scripts/make_short.py script.json daily-shorts-media/videos/<date>-<slug>.mp4 > render.log 2>&1
レンダリングにはCPUで約5分かかるため、Bash run_in_background で実行し、完了通知を待ちます。pgrep -f make_short のループで待たないでください。自身のコマンドラインと一致してしまい、永遠に終わりません。長さはナレーションに従います — 通常、3〜5個の豆知識で25〜45秒。55秒以内に収めてShortにします。豆知識が長い場合は、5個ではなく3個にします。
テキストは話されるため、聞くために書きます:厄介な記号は綴ります(英語では「%」ではなく「percent」、ウルドゥー語では「فیصد」)、括弧や略語は避け、文を短くして音声が急がないようにします。その後、1フレームを取得してReadでテキストのオーバーフローやウルドゥー語の崩れを確認します:
ffmpeg -loglevel error -y -ss 5.5 -i <video> -frames:v 1 check.png
テキストが端からはみ出したり、見た目がおかしい場合は、その行を短くして再レンダリングします。
5. GitHubにプッシュ
今日のエントリを history.json に追加:
{"date": "...", "lang": "...", "theme": n, "topic": "...", "title": "...", "file": "videos/...mp4"}
videos/ 内の最新の .mp4 ファイルのみ20個保持(古いものは削除 — 既にYouTubeにあるため)。リポジトリを小さく保ちます。その後:
cd daily-shorts-media && git add -A && git commit -qm "Short <date>: <topic>" && git push -q
公開URL:https://raw.githubusercontent.com/Hammadbaig-hub/daily-shorts-media/main/videos/<file>.mp4
スケジュール設定の前に200が返ることを確認(curl -sI <url> | head -1)。ワークスペースがそのホストに到達できない場合は、プッシュが成功したと信じて続行します。
6. Metricool経由でYouTubeにスケジュール
createScheduledPost を呼び出し、blogId 7592220、トップレベルの date(YYYY-MM-DDT19:00:00+05:00 — これがないと呼び出しが失敗します)、および以下の info JSON を指定します(Metricoolはビデオを自身のストレージにコピーするため、GitHubファイルは後で削除可能):
{
"providers": [{"network": "youtube"}],
"text": "<description>",
"media": ["<raw GitHub URL>"],
"publicationDate": {"dateTime": "YYYY-MM-DDT19:00:00", "timezone": "Asia/Karachi"},
"autoPublish": true,
"draft": false,
"descendants": [], "firstCommentText": "", "hasNotReadNotes": false,
"mediaAltText": [], "shortener": false, "smartLinkData": {"ids": []},
"youtubeData": {
"title": "<title>",
"type": "short",
"privacy": "public",
"tags": ["facts", "did you know", "..."],
"category": "EDUCATION",
"madeForKids": false,
"isAiGeneratedContent": false
}
}
isAiGeneratedContent は false です。なぜなら動画は単純なアニメーションテキストであり、リアルな合成映像ではないからです。YouTubeの開示は現実的な改変メディアを対象としています。将来のバージョンでAI生成のリアルなビジュアルや音声が追加された場合は、true に設定します。
タイトル: 70文字未満、好奇心をそそるフック + #shorts。その日の言語で書きます。例:Your Brain Can't Feel Pain?! 🧠 #shorts
説明: 2~3行でフックを展開し、次に Sources: と検証したURL、最後に3~5個のハッシュタグ(#facts #didyouknow #shorts とトピックタグ。ウルドゥー語の日は #urdu #urdufacts を追加)。
7. 報告
ユーザーにローマ字ウルドゥー語で数行で伝えます:トピック、言語、タイトル、スケジュール時刻、Metricoolの plannerUrl。スケジュールタスクとして実行中で誰も見ていない場合は、その概要をSendUserMessageで送信します。
週次チェック(日曜日、または「channel kaisa chal raha hai」と聞かれたとき)
YouTubeネットワークの過去7日間のデータ(視聴回数、再生時間、獲得登録者数、トップ動画)を取得するには、getAnalyticsDataByMetrics を使用します。どのカテゴリと言語がより多くの視聴回数を得たかをまとめ、その情報を次の週のトピック選択に活用します。ユーザーが別途指示しない限り、言語の交互設定を維持します。
何かが失敗した場合
- Metricoolが投稿を拒否: 正確なエラーを報告。同じ入力で再試行しない。よくある原因:トップレベルの
dateがない、動画URLがまだ到達可能でない(1分待ってから1回再試行)、またはMetricoolのYouTube接続が期限切れ(ユーザーがMetricoolで再接続する必要がある)。 - Gitプッシュ失敗: リポジトリがプッシュアクセスでアタッチされていない —
add_repoをaccess: pushで呼び出す。それでもClaudeにGitHubアクセスがないと言われる場合、Claude GitHubアプリがdaily-shorts-mediaを選択されたリポジトリに含める必要がある(github.com/settings/installations → Claude → Configure)。ユーザー自身がこの手順を確認します。GitHubが2FAを要求するためです。 - フォントがない: リポジトリの
tools/assets/fonts/にあります。スクリプトはそこから読み取ります。 - 音声モデルのダウンロード失敗: script.json で `