TechMoon 科技月球
WordPress、SEO 與 AI 工具實測指南
TechMoon 科技月球
WordPress、SEO 與 AI 工具實測指南

一套每天 23:30 UTC 自動把 Hacker News 前十大熱文轉成中文語音的開源 AI 播客管線,用 Cloudflare Workers 排程、OpenAI 相容模型摘要、Edge TTS 合音、瀏覽器算圖接音檔,以 AGPL-3.0 釋出。訂閱 RSS 就能收聽,想自架則要扛 AGPL 義務、BYOK 金鑰與 Cloudflare 帳號足跡。
用 AI 摘要這篇文章:
Agili 的 Hacker Podcast 是一套會每天自己跑的 AI 中文播客系統:到了世界協調時間 23:30,一個 Cloudflare Worker 排程啟動,抓回 Hacker News 當天的熱門文章,交給 OpenAI 相容的語言模型寫成中文摘要,再透過 Edge TTS 把摘要念成語音,最後把音檔接起來、推上 RSS 與網站。整個專案以 AGPL-3.0 授權開源在 GitHub(帳號 miantiao-me、倉庫 hacker-podcast),所以你面前的選擇其實有兩條:把 Agili 經營的這個頻道當成一個一般的中文科技播客訂閱收聽,或把整套產製邏輯 clone 下來、換成你自己關心的訊息來源,做一個屬於你自己的 AI 播客。下面把這套管線實際怎麼跑、訂閱與自架各自要付什麼代價,一次講清楚。

README 寫的是工作流程圖,但走進原始碼會看到更具體的步驟。worker/wrangler.jsonc 設了一個 cron 觸發器 30 23 * * *,也就是每天世界協調時間 23:30(台灣時間早上 07:30)由 Cloudflare Workers 喚醒一支叫做 HACKER_PODCAST_WORKFLOW 的 Cloudflare Workflow。雲端排程觸發自動任務的這個模式,跟本站之前介紹過的 movecar-cloudflare-workers-car-notifier 是同一類架構,差別在這裡跑的是一條會產出成品的內容產製線。
這裡用 Cloudflare Workflow 而不是一支普通的定時腳本,是有原因的。Workflow 把整個產製過程拆成一段段有編號的 step,每個 step 失敗會指數退避重試五次、單一步驟上限三分鐘,成功與失敗都會被 Cloudflare 記錄下來。換成傳統 cron 加一支 shell 腳本,任何一環斷掉(API 限流、TTS 超時、網路抖動)整集就報廢;Workflow 的設計讓某一則故事抓不到、或某段 TTS 失敗,可以單獨重試,不必整集重跑。這是這類每日自動內容產製能撐得久的關鍵工程選擇。
抓到 Hacker News 的熱門故事清單後,管線在正式環境只會挑前十大則(開發模式只取一則,方便除錯),這個上限寫死在 workflow/index.ts 的 Math.min(topStories.length, isDev ? 1 : 10)。每則故事會先被丟進 LLM 產生中文摘要、包進 <story> 標籤,然後 step.sleep 暫停一下再處理下一則(暫停長度是可調的 context 變數,用意是避免接連打爆 LLM 的速率限制)。每集固定十則這個數字,是原始碼給的答案,README 沒寫;HN 首頁通常有三十則以上熱文,這個上限等於是一個硬性編輯選擇,把其餘二十則排除在當天節目外。
摘要這段還藏了一個值得知道的設計。workflow/index.ts 從 workflow/prompt.ts 匯入了四種不同的提示詞:introPrompt、summarizeStoryPrompt、summarizeBlogPrompt、summarizePodcastPrompt。也就是管線會依照內容類型(一般故事、部落格文章、甚至是別的播客內容)切換摘要策略,最後再用 introPrompt 把當天所有 <story> 串成這一集的開場與主線。這也是為什麼前面提到每集標題會有一條把十則新聞串起來的主題,而不是十段各自獨立的摘要。收集完所有摘要之後,才進入語音合成與音檔合併階段。
語音合成這段,workflow/tts/ 目錄顯示專案同時實作了好幾個後端:Edge TTS、MiniMax、Murf、Volcengine Ark、unspeech,以及一個叫 mimo 的選項。從 package.json 的 @echristian/edge-tts 依賴,加上近期 commit 提到的男聲白樺、女聲溫暖阿胡來判斷,預設用的是微軟 Edge TTS。這也是這條每天跑的管線不需要付 TTS 月費就能維持的關鍵,想理解 AI 語音合成能做到什麼地步的讀者,可以對照本站的 voice-pro-ai-dubbing 整理。
音檔合併這一步比較特別。README 說合併多段音訊需要 Cloudflare 的瀏覽器呈現功能(binding 名稱是 BROWSER,對應 package.json 的 @cloudflare/puppeteer),也就是實際上是在雲端開一個無頭瀏覽器來做音檔接合,而不是用一般的 ffmpeg 之類的媒體庫。代價是本地端開發時這一步跑不起來,得部署到 Cloudflare 遠端除錯。最後產出的音檔與文字稿會進 Cloudflare R2 bucket(名稱 hacker-podcast)與 KV namespace,再透過 vinext 框架(Vite 加上 React Server Components)架設的網站與 RSS feed 對外發布。整套產製鏈從抓稿、摘要、配音、合併到發布,幾乎全在 Cloudflare 的邊緣運算上跑完。
訂閱這個頻道不一定要進網站。RSS feed(hacker-podcast.agi.li/rss.xml)本身就是最即時的來源,發布時間幾乎是每日一更。除了 RSS,README 列出的訂閱管道還包含 Apple Podcasts、YouTube、小宇宙與 Spotify。不想綁訂閱器的讀者也可以直接在網站上線聽,網頁用了 @vidstack/react 這套網頁播放器元件,每集都配有波形顯示與播放控制。對 RSS 工具鏈有興趣的讀者,本站另有 feedcraft-rss-middleware 介紹可以接著玩的訂閱層中介軟體。

