Communitygithub.com

Hammadbaig-hub/daily-shorts-media

每日自動製作並發佈一支免費的動畫文字「事實/勵志」YouTube Short——挑選新主題、驗證每個事實、用程式碼渲染 1080x1920 影片、託管於 GitHub,並透過 Metricool 排程至 YouTube,英、烏爾都語交替輪播。

daily-shorts-media 是什麼?

此技能實現 YouTube Short 頻道「Bright Life」的完全自動化每日輪播,無需任何預算或 AI 額度。它從 GitHub 獲取歷史與計畫,確定當天語言(英文或烏爾都語)與主題類別,並確保不重複張貼。接著,它使用網路搜尋驗證每個事實,確保來源可靠(如 NASA、國家地理),並在 script.json 中儲存鉤子、事實與行動呼籲。影片透過 Pillow 與 ffmpeg 在 CPU 上渲染,旁白則由離線神經 TTS 模型 Kokoro 生成,避免內容 ID 版權索賠。最終,影片被推送到公共 GitHub 儲存庫,並透過自訂 API 呼叫在 Metricool 上排程發布。此技能貼心地處理錯誤情況,例如 Metricool 拒絕發布或 Git 推送失敗,並在每週日提供分析摘要,協助優化內容策略。它支援英文與烏爾都語,確保事實準確性,並透過精心設計的標題與描述提升影片表現。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Hammadbaig-hub/daily-shorts-media/tree/HEAD/tools

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

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 進行渲染,使當日影片仍能發布(僅音樂),並在報告中提及。

相關技能