Skip to main content
台北夜景中的本機 AI 直播工作站,螢幕呈現連續生成影片、節點工作流與 RTX 顯示卡

一張 RTX 5090 跑起 Infinite TV:本機 LTX 2.5、連續 I2V 與 Twitch 即時互動

葛如鈞
(最後更新於 )
一張 RTX 5090 跑起 Infinite TV:本機 LTX 2.5、連續 I2V 與 Twitch 即時互動

我把 Infinite TV 搬到 Windows + RTX 5090 的第一版,只解決了「能不能跑」與「能不能更快」。真正讓它變成一個可以長時間直播的系統,還得處理另一組更難的問題:段落怎麼無縫接續、壞畫面怎麼不污染下一段、Twitch 留言怎麼真的在觀眾端準時出現,以及怎麼確認影片運算沒有偷偷走雲端。

現在的成果是:影片由單張 RTX 5090 在本機透過 ComfyUI + LTX 2.5 NVFP4 生成,第二段以後全部採 Image-to-Video,Twitch 串流穩定維持 9 FPS。畫面與劇情已能延續;段落交界仍偶爾有輕微動作跳動,這是下一輪要優化的地方。

重要校正: 開發途中,我們確實曾測試 fal.ai 的 LTX 2.3 與 H3 Max 雲端影片路徑;prompt/vision 也曾因為機器上存在 FAL_KEY,被程式優先送到 fal 的 OpenRouter proxy。那段會產生 fal.ai 費用,不能稱為「全本機」。本文已把歷史測試與最終本機架構分開說明;目前本機啟動腳本會強制關閉 fal prompt 與影片路由。

Infinite TV 在做什麼?

它是一個永不結束的生成迴圈:

  1. 讀取 Twitch 聊天室留言;
  2. LLM 根據留言、目前畫面與劇情歷史決定下一個動作;
  3. 影片模型生成下一段;
  4. 留言或 prompt 燒進送流用畫格;
  5. FFmpeg 經 RTMP 推到 Twitch;
  6. 把上一段實際送出的最後一格,交給下一段 Image-to-Video。

最後一步看似簡單,卻是整個系統最容易逐段崩壞的地方。

這段旅程,其實有三個不同階段

第一階段:把 Linux 專案搬到 Windows

原版用 Unix FIFO 把音訊送進 FFmpeg;Windows 沒有 mkfifo。我們改成 Win32 Named Pipes,並處理模型路徑、UTF-8 主控台與模型預載等跨平台問題。

早期本機 LTX 2.3 基準大約是每段 248 秒。減少幀數與去噪步數後降到約 150 秒;更早的一組 torch.compile 實驗曾測到約 35 秒。

這裡也要補一個技術校正:後續換到較新的 PyTorch / triton-windows 組合,在完整 LTX 2.3 transformer 上遇到 Triton kernel group cache 檔案錯誤。也就是說,「35 秒」是歷史實驗結果,不是現在推薦大家照抄的穩定 Windows 配方。合成小模型能 compile,不代表真實 13B/22B 工作負載也能。

第二階段:用過雲端,但那不是最終答案

為了讓直播先動起來,我們測過 fal.ai 的 LTX 與 H3 Max。速度快、串接方便,但會依影片秒數計費。更麻煩的是,當時 prompt generator 看到 FAL_KEY 就把文字與視覺理解優先走 fal → OpenRouter,所以即使影片後來回到本機,fal 帳戶仍可能持續扣款。

最後做了兩層修正:

  • USE_FAL_OPENROUTER=false:prompt/vision 預設直接走 OpenAI gpt-4o-mini,或自架的 OpenAI-compatible endpoint;
  • ENABLE_FAL_VIDEO=false:即使 .env 裡有 FAL_KEY,也不能呼叫 billable cloud video。只有同時明確開啟開關並選擇雲端 model id 才會送出請求。

憑證的存在,不應該等同於允許花錢。這是這次最值得留下來的工程規則之一。

第三階段:ComfyUI + LTX 2.5 NVFP4 在 5090 上跑通

真正的突破不是繼續硬拚原生 Python pipeline,而是讓 ComfyUI 持有 5090 上的 LTX 2.5 NVFP4 模型,Infinite TV 透過本機 HTTP API 送出 workflow、收回畫格,再把串流、留言、劇情與容錯留在原本的 Python engine。

這樣的拆法有幾個好處:

  • ComfyUI 負責顯示卡、模型與 LTX 節點;
  • Infinite TV 不必在自己的 venv 再載一份 22B 模型;
  • 影片資料只在本機 127.0.0.1 與檔案系統流動;
  • 若要換 workflow,只改 bridge,不必重寫 Twitch / RTMP 系統。

實測速度

測試條件:RTX 5090 32 GB、Windows、LTX 2.5 distilled NVFP4、512×288、每段要求 121 幀。

指標實測結果說明
ComfyUI bridge 單段約 5.1–7.1 秒受是否含音訊與輸出讀取影響
完整直播 cycle平均 13.53 秒最近 29 段,包含 LLM、生成與 queue backpressure
每段串流內容121 幀 / 13.44 秒以 9 FPS 播放
Twitch RTMP8.9–9.0 / 9 FPS長跑維持目標速率
一次線上快照90 段、10,948 幀0 dropped、0 rejected、queue 9.4 秒
自動測試14 / 14 通過接縫、padding、邊框、救援、queue、字幕

