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推理中的慢響應、可重放性和併發調度問題,為類似應用提供了一個簡潔的參考方案。