只有當虛擬人物在一段時間內保持一致時,Avatar 影片才會讓人感到真實可信。當面部位置偏移、牙齒細節改變、對嘴出現偏差,或是片段之間的動作被重置時,觀眾會立刻察覺。對於虛擬人物來說,這一點比許多其他影片生成任務更為重要,因為觀眾往往會在較近距離、持續很長時間地觀看同一個人在說話。
在當今的影片生成領域,時長仍然是最明顯的限制之一。許多模型和產品只提供固定長度的短片生成——通常只是幾秒鐘,很少有系統能生成超過幾分鐘的內容。對於 Avatar 產品來說,這個限制會直接影響客戶的工作流程。客戶希望為培訓影片、銷售示範、產品講解、教育、支援,以及需要持續對話直到任務完成的智能代理,製作更長且一致的場景/影片,同時也希望能有快速預覽,以便反覆調整 Prompt、動作和腳本。
在 HeyGen,我們將這些需求具體化為三項明確的要求:
- 長場景一致性。虛擬人物需要在不只是一段短片,而是多個生成影片片段之間,持續保持身份、對嘴、表情和動作的連貫一致。
- 無固定時長上限一次生成可以是 10 秒、10 分鐘,甚至是開放式的實時會話。
- 快速預覽、即時或快於即時的生成。系統應能迅速開始生成畫面,甚至在推理過程仍在進行時,就允許串流輸出已生成的畫面。
本文將逐步介紹我們為滿足這些需求而構建的推理框架。
底層模型架構
此框架以 HeyGen 的虛擬人物影片生成模型為核心——Avatar IV 和 Avatar V 系列。在高層次上,模型會接收一張或一段參考圖片/影片、驅動音訊,以及可選的文字或場景條件,然後生成該虛擬人物的影片,並準確呈現其身份特徵、表情和動作。
核心生成模型是一個使用 flow matching 訓練的 Diffusion Transformer(簡稱 DiT)。模型並非將人物壓縮成一個很小的身份向量,而是基於豐富的參考標記進行條件控制,從而保留對虛擬人物至關重要的細節:臉型、牙齒、皮膚質感、嘴部動作、手勢風格以及說話節奏。
生產環境中的推理流程分為三個主要階段:
- 音頻轉影片生成。基礎 DiT 會根據參考身份、音頻特徵和各種條件信號生成低解像度的影片潛變量。此階段主要關注動作、對嘴和時間連貫性。
- 身份感知超高解析度重建。第二個模型會將這些潛在表示精細化為高解析度輸出,並特別關注人們對瑕疵最敏感的區域,尤其是面部和嘴部。
- 串流式 VAE 解碼VAE 解碼器會將高解析度潛變量逐段轉換為 RGB 畫面,讓系統在整段影片尚未完全生成前,便可開始輸出畫面。
為了生成長片段影片,系統會分段處理數據。第一個片段完全依賴靜態參考,而之後的片段則會利用前一段的邊界數據。這樣虛擬人物就可以自然地持續說話,而毋須每次從頭重置姿勢或身份。
串流框架與管線循環
為了配合以分塊為基礎的執行方式,推理框架採用模組化的三層架構,在局部時間窗口內運作,並在每個分塊處理完成後立即釋放資源。
- Module:針對特定模型及其 checkpoint 的封裝(例如 A2V DiT、Super-Resolution DiT、VAE 元件、文字/音訊編碼器)。
- 階段:一個具類型的執行單元,用於協調一個或多個模組(例如情境生成、超高解析度處理)。
- Pipeline:將各個 Stage 串聯起來的執行圖,用於管理共享狀態,並協調串流或批次執行模式。
初始化階段會在每個請求中,將參考身份編碼為潛在向量。然後,Pipeline 會在其餘各個階段之間持續循環執行,直至輸入音訊串流完全耗盡:

