Video Agent Design

Thiết kế agent biến brief thành video hoàn chỉnh — script, avatar/voice, scenes, edit, export

Video khác ảnh không phải ở chỗ nó "nặng hơn" — mà ở chỗ các khâu phụ thuộc dây chuyền: script quyết định voice, voice quyết định timing scene, scene phải khớp avatar. Một sửa đổi nhỏ ở đầu chuỗi có thể phá hủy toàn bộ công việc phía sau. Thiết kế này xoay quanh việc chặn đứng sự phá hủy đó bằng proxy rẻ trước mỗi khâu đắt, và invalidation có chọn lọc thay vì chạy lại từ đầu.

Tác giả: Lương Quốc Dũng Bằng chứng: quan sát trực tiếp PAM (tài liệu công khai + giao diện sản phẩm)

01Pipeline & model/tooling choices

Năm khâu, mỗi khâu ghi rõ input/output và model — kèm nhãn phân biệt có bằng chứng từ PAM và giả định có lý do, vì PAM không có video-avatar để đối chiếu trực tiếp.

1 · Script

Reasoning / copywriting

In: brief, brand/context, audience
Out: script có segment_id, câu thoại, thời lượng dự kiến, tone
Claude Opus/Sonnet/Haiku — evidence
→
2 · Voice

TTS

In: script theo segment_id, ngôn ngữ, giọng, tốc độ, cảm xúc
Out: audio nháp rẻ + audio full sau duyệt
TTS multi-voice + emotion — giả định
→
3 · Avatar/lip-sync

Video-GPU

In: audio đã duyệt, script/timing, avatar reference
Out: clip avatar khớp miệng theo segment
Avatar/lip-sync model — giả định
→
4 · Scenes/edit

Code-based compositing

In: avatar clips, scene plan, background, text overlay, transition
Out: project multi-scene + animatic low-res để duyệt
Remotion — evidence
→
5 · Export

Render & publish

In: Remotion project đã duyệt
Out: MP4, kèm preview + metadata
Kế thừa giới hạn resize của PAM

Vì sao Remotion cho khâu Scenes/edit

Code-based composition phù hợp hơn generate-video một lần vì có thể kiểm soát từng scene, timing, text và dependency; sửa một scene không nhất thiết phải sinh lại toàn bộ clip.

Export: recompose rẻ, trừ khi crop mất avatar

Remotion cho phép recompose aspect ratio trên cùng avatar clip và audio, nên nhiều trường hợp chỉ cần thay đổi layout thay vì regenerate từ đầu. Tuy nhiên, nếu framing mới làm crop mất mặt hoặc vùng quan trọng của avatar, segment đó phải được sinh lại — đây là giới hạn khác với resize ảnh thông thường, vì ảnh không có nhân vật cần giữ nguyên vị trí, avatar thì có.

Giữ nguyên giới hạn của PAM Video không resize/version đơn giản như ảnh; nếu thay đổi nội dung, audio hoặc timing lớn thì phải render lại phần phụ thuộc, thậm chí toàn bộ video.

02Review loop

Video đắt và chậm hơn ảnh nhiều bậc, nên mỗi khâu đắt phải có một đại diện rẻ đứng trước nó để duyệt — giống nguyên tắc Directions của PAM (greyscale trước khi tốn công render màu).

KhâuĐại diện rẻ để duyệtMục tiêu kiểm tra
VoiceTTS bản nháp chi phí thấp — vài câu đại diện hoặc toàn bộ chất lượng thấpGiọng, tốc độ, phát âm, cảm xúc — chưa phải audio cuối
ScenesStoryboard/animatic low-res: thumbnail tĩnh hoặc clip chuyển cảnh đơn giảnBố cục, thứ tự cảnh, thời lượng tương đối, tính liên tục — chưa lip-sync, chưa hiệu ứng

Khi user sửa ngược dòng (vd: sửa script sau khi đã duyệt scene)

Hệ thống không âm thầm giữ kết quả cũ. Nó hiển thị impact preview: thay đổi này sẽ làm mất hiệu lực voice, timing và các scene phụ thuộc; render hiện tại vẫn được giữ để khôi phục nhưng cần sinh lại các bước sau.

Regenerate downstreamTạo lại voice và các scene bị ảnh hưởng.
Keep existing outputGiữ voice/scene cũ nếu chỉ sửa phần không ảnh hưởng ngữ nghĩa/độ dài đọc.
Create branchThử phiên bản mới mà không phá bản đã duyệt.

Các bước đã duyệt không bị xóa mà được lưu theo version. Hệ thống chỉ invalidate những phần thực sự phụ thuộc vào đoạn bị sửa, thay vì chạy lại toàn bộ video.

Vì sao cho branch, khác với PAM (PAM không branch cho ảnh) Video có chi phí sản xuất cao hơn, không thể thử rồi sửa như ảnh được — nên có nhu cầu tạo thêm để so sánh thay vì chỉ chọn một bản không vừa ý rồi sửa lại.

Giới hạn của segment_id — không hứa mọi sửa đổi chỉ render một đoạn nhỏ

  • Trường hợp đơn giản: mỗi đoạn script có segment_id, mỗi scene tham chiếu segment đó — hệ thống invalidate chính xác ở mức scene.
  • Trường hợp phức tạp (một scene nhiều câu, hoặc voice-over trải dài nhiều scene): mapping và timing phức tạp hơn — hệ thống đánh dấu toàn bộ vùng liên quan cần regenerate, không giả vờ xác định chính xác từng phần.
  • Avatar không nên coi mỗi segment hoàn toàn độc lập — cần dùng chung avatar reference, voice profile, camera/framing, style để giữ nhận diện nhất quán. Nếu model giữ identity/reference tốt: sửa một câu chỉ render lại segment đó (+ vài giây hai đầu tránh lỗi chuyển cảnh). Nếu thay đổi làm lệch timing dài / biểu cảm liên tục / tương tác giữa hai scene: phải invalidate cả một segment block liên quan.

