Video avatar chỉ tạo được cảm giác chân thực khi nhân vật giữ được sự nhất quán theo thời gian. Khi khuôn mặt bị lệch, răng thay đổi, đồng bộ khẩu hình bị sai, hoặc chuyển động bị reset giữa các đoạn, người xem sẽ nhận ra ngay lập tức. Điều này càng quan trọng hơn với avatar so với nhiều tác vụ tạo video khác, vì người xem đang theo dõi một người cụ thể nói chuyện, thường ở khoảng cách rất gần, trong một khoảng thời gian dài.
Trong thế giới tạo video ngày nay, thời lượng vẫn là một trong những giới hạn dễ thấy nhất. Nhiều mô hình và sản phẩm chỉ cho phép tạo video dưới dạng các đoạn clip có độ dài cố định — vài giây, và rất ít hệ thống có thể tạo ra video dài hơn vài phút. Với các sản phẩm avatar, giới hạn này tác động trực tiếp đến quy trình làm việc của khách hàng. Khách hàng muốn những cảnh/video dài, nhất quán hơn cho video đào tạo, demo bán hàng, hướng dẫn sản phẩm, giáo dục, hỗ trợ, và các tác vụ có trợ lý ảo cần nói liên tục cho đến khi hoàn thành, đồng thời họ cũng muốn có bản xem trước nhanh để dễ dàng chỉnh sửa prompt, chuyển động và kịch bản.
Tại HeyGen, điều đó được cụ thể hóa thành ba yêu cầu rõ ràng:
- Tính nhất quán trong các cảnh dài. Avatar cần giữ được tính nhất quán về danh tính, độ khớp khẩu hình, biểu cảm và chuyển động không chỉ trong một đoạn clip ngắn, mà còn xuyên suốt nhiều đoạn video được tạo ra.
- Không giới hạn thời lượng cố địnhMột lần tạo có thể kéo dài mười giây, mười phút, hoặc là một phiên thời gian thực không giới hạn.
- Xem trước nhanh, tạo nội dung theo thời gian thực hoặc nhanh hơn thời gian thực. Hệ thống cần bắt đầu tạo khung hình một cách nhanh chóng và thậm chí cho phép truyền phát các khung hình đã tạo ra trong khi quá trình suy luận vẫn đang diễn ra.
Bài viết này trình bày chi tiết khung suy luận mà chúng tôi đã xây dựng để đáp ứng các yêu cầu đó.
Kiến trúc mô hình nền tảng
Nền tảng này được xây dựng dựa trên các mô hình tạo video avatar của HeyGen — các dòng Avatar IV và Avatar V. Ở cấp độ tổng quan, mô hình sẽ nhận vào một hình ảnh/video tham chiếu, âm thanh điều khiển và tùy chọn văn bản hoặc ngữ cảnh cảnh quay, sau đó tạo ra một video trong đó avatar đó nói chuyện với đúng danh tính, biểu cảm và chuyển động.
Mô hình sinh nội tại là một Diffusion Transformer, hay DiT, được huấn luyện bằng phương pháp flow matching. Thay vì nén một người thành một vector nhận dạng nhỏ, mô hình sử dụng các token tham chiếu giàu thông tin để có thể giữ lại những chi tiết quan trọng đối với avatar: hình dạng khuôn mặt, răng, kết cấu da, chuyển động miệng, phong cách cử chỉ và nhịp điệu khi nói.
Quy trình suy luận trong môi trường sản xuất gồm ba giai đoạn chính:
- Tạo video từ âm thanh. Một mô hình DiT cơ bản tạo ra các latent video độ phân giải thấp từ danh tính tham chiếu, đặc trưng âm thanh và các tín hiệu điều kiện. Giai đoạn này tập trung vào chuyển động, độ khớp khẩu hình với âm thanh và tính nhất quán theo thời gian.
- Siêu phân giải nhận diện danh tính. Một mô hình thứ hai tinh chỉnh các latent đó thành đầu ra độ phân giải cao, tập trung nhiều hơn vào những vùng mà con người nhạy cảm nhất với các hiện tượng giả tạo, đặc biệt là khuôn mặt và miệng.
- Giải mã VAE theo luồng. Một bộ giải mã VAE chuyển các latent độ phân giải cao thành từng cụm khung hình RGB, để các khung hình có thể được xuất ra trước khi toàn bộ video hoàn tất.
Để tạo ra các video dài, hệ thống xử lý dữ liệu theo từng đoạn. Trong khi đoạn đầu tiên hoàn toàn dựa vào khung tham chiếu tĩnh, các đoạn tiếp theo sử dụng dữ liệu biên từ những phân đoạn liền kề trước đó. Điều này cho phép avatar tiếp tục nói một cách tự nhiên mà không phải thiết lập lại tư thế hoặc danh tính từ đầu.
Khung phát trực tuyến và vòng lặp đường ống xử lý
Để hỗ trợ việc thực thi theo từng khối (chunk), framework suy luận sử dụng một kiến trúc mô-đun gồm ba tầng, hoạt động trên các khoảng thời gian cục bộ và giải phóng tài nguyên ngay sau khi mỗi khối được xử lý.
- Module: Một lớp bao bọc quanh một mô hình cụ thể và checkpoint của nó (ví dụ: A2V DiT, Super-Resolution DiT, các thành phần VAE, bộ mã hóa văn bản/âm thanh).
- Giai đoạn: Một đơn vị thực thi có kiểu, dùng để điều phối một hoặc nhiều mô-đun (ví dụ: tạo ngữ cảnh, siêu phân giải).
- Pipeline: Đồ thị thực thi kết nối các stage với nhau, quản lý trạng thái dùng chung và điều phối các chế độ thực thi dạng luồng hoặc theo lô.
Giai đoạn khởi tạo sẽ mã hóa danh tính tham chiếu vào các latent một lần cho mỗi yêu cầu. Sau đó, pipeline thực thi một vòng lặp liên tục qua các giai đoạn còn lại cho đến khi luồng âm thanh đầu vào được sử dụng hết:

- Tạo ngữ cảnh: Chuyển đổi các đoạn âm thanh đầu vào thành các đặc trưng, kết hợp chúng với văn bản hoặc điều kiện cảnh, và chuẩn bị các tensor nhiễu mục tiêu.
- Chuyển âm thanh thành video: Thực hiện một quá trình khuếch tán nhiều bước để tạo ra các latent độ phân giải thấp. Giai đoạn này điều chỉnh đoạn hiện tại dựa trên các khung biên của đoạn trước đó để duy trì tính liên tục của chuyển động.
- Siêu phân giải: Tăng tỷ lệ các latent chuyển động lên độ phân giải đầy đủ chỉ trong một bước, ưu tiên chi tiết không gian trên khuôn mặt.
- Giải mã và xuất bản VAE: Giải mã các latent độ phân giải cao thành các khung hình RGB và ghi chúng trực tiếp vào bộ mã hóa đầu ra (H.264 / AAC) để lưu trữ ngay lập tức hoặc phát trực tiếp.
Tính liên tục ở ranh giới và tính nhất quán giữa các đoạn
Việc tạo video theo từng đoạn riêng biệt có thể dẫn đến các gián đoạn tại ranh giới giữa các đoạn. Hệ thống khắc phục điều này bằng cách sử dụng hai loại phân đoạn (chunk) khác nhau:
- Các đoạn N: Các đoạn tạo nên dòng thời gian chính của avatar.
- I Chunks (Nội suy): Các đoạn được thiết kế để làm mượt các chuyển tiếp giữa các N chunk liên tiếp.
Trình tự thực thi được cấu trúc như sau:
N0 -> N1 -> I0 -> N2 -> I1 -> N3 -> I2 -> ...
Một đoạn I chỉ được tạo ra sau khi các đoạn N liền trước và liền sau nó đã hoàn thành. Nó sử dụng khung hình cuối cùng của đoạn N trước đó và một khung hình sớm của đoạn N hiện tại làm khung neo để tính toán chuyển động chuyển tiếp. Sau khi tạo xong, các dự đoán tại khung neo dư thừa sẽ bị loại bỏ, chỉ giữ lại phần chuyển tiếp được nội suy mượt mà. Cơ chế này giới hạn kích thước cửa sổ ngữ cảnh cần thiết đồng thời vẫn duy trì tính nhất quán theo thời gian.
Bộ nhớ không đổi theo thời lượng
Một pipeline video thông thường sẽ tích lũy các latent, khung hình đã giải mã và ngữ cảnh attention trong quá trình chạy, khiến mức sử dụng bộ nhớ GPU tăng tuyến tính theo thời lượng video.
Để hỗ trợ việc tạo nội dung không giới hạn, framework này duy trì một trạng thái cuộn nghiêm ngặt. Hệ thống chỉ giữ lại phần điều kiện tham chiếu tĩnh và một tập nhỏ các tensor neo tối thiểu cần thiết cho việc chuyển tiếp giữa các đoạn (chunk). Tất cả tài nguyên trung gian — bao gồm đặc trưng âm thanh, tensor nhiễu, các kích hoạt nội bộ và khung hình RGB thô — đều được giải phóng khỏi bộ nhớ ngay sau khi một đoạn được giải mã và ghi lại.
Do đó, mức sử dụng bộ nhớ GPU cực đại vẫn giữ ổn định dù tạo một đoạn clip ngắn hay một chuỗi dài; việc sử dụng tài nguyên sẽ tỷ lệ theo kích thước từng khối (chunk) đã định nghĩa thay vì tổng thời lượng của phiên.
Các giai đoạn tải/giải phóng trong đường ống xử lý
Mỗi yêu cầu được xử lý trên một nút gồm 8 GPU. Chúng tôi sử dụng FSDP để chia nhỏ các tham số của mô hình lớn trên nhiều GPU. Mỗi rank chỉ sở hữu một phần trọng số, thu thập các tham số cần thiết cho phép tính, rồi lại giải phóng chúng. Chính điều này cho phép nhiều mô hình lớn — DiT gốc, DiT siêu phân giải, bộ mã hóa văn bản, bộ mã hóa âm thanh và VAE — cùng nằm gọn trên một nút.
Điều này đi kèm với một sự đánh đổi. FSDP tạo ra độ trễ do truyền thông trong quá trình suy luận vì các tham số cần được gom lại trong các bước truyền xuôi. Chúng tôi sử dụng kết hợp nhiều kỹ thuật để che giấu phần chi phí này và giữ các mô hình đồng trú bên ngoài GPU khi chúng không được sử dụng:
- Tải trước theo hướng tiến. Thao tác AllGather đối với các tham số của khối tiếp theo được thực hiện sớm và chồng lấp với quá trình tính toán của khối hiện tại, giúp ẩn độ trễ của bước gom trên đường thực thi quan trọng.
- Giải ghép lười theo từng khối từ CPU. Khi mô hình được đưa trở lại từ bộ nhớ CPU được ghim, chúng tôi không nạp sẵn toàn bộ tập trọng số. Mỗi khối transformer được giải ghép (sao chép từ host sang device + AllGather) ngay trước khi thực hiện lượt truyền xuôi, vì vậy quá trình truyền H2D của khối n+1 sẽ chồng lấp với việc tính toán của khối n.
- Giải phóng tải CPU được ghim giữa các giai đoạn. Các tham số của một mô hình không chạy tại thời điểm đó được giữ trong bộ nhớ CPU được ghim, nên các mô hình đồng vị trí (DiT cơ bản, DiT siêu phân giải, bộ mã hóa văn bản, bộ mã hóa âm thanh, VAE) không cần phải giữ toàn bộ trọng số của chúng trên GPU cùng lúc. Bộ nhớ được ghim chính là yếu tố giúp các bản sao H2D đủ nhanh để chồng lấp với quá trình tính toán.
- Bố trí tiến trình tối ưu theo NUMA. Mỗi tiến trình được gán cố định vào cùng một nút NUMA với GPU tương ứng, nhờ đó các lần truyền dữ liệu CPU↔GPU có thể chạy ở toàn bộ băng thông PCIe/NVLink mà không phải đi qua liên kết giữa các socket.
Chuyển đổi mô hình giữa các giai đoạn trong dưới 10 ms
Lợi ích thực tiễn của các kỹ thuật trên là việc chuyển giao GPU từ mô hình của một giai đoạn sang giai đoạn tiếp theo — ví dụ, A2V DiT → Super-Resolution DiT, hoặc SR DiT → bộ giải mã VAE — gần như không tốn chi phí. Vì mô hình ở giai đoạn trước được offload bất đồng bộ và block đầu tiên của mô hình ở giai đoạn sau được bỏ sharding đúng lúc cần (just-in-time), nên cả thao tác sao chép H2D và AllGather đều được ẩn phía sau phần tính toán vốn đã chạy sẵn. Từ đầu đến cuối, độ trễ quan sát được cho mỗi lần chuyển mô hình đều dưới 10 ms — thấp hơn nhiều so với ngân sách cho một khung hình ở mức tốc độ khung hình mục tiêu của chúng tôi. Cụ thể, chính điều này cho phép vòng lặp pipeline streaming (Context Gen → A2V → SR → VAE Decode-and-Publish) luân phiên qua nhiều mô hình lớn cho mỗi chunk mà việc hoán đổi mô hình không bao giờ trở thành nút thắt cổ chai.
Xuất bản phát trực tiếp theo thời gian thực
Để giúp mô hình đủ nhanh để có thể phát trực tiếp theo thời gian thực, chúng tôi đã thực hiện rất nhiều tối ưu hóa suy luận, vui lòng tham khảo https://www.heygen.com/research/avatar-v-inference để biết thêm chi tiết về phần này.
Khi pipeline xuất video theo từng đoạn nhỏ trong thời gian thực, việc truyền phát trở thành một phần mở rộng tự nhiên của quá trình suy luận thay vì là một bước xử lý hậu kỳ riêng biệt.
Đối với luồng thời gian thực theo kiểu phát sóng, chúng tôi xuất bản các khung hình đã được tạo ra lên Amazon Kinesis Video Streams (KVS). KVS thường được nhắc đến trong bối cảnh camera, thiết bị IoT và nội dung media được tải lên. Trong trường hợp của chúng tôi, “camera” chính là pipeline suy luận: các khung hình được mô hình tạo ra, mã hóa ngay lập tức và đẩy vào KVS như một luồng phát trực tiếp.
Trình ghi đầu ra nhận các khung hình RGB đã được giải mã từ VAE phát trực tuyến và gửi chúng vào một pipeline GStreamer. Video được mã hóa theo chuẩn H.264 và âm thanh theo chuẩn AAC, sau đó cả hai luồng được đẩy vào kvssink, bộ thu phát (producer sink) của KVS. Từ đó, người xem có thể phát lại phiên này như một luồng trực tiếp ngay khi nó vẫn đang được tạo.
Kết quả và bài học rút ra
Framework này đã chuyển việc tạo Avatar IV và Avatar V từ kết xuất cảnh cố định sang tạo nội dung dạng streaming mở. Kết quả quan trọng nhất rất đơn giản: chúng tôi đã loại bỏ giới hạn thời lượng cảnh cho Avatar IV và Avatar V. Đối với việc tạo Avatar IV theo thời gian thực, chúng tôi đã đạt được thời gian đến khung hình đầu tiên dưới 5 giây và tốc độ tạo hơn 27 khung hình mỗi giây cho video Avatar IV độ phân giải 720p — nhanh hơn cả tốc độ phát lại thời gian thực.