去噪 kernel 跑多快固然重要,但對直播來說,更誠實的數字是「從這一段開始到下一段開始」的完整週期。

本機 LTX 2.5 Image-to-Video 範例。這是開發素材,不是 fal.ai 輸出。

本機 I2V 短片的前、中、後畫格,角色、黑貓與台北場景維持連續

畫面連續:不能只做「拿最後一格接下一段」

1. 第二段開始,一律明確走 I2V

每一段都取「上一段實際送進 RTMP 的最後一個乾淨畫格」當作下一段 LTXVAddGuide 的 frame 0。若影片被品質閘門拒絕,或 RTMP 沒完整收下 121 幀,畫面 handoff 與劇情歷史都不會前進。

這是一個 transaction:觀眾沒看到,就不能算故事已經發生。

2. 121 幀要求,實際解出 129 幀

ComfyUI workflow 對 121 幀要求會解碼出 129 幀;最後 8 幀是 temporal padding,尾端品質容易塌掉。舊流程把第 129 幀拿去接下一段,誤差就會自回歸放大成高飽和線條、白邊、彩虹邊或黑框。

現在只播第 1–121 幀,第 122–129 幀一律丟棄。只有第 121 幀能成為下一段起點。

3. 首幀 conditioning 不等於首幀像素相同

VAE encode/decode 仍會微調第一格,所以新段第一個送流畫格會被強制替換成上一段已提交的尾格。這解決了畫面切點,但沒有完整傳遞「速度」與「動態模糊」。因此,目前仍可能看到輕微 motion jump——像素已經接緊,動量還沒有。

下一步應該研究 overlap-aware generation、optical flow 接縫評分或 motion-state conditioning,而不是只做 crossfade;單純淡化會讓接縫看似柔和,卻可能製造殘影。

長鏈生成的白邊、彩虹框與黑框

逐像素檢查後,所有 handoff 都是 512×288,沒有多一兩個白色或黑色 pixel。真正原因是輸入圖裡的暗角、窗框、螢幕框等「框狀語意」,被長鏈 I2V 當成場景的一部分,每一代再放大一次。

目前的處理順序是:

  1. negative prompt 抑制 frame、vignette、letterbox、black/white bars 與 rainbow edges;
  2. 偵測明確框體;
  3. 先嘗試 12%、16%、20% 的漸進 full-bleed crop;
  4. 第一格仍保留 exact pixels,後續畫格才平滑推近;
  5. 連續兩次仍失敗,就插入本機合成的 push-in recovery segment;
  6. recovery 不推進劇情,下一段仍執行原本的故事意圖。

這保留了原版 Infinite TV 的核心精神:輸出不能斷糧;但不再無條件把壞畫面餵回下一代。

為什麼 Twitch 留言曾經「有收到、畫面卻沒出現」?

listener 與字幕 renderer 其實都有工作。真正原因是 RTMP queue 曾累積 1,922 幀、約 213.6 秒。留言已經燒在正確片段上,只是排在三分多鐘的舊畫面後面。

修正後:

  • queue backpressure 目標 18 秒;
  • 重啟後實際維持約 8–10 秒;
  • 選中的 Twitch 留言顯示約該段 85% 時間;
  • 繁中文字會做像素級 overlay verification;
  • 字幕只燒在送流 copy,乾淨尾格繼續餵 I2V。

這再次提醒我:系統 log 說「留言已採用」,不代表觀眾已經看到。互動延遲要從 viewer path 量測。

如何復現?

完整步驟與模型檔案位置已整理在 dAAAb/infinite-tv README。核心流程是:

  1. 安裝最新版 ComfyUI 與 LTXV 節點;
  2. 放入 LTX 2.5 NVFP4 transformer、Gemma 4 text encoder 與 video VAE;
  3. .env 設定 COMFY_SERVER=127.0.0.1:8188COMFYUI_DIR
  4. 保持 USE_FAL_OPENROUTER=falseENABLE_FAL_VIDEO=false
  5. 啟動 ComfyUI、Infinite TV backend 與 dashboard;
  6. scripts/start-ltx25-stream.py --image ... --output-mode rtmp 開播;
  7. 執行 pytest -q,並同時監看 generation count、RTMP FPS 與 queue seconds。

API key 與 Twitch stream key 只放在 gitignored .env。模型、log、畫格、影片、venv 也不進 Git。

這次真正學到的事

  • 本機生成只是第一步。 無限直播真正難的是狀態、queue 與退化控制。
  • 畫面連續、動作連續、劇情連續是三件不同的事。 現在前兩者做到「可用」,動作接縫仍要繼續做。
  • 不要讓 API key 自動決定 provider。 選擇會計費的服務必須是明確動作。
  • 只提交觀眾真的看到的最後一格。 這條規則同時保住畫面與劇情。
  • 品質閘門不能只有拒絕。 對 live system 來說,bounded recovery 比完美主義更重要。
  • 5090 的確很猛。 但真正把它變成產品的,不只是算力,而是把所有細節接成一個可長跑的 closed loop。

程式已開源在 github.com/dAAAb/infinite-tv。如果你也想用一張高階消費級 GPU 做互動式生成直播,現在終於有一條可重現、預設不會誤用雲端費用的路徑了。🦐