每集內容長什麼樣,從網站上的近期標題可以判斷。以 RSS 上近期的一集為例,會把當天十則熱文融成一段主題式導讀:從微軟內部資料打臉 AI 寫程式的效率神話(450 名工程師裡,寫程式只占 14% 的時間),聊到極簡框架 Pi 用不到 1000 token 上下文做到更低成本、MCP 2.0 簡化 AI 呼叫工具的流程、DuckDB 讓筆電兩分鐘載入 50GB CSV。主題橫跨 AI 工程、開發者工具、資料庫與開源專案,標題與摘要的語氣明顯經過 LLM 重新組織,讀起來不像生硬的機器翻譯,反而像有人在幫你把當天 HN 上最值得看的東西串成一個故事。
這裡有個值得先知道的細節:網站首頁的「最近更新」節目列表會凍結在上一次部署時的集數,但 RSS feed 仍然每日推新。兩者會出現明顯的時間落差,想確認頻道還活著、有沒有新集,看 RSS 比看網站首頁準。
clone 這份專案之前,有幾項代價得先算進去。
授權義務是最先碰到的門檻。 專案的 LICENSE 是 AGPL-3.0,這比常見的 MIT 或 Apache 都嚴格:任何人把這份程式碼修改後、部署成讓別人透過網路使用的服務(例如你自己架一個播客網站讓大家訂閱),都必須把修改後的原始碼公開給使用者。換句話說,AGPL 不允許悄悄改幾行就拿去商用閉源。這對個人玩家無感,但對想把這套管線包進自家產品的公司是硬門檻。
語言模型採 BYOK(自備金鑰)。 README 的 worker/.env.local 範例列了三個必要變數:OPENAI_API_KEY、OPENAI_BASE_URL、OPENAI_MODEL(預設 gpt-4.1)。語言模型這段成本要自負,但因為底層用的是 OpenAI 相容協定(package.json 裡的 @ai-sdk/openai-compatible),所以可以把 base URL 換成任何相容端點,例如自架的推理伺服器或單價更低的供應商,不必綁 OpenAI 官方計價。要注意的是網站與 Worker 用的是兩份不同的環境變數檔:網頁端的 .env.local 管 NEXT_STATIC_HOST 這類前端變數,Worker 端的 worker/.env.local 才是金鑰與模型設定,部署時要用 wrangler secret put 分別寫進兩邊。
Cloudflare 帳號足跡。 自架需要一個 Cloudflare 帳號,並設定 R2 bucket、KV namespace、Workers 與瀏覽器呈現功能。這些都有免費額度,每天跑一集播客的用量大概落在免費層邊緣,但 Browser Rendering 與 R2 累積存放的音檔會隨時間長大,超過免費額度後會開始計費。wrangler.jsonc 看得到這些 binding 的實際名稱(HACKER_PODCAST_R2、HACKER_PODCAST_KV、BROWSER、HACKER_PODCAST_WORKFLOW),照著建資源就行。
TTS 與 LLM 都可替換。 前面提到的那幾個 TTS 後端意味著,如果你不想用 Edge TTS 的固定幾個中文聲音,可以改接 MiniMax、Murf 或 Volcengine Ark(部分是付費),也可以在程式碼裡加一個新的 provider。LLM 同理,只要對方提供 OpenAI 相容的端點就能接。
開發與手動觸發。 README 列出的指令看得出這是 pnpm 工作區:pnpm dev:worker 跑 Worker 與 Workflow 開發流程,想手動觸發一集產製不用等每天 23:30,直接 curl -X POST http://localhost:8787 就能喚醒;網頁端則是 pnpm dev。正式部署前 README 提醒要把 wrangler.jsonc 裡 workflows 相關設定先註解掉再開 worker,否則會踩到繫結衝突。
有幾項限制不是 bug,但先講清楚對讀者比較有利。
不是 Hacker News 官方出品。 README 的免責聲明寫得很清楚:本專案與 Hacker News、Y Combinator 沒有任何關係,「Hacker News」是 Y Combinator 的註冊商標。它只是一個拿 HN 公開資料當訊號源的第三方自動產製專案,別把它當成 HN 官方中文版。
網站的社群分享預覽圖是壞的。 hacker-podcast.agi.li 首頁的 og:image 與 twitter:image 中繼標籤,指向的是 http://localhost:3000/opengraph-image.png 這個本地開發位址。也就是說,把網站連結貼到會讀 Open Graph 的平台(例如 Facebook、X、LINE)時,預覽圖會載不到。訂閱本身不受影響,因為 RSS 不走這組中繼資料,但這個瑕疵會影響你想在社群分享單集連結時的呈現。這也反映出專案主力是作者自用再順手開源,社交分享的打磨排在後面。
音檔合併只能在雲端跑。 本地端跑 workflow 時 TTS 還過得去,但合併多段音訊需要 Cloudflare 的瀏覽器呈現功能,所以開發除錯得反覆部署到遠端。README 也提醒 Edge TTS 在本地端偶爾會卡住,建議除錯時先把這段註解掉,這也是為什麼開發體驗不算友善。
GitHub 活躍度。 倉庫目前是 2569 顆星、240 個 fork、僅 1 個開啟的 issue,建立於 2025 年 2 月,最近一次 commit 落在 2026 年 7 月中。星數對一個單人維護的專案來說相當突出,不過星數不等於維護承諾,想長期依賴的話自己盯 commit 與 issue 比較實際。
這裡值得拉高一個層級看。Agili 的 Hacker Podcast 把 AI 播客自動產製的整條鏈公開出來,本身就是一個可複製的範本:抓稿、摘要、TTS、發布四段都模組化得很清楚。這個開放性是它的價值所在,但同一個架構指向不同的訊號源,命運會差很多。
Agili 指向的是 Hacker News,一個長期有高品質技術討論的社群,加上每集只取前十則的編輯上限,等於是在 AI 自動產製外面再包一層「靠 HN 社群投票幫你先過濾」的人工編輯選擇。這讓它比較接近一個自動化的編採工具,而不是純 AI 內容農場。但同一套管線如果指向低品質訊號源、又把每集數量上限拉高,就會變成典型的 programmatic SEO 量產機,剛好踩在 Google 垃圾內容政策(spam policy)與 E-E-A-T(經驗、專業、權威、信任)評估的紅線上:搜尋引擎會把大量自動產製、缺乏真實經驗與編輯判斷的內容判定為低價值。clone 的人要自己決定指向哪裡、怎麼挑稿,這個選擇會決定產出是值得聽的播客,還是搜尋引擎會懲罰的垃圾。這條界線專案本身沒有幫你畫,是使用者的責任。
如果你的需求只是「每天有個中文聲音幫我導讀 Hacker News」,把 Agili 的 RSS 訂到你的播客 App 就夠了,不需要碰程式碼。這個情境下你要接受的只有一件事:訊息來源是 Hacker News,Agili 幫你選哪十則、怎麼下標,你沒有控制權。
如果你想做的事是「用同一套自動產製邏輯,做成你自己的播客」(例如把訊息來源換成另一個社群、另一個語言的內容,或公司內部的技術週報),那這份開源專案的價值就很高。要替換哪一段都有明確的切入點:workflow/utils.ts 抓稿、workflow/prompt.ts 改摘要風格、workflow/tts/ 換聲音、網頁與 RSS 端改版面。這條路要扛 AGPL 的原始碼義務、自備 LLM 金鑰,以及 Cloudflare 的帳號與設定工作,還要自己為「指向什麼訊號源」負編輯責任。
第一步很具體:訂閱派直接把 https://hacker-podcast.agi.li/rss.xml 貼進你的播客 App 就能收聽;clone 派則從 README 的本地開發段落開始,先準備好 Cloudflare 帳號與 OpenAI 相容金鑰,再照 wrangler.jsonc 的 binding 名稱建好資源。就算你最後決定不自架,把這份原始碼當成「一個人在 Cloudflare 邊緣運算上跑每日 AI 內容產製線」的完整範本來讀,也已經值回票價。