- 上下文生成:將輸入的音頻片段轉換為特徵,並與文字或場景條件結合,準備目標噪聲張量。
- Audio-to-Video:執行多步驟擴散處理,以生成低解像度潛變量。此階段會根據上一個片段的邊界畫面來調整當前片段,從而保持動作連貫性。
- 超高解像度:在單一步驟中將動態潛變量提升至完整解像度,並優先優化面部的空間細節。
- VAE 解碼與發佈:將高解析度潛變量解碼為 RGB 畫面,並直接寫入輸出編碼器(H.264 / AAC),以便即時儲存或即時播放。
邊界連貫性與片段一致性
將影片分成獨立片段生成,可能會在片段邊界產生不連貫的情況。此框架透過使用兩種不同的區塊分類方式來減輕這種問題:
- N Chunks:用於生成虛擬人物主時間線的片段。
- I Chunks(插值):用於平滑連續 N Chunks 之間過渡的片段。
執行順序結構如下:
N0 -> N1 -> I0 -> N2 -> I1 -> N3 -> I2 -> …
只有在其前後相鄰的 N 區塊都完成後,才會生成 I 區塊。系統會使用前一個 N 區塊的最後一幀,以及當前 N 區塊的一個較早幀作為錨點幀,來計算過渡運動。生成完成後,多餘的錨點預測會被丟棄,只保留經過平滑插值的過渡部分。這個機制在限制所需上下文視窗的同時,仍能保持時間上的一致性。
隨時長保持固定記憶用量
傳統的影片處理流程在執行期間會不斷累積潛在向量、解碼後的畫面以及注意力上下文,導致 GPU 記憶體用量會隨影片時長線性增加。
為了實現開放式生成,此框架嚴格維持一個滾動狀態。系統只保留靜態參考條件,以及在片段切換時所需的最少量錨點張量。所有中間資產——包括音頻特徵、噪聲張量、內部激活值和原始 RGB 畫面——在每個片段解碼並寫入後,會立即從記憶體中清除。
因此,無論生成的是短片還是長片序列,GPU 的峰值記憶體使用情況都會保持穩定;資源使用量會隨預先設定的分段大小而變化,而不是隨整個會話的總時長而改變。
在管線內載入/卸載的各個階段
每個請求都會在一個配備 8 個 GPU 的節點上運行。我們使用 FSDP 將大型模型的參數分片到多個 GPU 上。每個 rank 只持有部分權重,在計算時收集所需的參數,用完後再釋放。這樣就可以讓多個大型模型——包括基礎 DiT、超高解析度 DiT、文字編碼器、音訊編碼器以及 VAE——同時容納在同一個節點上。
這當中存在取捨。由於在推理過程的前向傳播中需要收集參數,FSDP 會引入通訊開銷。我們結合多種技術來隱藏這些開銷,並在模型未被使用時,將同一節點上的其他模型保持在 GPU 之外:
- 前向預取。預先發出下一個區塊參數的 AllGather 操作,並與當前區塊的計算重疊進行,從而在關鍵路徑上隱藏參數收集的延遲。
- 從 CPU 進行逐區塊延遲解分片。當模型從鎖定的 CPU 記憶體載入回來時,我們不會預先載入完整的一組權重。每個 transformer 區塊會在其前向傳遞之前才解分片(主機到設備複製 + AllGather),因此第 n+1 個區塊的 H2D 傳輸可以與第 n 個區塊的計算重疊進行。
- 在各階段之間使用固定 CPU 記憶體進行卸載。未在運行中的模型參數會保存在固定的 CPU 記憶體中,因此同一機器上的多個模型(base DiT、super-resolution DiT、text encoder、audio encoder、VAE)無需同時在 GPU 上保留其權重。正是固定記憶體令 H2D 複製速度足夠快,可以與運算重疊進行。
- 具 NUMA 感知的進程放置。每個進程都固定在與其分配 GPU 相同的 NUMA 節點上,這樣 CPU↔GPU 傳輸就可以在不跨越處理器插槽互連的情況下,以完整的 PCIe/NVLink 頻寬運行。
階段之間低於 10ms 的模型切換
上述技術帶來的實際效益在於,將 GPU 從一個階段的模型切換到下一個階段的模型(例如由 A2V DiT → Super-Resolution DiT,或由 SR DiT → VAE decoder)在效果上幾乎是零成本。由於輸出端模型會以非同步方式卸載,而輸入端模型的第一個 block 則會在恰當時機即時取消分片,H2D 複製和 AllGather 這兩個步驟都被隱藏在已經執行中的運算之後。從端到端來看,每次切換實際可觀察到的額外開銷低於 10ms——遠低於我們目標幀率下一個畫面的時間預算。具體而言,正是這一點讓串流處理管線迴圈(Context Gen → A2V → SR → VAE Decode-and-Publish)可以在每個 chunk 中輪流經過多個大型模型,而不會因為模型切換本身而成為瓶頸。
即時串流發佈
為了令模型能夠以足夠的速度實時串流輸出,我們進行了大量推理層面的優化,詳情請參閱https://www.heygen.com/research/avatar-v-inference以了解此部分的更多資訊。
一旦管線能夠在實時逐段輸出影片,串流傳送就會成為推理過程的自然延伸,而不再是一個額外的後期處理步驟。
對於廣播式的實時路徑,我們會將生成的畫面發佈到 Amazon Kinesis Video Streams(KVS)。KVS 通常是在攝影機、IoT 裝置和已上載媒體的情境下被提及。而在我們的情況中,「攝影機」其實就是推理管線本身:畫面由模型生成後立即編碼,並作為直播串流推送到 KVS。
輸出寫入器從串流 VAE 接收解碼後的 RGB 畫面,並將其送入 GStreamer pipeline。影片會被編碼為 H.264,音訊則編碼為 AAC,然後這兩條軌道一併推送到 kvssink(KVS producer sink)。之後,觀眾可以在內容仍在生成的同時,以直播形式回放這個會話。
成果與經驗總結
這個框架將 Avatar IV 和 Avatar V 的生成方式,從固定場景渲染改為開放式串流生成。最重要的成果很簡單:我們移除了 Avatar IV 和 Avatar V 的場景時長限制。對於即時 Avatar IV 生成,我們已經實現了首幀時間少於 5 秒,以及在 720p Avatar IV 影片中每秒超過 27 幀的生成速度——比即時播放還要快。