Remotion giúp việc này có cơ sở kỹ thuật vì scene được biểu diễn bằng code và có thể gắn metadata/dependency rõ ràng, nhưng mapping script → scene vẫn là giới hạn thiết kế, không phải tự nhiên Remotion giải quyết hết.

03Cost & latency

Đây là phần đề bài nêu tên riêng — không phải một câu "video tốn kém hơn ảnh" cho có.

Nút thắt cổ chai Avatar/lip-sync là khâu vừa đắt nhất vừa chậm nhất, vì phải chạy model video/GPU để tạo chuyển động khớp với audio. Voice TTS nhanh và rẻ hơn; Remotion render và export là compositing/encoding xác định — chậm với video dài nhưng dễ dự đoán hơn.

Vì vậy avatar/lip-sync full chỉ chạy sau khi script, voice và storyboard đã được duyệt — nếu user sửa script trước đó thì tránh trả lại đúng chi phí GPU lớn nhất.

Ước tính trước khi tốn tiền

Trước khi render full, UI hiển thị thời gian và chi phí ước tính dựa trên thời lượng video, số segment, độ phân giải và số lần render; user phải xác nhận nếu vượt budget.

Latency — không bắt user ngồi chờ trơ

Dùng async job như PAM: user bấm render rồi có thể rời đi, hệ thống enqueue job, xử lý nền và gửi thông báo khi hoàn tất hoặc lỗi.

04Storyboard — hành trình từ prompt đến video publish

Brief ví dụ: "Giới thiệu VinSmart Future trong 45 giây, có avatar AI và 3 scene: giới thiệu VSF, các lĩnh vực AI đang phát triển, lời mời tìm hiểu/chào mừng ứng viên." Giữa chừng user sửa câu mở đầu — hành trình này cố tình đi qua nhánh invalidation, không chỉ đường thẳng thuận lợi.

1
In
Prompt/briefnhập liệu

User mở màn hình Create video, nhập: "Giới thiệu VinSmart Future trong 45 giây, có avatar AI và 3 cảnh." Chọn ngôn ngữ, đối tượng xem, phong cách rồi bấm Generate plan.

2
Aa
Script sinh ratự động

Script hiển thị trong editor dưới dạng các block thoại theo từng cảnh, kèm thời lượng dự kiến. segment_id chỉ dùng ở backend, user không cần nhìn thấy.

3
♪
Voice nháp + storyboardduyệt proxy

User nghe bản TTS nháp và xem 3 scene dạng storyboard/animatic low-res gồm avatar, background, text và thời lượng. Có thể sửa lời thoại, đổi giọng hoặc chỉnh cảnh trước khi duyệt.

4
✎
Sửa câu mở đầuimpact preview

User click vào block thoại đầu tiên, sửa trực tiếp rồi bấm Review changes. Impact preview báo voice, timing và avatar của Scene 1 sẽ bị làm lại; Scene 2–3 không bị ảnh hưởng, kèm ba nút: Regenerate affected parts · Keep existing · Create branch.

5
↻
Regeneratexử lý nền

User chọn Regenerate affected parts. Màn hình hiển thị tiến trình xử lý voice/avatar của Scene 1; Scene 2–3 vẫn xem được nhưng được đánh dấu là phiên bản cũ.

6
$
Full renderxác nhận chi phí

Sau khi proxy được duyệt, user bấm Render full video. Hệ thống hiển thị thời gian và chi phí ước tính theo thời lượng, số segment và độ phân giải; user xác nhận trước khi job chạy bất đồng bộ.

7
▶
Video hoàn tấtduyệt cuối

User nhận thông báo và mở bản preview full-quality để kiểm tra hình, tiếng, caption và chuyển cảnh. Video chưa được publish ngay; user phải bấm Approve for export hoặc quay lại chỉnh sửa.

8
↗
Publish/exporthoàn tất

User chọn định dạng MP4 và tỷ lệ 16:9, 9:16 hoặc 1:1 trong màn hình Export. Hệ thống recompose layout nếu có thể, sau đó tạo file/link chia sẻ và lưu project, artifact, phiên bản đã duyệt cùng audit trail.

05Giới hạn & điều tôi không hứa

  • TTS và avatar/lip-sync là giả định về capability, không gắn tên model cụ thể — PAM không có bằng chứng cho hai khâu này, chỉ có cho reasoning (Claude) và ảnh (Nano Banana/GPT Image) và multi-scene (Remotion).
  • segment_id không hứa mọi chỉnh sửa chỉ render lại một đoạn nhỏ — phụ thuộc khả năng giữ continuity của avatar model; trường hợp phức tạp phải invalidate cả segment block.
  • Recompose aspect ratio rẻ chỉ đúng khi framing mới không crop mất avatar; nếu crop, segment đó phải sinh lại — giới hạn khác với resize ảnh của PAM.
  • Giữ nguyên giới hạn PAM: video không resize/version đơn giản như ảnh khi thay đổi nội dung, audio hoặc timing lớn.