YouTube 每日 Shorts
每日一支 Short,全自動,零成本。頻道發布「你知道嗎?」風格的事實與短篇勵志內容,一天英文、一天烏爾都語。
固定設定(使用者更改時請在此處修改)
| 設定 | 值 |
|---|---|
| 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)繪製,音樂在同一腳本中合成,這也避免內容 ID 版權索賠。 - 旁白: 旁白來自 Kokoro,一個可在 CPU 上離線運行的小型免費神經 TTS 模型(
tools/scripts/voice.py)。其約 350 MB 的模型檔案會從 GitHub 發布一次性下載至~/tts。英文使用am_michael;烏爾都語由印地語語音hm_omega根據烏爾都語文字朗讀,並重新映射少數音素。每個投影片持續時間與其旁白相同,音樂在旁白時降低音量。雲端 TTS(Microsoft/Google)已從工作區封鎖,因此使用離線方案。 - GitHub 託管: Metricool 需要公開的影片 URL。雲端工作區可以推送到 GitHub,而原始檔案 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,則停止並回報——絕不在一天內發布兩次。
2. 挑選主題
在類別間輪替,以保持頻道多樣性:太空、動物、人體、歷史、地理、科學、科技、食物、海洋、發明、語言,大約每五天有一天是勵志內容(以真實研究或經過充分考證的真實故事為基礎的教訓或習慣),挑選尚未出現在 already_done 且非其近乎重複的主題。
避開:醫療或飲食建議、政治、宗派或宗教辯論、任何關於真實私人人物的事項,以及常被重複的迷思「事實」(例如金魚三秒記憶、萬里長城從太空可見)。
3. 編寫腳本並驗證
撰寫鉤子(12 字以內,激發好奇心)、3–5 個事實(每個一句話,25 字以內)以及行動呼籲 (CTA)。
對於每個事實,執行網路搜尋並從可靠來源(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/<日期>-<代號>.mp4 > render.log 2>&1
渲染在 CPU 上約需 5 分鐘,因此使用 Bash run_in_background 執行並等待完成通知。不要使用 pgrep -f make_short 迴圈等待——它會匹配自己的指令行而永遠不會結束。片長由旁白長度決定——通常 3–5 個事實為 25–45 秒。保持在 55 秒以下以確保是 Short:如果事實太長,則使用 3 個而非 5 個。
文字是為了「聽」而寫,因此拼寫出尷尬的符號(英文用 "percent",而非 "%";烏爾都語用 "فیصد"),避免括號與縮寫,並保持句子簡短,以免語音速度過快。然後擷取一幀並使用 Read 來檢查文字溢出或烏爾都語斷裂:
ffmpeg -loglevel error -y -ss 5.5 -i <影片> -frames:v 1 check.png
若文字超出邊緣或顯示有誤,請縮短該行並重新渲染。
5. 推送到 GitHub
將今天的條目附加到 history.json:
{"date": "...", "lang": "...", "theme": n, "topic": "...", "title": "...", "file": "videos/...mp4"}
只保留 videos/ 中最新的 20 個 .mp4 檔案(刪除較舊的——它們已在 YouTube 上),以保持儲存庫小巧。然後:
cd daily-shorts-media && git add -A && git commit -qm "Short <日期>: <主題>" && git push -q
公開 URL:https://raw.githubusercontent.com/Hammadbaig-hub/daily-shorts-media/main/videos/<檔案>.mp4
在排程前檢查是否回傳 200(curl -sI <url> | head -1);若工作區無法連線至該主機,則信任成功的推送並繼續。
6. 透過 Metricool 排程至 YouTube
使用 blogId 7592220、頂層 date(YYYY-MM-DDT19:00:00+05:00——缺少此項則呼叫失敗)以及以下 info JSON 呼叫 createScheduledPost(Metricool 會將影片複製到其自有儲存空間,因此後續可清理 GitHub 檔案):
{
"providers": [{"network": "youtube"}],
"text": "<說明>",
"media": ["<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": "<標題>",
"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」時)
使用 getAnalyticsDataByMetrics 取得 YouTube 網路過去 7 天的資料(觀看次數、觀看時間、新增訂閱者、熱門影片)。摘要哪些內容表現良好——哪些類別與語言獲得更多觀看——並據此調整下週的主題選擇方向。除非使用者另有指示,否則保持語言交替。
遇錯處理
- Metricool 拒絕發布: 回報確切錯誤;不要重試相同輸入。常見原因:缺少頂層
date、影片 URL 尚不可存取(等待一分鐘,重試一次),或 Metricool 中的 YouTube 連線已過期(使用者須在 Metricool 中重新連線)。 - Git 推送失敗: 儲存庫未以推送權限附加——請使用
access: push呼叫add_repo。若仍顯示 Claude 沒有 GitHub 存取權,則 Claude GitHub 應用程式必須在其選定儲存庫中包含daily-shorts-media(github.com/settings/installations → Claude → Configure);該步驟需使用者自行確認,因為 GitHub 要求雙因素驗證。 - 字型缺失: 它們位於儲存庫的
tools/assets/fonts/中;腳本會從那裡讀取。 - 語音模型下載失敗: 在 script.json 中設定
"voice": false進行渲染,使當日影片仍能發布(僅音樂),並在報告中提及。