AI News HubLIVE
站內改寫2 分鐘閱讀

在Jetson上透過持久流服務本地AI

作者使用NVIDIA Jetson Orin Nano Super和Kokoro-82M模型構建了一個本地文本轉語音應用StreamTTS,利用持久流(S2)而非傳統請求-響應架構,實現了可共享、可重放的即時音訊生成,並解決了慢推理、多使用者公平排程和去重等問題。

來源Hacker News AI作者: shikhar

隨著本地AI變得越來越實用,作者希望自託管模型並獨立執行工作負載,無需第三方提供商。NVIDIA的Jetson系列是一個很好的起點,作者選擇了Jetson Orin Nano Super套件,它擁有1024個CUDA核心和32個張量核心,算力達67 TOPS,足以執行一個由Kokoro-82M模型驅動的小型文本轉語音(TTS)應用——StreamTTS。

傳統架構通常採用請求-響應模式,但推理速度較慢,且輸出是增量式的。如果採用阻塞式請求,多個使用者同時提交時會導致排隊。作者希望輸出結果可分享,使用者能立即獲得一個連結,並能在生成過程中即時收聽。因此,作者選擇了持久流(durable streams)作為核心架構。持久流是一種有序的記錄序列,每條記錄被持久化儲存,讀者可以隨時從頭開始回放,或從當前位置跟蹤最新產出。

具體實現中,作者使用了開源的S2 Lite作為流儲存服務,執行在本地。系統模型透過一系列命名流進行通訊:jobs流接收推理請求,pub/casts/流儲存每個生成任務的音訊輸出。工作程序(worker)從jobs流讀取任務,執行Kokoro模型生成音訊,並將結果追加到對應的輸出流中。前端瀏覽器透過Web Audio API解碼並播放每個句子大小的MP3塊,支援從任意位置開始播放或即時跟蹤。

為了解決多使用者公平性問題,工作者程序維護了每個流的播放領先時間(lead),並優先為領先時間最小的流生成下一句音訊,確保所有使用者都能獲得流暢體驗。此外,任務ID透過文本和語音的SHA-256雜湊生成,結合條件追加操作實現自動去重:相同內容只會被處理一次,後續請求直接返回已有結果。

工作程序還實現了持久消費者模式,透過jobs/_cursor流記錄已處理任務的偏移量,支援崩潰後恢復。如果生成過程中工作程序崩潰,重啟後會從最近提交的偏移量繼續處理,已經完成的任務透過檢查輸出流中的eos標記跳過。這種設計提供了至少一次交付語義,並透過嘗試邊界標記處理部分寫入的音訊。

最終,作者構建的StreamTTS應用託管在streamtts.dev,完全執行在自己的Jetson裝置上。整個架構展示瞭如何用持久流優雅地解決本地AI推理中的慢響應、可重放性和併發排程問題,為類似應用提供了一個簡潔的參考方案。