11 tháng 10, 2026 Sài Gòn, VN

Build Log

Số Explainer video English
Ship gì Ghi nấy
Đọc thêm
ở blog.
Ghé mtri.me →
English

Hai video nhân vật đọc log

“Máy làm gần hết, câu nào không giống thì mình viết lại.”

Log số 001 kể chuyện dựng trang này. Số này, hai nhân vật đọc lại log làm việc đó dưới dạng năm bài học.

Sản phẩm là hai clip. Mai kể giọng dễ thương. Kuma kể giọng hùng hồn. Bên dưới là cách mình làm.

Lời trong video · 5:23

Chào, mình là Trí. Số này thì hơi khác. Mình sẽ nói về sản phẩm, không phải trang web, mà là hai video ngắn. Đầu tiên là video về Mai, một cô gái mình làm theo style của Mitsuru Adachi. Kuma là con gấu bông 3D. Hai bạn này sẽ đọc lại log build số 1, rồi rút ra những bài học nhanh trong hơn 2 phút. Mình sẽ kể cách mình làm ra clip đó.

Đầu tiên là phần kịch bản. Claude đọc hết khoảng 25 giờ hoạt động của log, sau đó đọc qua 36 lượt tin nhắn, rồi gom ra 5 bài học. Bản đầu, giọng cô này nghe hơi điệu, nhiều câu dạng như khẩu hiệu. Mình mở một trang trên browser để review chữ nghĩa. Bên trái là trang, bên phải là từng câu, mình sửa liên tục 50 câu đó luôn. Sau đó mình bảo Claude so bản của mình với bản gốc của nó, rồi rút ra những quy tắc. Một câu không được gắn thái độ cho AI, và các câu tổng kết đều phải có lý do. Sau lần viết kịch bản này, Claude dùng luôn những quy tắc đó cho các video tiếp theo.

Thứ hai là giọng đọc. Mình dùng mô hình VieNeu. VieNeu là bộ đọc tiếng Việt miễn phí, chạy local trên Mac. Vì giọng đầu tiên nghe hơi điệu, nên Claude đo độ lên xuống của từng giọng. Giọng cũ dao động hơn 12 nửa cung. Giọng tên Thục Đoan chưa tới 10, nên mình chọn Thục Đoan. Vì VieNeu không có nút chỉnh tốc độ, nên giọng Kuma được làm chậm lại, còn khoảng 9 phần 10, bằng ffmpeg. Tên tiếng Anh thì máy thường đọc sai, nên có một bảng phiên âm riêng. Không chỉ tên tiếng Anh, mà còn những từ riêng nữa. Còn phụ đề thì vẫn giữ chữ gốc.

Bên cạnh đó, mình thử thêm Chatterbox. Mình dùng nó để làm text to speech tiếng Anh. Khi làm bản tiếng Anh cho số đầu tiên, Soniox của mình bị hết tiền. Còn bản miễn phí của ElevenLabs thì không có nhân bản giọng. Nên mình dùng Chatterbox, mã nguồn mở, giấy phép MIT, chạy được local trên Mac. Nhân bản giọng chỉ từ 12 giây thu âm, rồi nó đọc từng câu khớp lúc mình nói. Ổ đĩa không đủ chỗ cho model gốc, nên mình phải dùng bản chỉ bằng một nửa. Bản nhân bản chạy được, nhưng cuối cùng bản tiếng Anh vẫn dùng giọng đọc của mình. Sau đó máy cắt từng câu, ghép và đặt đúng chỗ.

Cuối cùng là cách tạo ra nhân vật. Mình dùng Codex vẽ một tấm hình gốc, sau đó vẽ 13 lần, mỗi lần một nét mặt khác. Vì AI không bao giờ vẽ lại y chang, nên tấm nào cũng có những chỗ lệch nhỏ, mà lệch rất nhiều chỗ. Claude phải viết code để canh từng tấm hình cho khớp với tấm gốc, rồi chỉ cắt phần trong ô mặt có thay đổi. Lúc đầu cắt thì mất hết nét lúc nhắm mắt, rồi có những chỗ như bóng ma trong ảnh. Sau đó cố gắng sửa cho không thấy đường nối chỗ ghép.

Tiếp theo là khẩu hình của nhân vật. Tiếng Việt mỗi chữ là một âm tiết, nên miệng phải mở liên tục. Mình dùng Whisper nghe lại file giọng để biết miệng nhép như thế nào, ở giây nào. Sau đó thêm animation mắt chớp vài giây một lần, theo một chuỗi cố định, để lúc nào render thì cũng giống nhau. Tới những câu cảm xúc, nhân vật đổi nét mặt, nhún người, hoặc có dấu hiệu manga như dấu chấm than, đổ mồ hôi, vân vân. Cuối cùng mọi thứ ghép lại bằng một trang HTML chạy GSAP, và dùng HyperFrames để render ra video dọc, dạng thường thấy trên Instagram hay Facebook.

Phần mình làm kỹ nhất là duyệt từng chữ. Máy viết hết, nhưng sau đó mình duyệt lại. Câu nào nghe không giống cách mình nói hằng ngày thì mình chỉnh lại. Vậy thôi, hẹn mọi người số sau.

Mai, giọng nữ dễ thương · 2:22
Kuma, giọng con gấu hoạt bát · 2:11

Mai, giọng nữ dễ thương

Cô gái vẽ theo nét Mitsuru Adachi. Giọng: Thục Đoan, tốc độ chậm. Thời lượng: 2 phút 22 giây. Nét mặt thay đổi 33 lần.

Kuma, giọng con gấu hoạt bát

Gấu bông 3D đeo kính. Giọng: Thanh Bình, tốc độ 0,9 lần. Thời lượng: 2 phút 11 giây. Cùng năm bài học, kể ở ngôi thứ nhất.

Chi tiết nhỏ

Năm khâu. Khâu nào cũng thử sai

Ba câu của Claude và bản mình sửa, kèm số câu đã sửa và số quy tắc

Kịch bản có người duyệt

Claude đọc lại log trong 25 giờ làm việc (mình làm hơi lâu) và 36 lượt nhắn. Claude rút ra năm bài học. Bản đầu nghe hơi sáo rỗng. Nhiều câu giống khẩu hiệu. Mình duyệt bản đầu trên trang copy-reviewThuật ngữTrang duyệt chữ mình làm cho agent. Trang thật nằm bên trái, từng câu nằm bên phải. Người duyệt sửa hoặc duyệt từng câu, rồi agent ghi bản sửa vào code.Tất cả thuật ngữ →. Trang nằm bên trái, từng câu nằm bên phải. Mình sửa 50 câu. Claude so bản sửa với bản gốc và ghi ra 19 quy tắc viết. Ví dụ: không gắn thái độ cho AI. Câu tổng kết phải có lý do.

ship bởiTrí
Biểu đồ độ lên xuống của 5 giọng nữ VieNeu, Mỹ Duyên 12,3 và Thục Đoan 9,8 nửa cung

Giọng đọc chạy trên máy

Giọng đọc dùng VieNeuThuật ngữMô hình đọc chữ thành giọng nói (TTS) tiếng Việt. Miễn phí, chạy trên máy, có sẵn nhiều giọng như Thục Đoan, Thanh Bình.Tất cả thuật ngữ →. VieNeu miễn phí và chạy trên Mac. Claude đo độ lên xuống của từng giọng. Giọng đầu dao động 12,3 nửa cung và nghe điệu. Giọng Thục Đoan dao động 9,8 nửa cung. VieNeu không có nút chỉnh tốc độ. ffmpegThuật ngữCông cụ dòng lệnh mã nguồn mở để cắt, ghép, đổi định dạng và chỉnh tốc độ âm thanh, video.Tất cả thuật ngữ → làm chậm giọng Kuma còn 0,9 lần. Máy đọc sai tên tiếng Anh nên mình phải thêm một bảng phiên âm cách đọc trong tiếng Việt (ví dụ: em ai ti). Phụ đề giữ chữ nguyên bản (MIT).

ship bởiTrí
Sóng âm mẫu giọng 12 giây và ba bước làm bản tiếng Anh bằng Chatterbox

Chatterbox, cho bản tiếng Anh số 001

Số 001 có bản tiếng Anh. SonioxThuật ngữDịch vụ AI giọng nói trả phí theo lượng dùng: chuyển giọng nói thành chữ và dịch.Tất cả thuật ngữ → hết tiền giữa chừng. Bản miễn phí của ElevenLabsThuật ngữDịch vụ AI giọng nói: đọc chữ thành giọng và nhân bản giọng. Gói miễn phí không có nhân bản giọng.Tất cả thuật ngữ → không nhân bản giọng. ChatterboxThuật ngữMô hình TTS mã nguồn mở của Resemble AI, giấy phép MIT. Nhân bản một giọng từ mẫu thu vài giây và chạy được trên máy.Tất cả thuật ngữ → có giấy phép MIT và chạy trên GPU của Mac. Chatterbox nhân bản giọng mình từ một mẫu 12 giây. Máy sinh mỗi câu phụ đề một lần. Sau đó máy kéo giãn câu 0,85 đến 1,15 lần cho khớp lúc mình nói. Ổ đĩa không đủ chỗ cho model gốc nên mình dùng bản fp16, nhỏ bằng một nửa. Bản cuối thì mình tự đọc luôn cho tự nhiên. Máy cắt từng câu và đặt vào đúng chỗ.

ship bởiTrí
Bảng 13 nét mặt của Mai ghép lên tấm gốc

Một hình vẽ, mười ba nét mặt

CodexThuật ngữAgent lập trình của OpenAI, chạy trong terminal. Mình dùng nó để vẽ ảnh qua gói ChatGPT.Tất cả thuật ngữ → vẽ một tấm gốc và 13 tấm nét mặt. AI không vẽ lại y chang, nên tấm nào cũng lệch vài điểm ảnh. Một đoạn code canh từng tấm theo tấm gốc. Code chỉ giữ vùng mặt có thay đổi. Lần đầu, bộ lọc xóa nét mi khi nhắm mắt. Bộ lọc cũng để lại vết như bóng ma. Claude bỏ bộ lọc và sửa chỗ ghép. Đường nối không phát hiện được thì mới duyệt (không tì vết).

ship bởiTrí
Năm khung hình Mai: miệng mở ở bốn chữ, khép lại lúc nghỉ

Miệng mở theo từng chữ

Tiếng Việt mỗi chữ là một âm tiết. Miệng phải mở ở từng chữ. WhisperThuật ngữMô hình nhận dạng giọng nói mã nguồn mở của OpenAI. Chuyển giọng nói thành chữ, kèm mốc giây của từng chữ.Tất cả thuật ngữ → cho biết mỗi chữ bắt đầu ở giây nào. Miệng mở trong 62% thời lượng của chữ. Mắt chớp theo một chuỗi cố định. Mọi lần render cho cùng kết quả. Ở câu cảm xúc, nhân vật đổi nét mặt hoặc nhún người. Nhân vật cũng hiện các thanh dấu manga: dấu chấm than, giọt mồ hôi, ngôi sao..

ship bởiTrí
Khung hình hai clip dọc Mai và Kuma cạnh đoạn code GSAP và lệnh render HyperFrames

Ráp lại bằng HTML

Mỗi clip là một trang HTML. GSAP skillThuật ngữGreenSock Animation Platform, thư viện JavaScript làm hoạt hình trên web. GSAP skill là bộ hướng dẫn giúp agent viết hoạt hình bằng GSAP.Tất cả thuật ngữ → chạy hoạt hình. HyperFramesThuật ngữCông cụ dòng lệnh render một trang HTML có hoạt hình thành file video, từng khung hình một.Tất cả thuật ngữ → render trang ra video dọc 1080×1920. Instagram và Facebook dùng khổ này.

ship bởiTrí
Sóng âm tiếng Việt và tiếng Anh 40 giây đầu, vạch đứt ở đầu mỗi câu

Video nói chuyện, bản tiếng Anh

Video ở góc trang có bản tiếng Anh. Chatterbox học giọng mình từ đoạn nói chuyện 11 giây của chính bản thu. Máy sinh mỗi câu phụ đề một lần và đặt câu vào lúc mình nói. Mà tiếc là khẩu hình không khớp chữ tiếng Anh.

ship bởiTrí

Dựng môi trường

Copy đoạn này, dán vào agent của bạn (Claude Code, Codex). Agent cài và kiểm tra từng bước.

Mục tiêu: dựng môi trường làm video giải thích tiếng Việt có nhân vật hoạt hình. Chạy trên máy (macOS hoặc Linux).

Quy tắc:
- Làm từng bước. Kiểm tra xong mới qua bước sau.

Các bước:
1. Kiểm tra `uv`, `ffmpeg` và Node 18 trở lên. Thiếu thì cài.
2. Tạo môi trường Python 3.12: `uv venv ~/.agentvid/vieneu-env --python 3.12`.
3. Cài `vieneu` và `faster-whisper` vào môi trường đó.
4. Đọc thử một câu bằng preset "Thục Đoan" và "Thanh Bình". Lưu mỗi giọng ra một file wav. Lần đầu tải model khoảng 600 MB.
5. Dùng `faster-whisper` (model small, tiếng Việt) lấy mốc giờ từng chữ. Xuất JSON dạng [{w, s, e}].
6. Giọng tiếng Anh (nếu cần): tạo môi trường Python 3.11 riêng, cài `chatterbox-tts`. Trên Mac, dùng GPU (`mps`) và đặt `PYTORCH_ENABLE_MPS_FALLBACK=1`.
7. Mình sẽ đưa một mẫu giọng tiếng Anh dài 10 đến 15 giây. Dùng mẫu đó nhân bản giọng, để thông số mặc định. Đọc thử một câu, lưu ra wav.
8. Tạo trang HTML 1080x1920 có GSAP timeline và file wav. Render thử 5 giây bằng `npx hyperframes render`.
9. Viết script Python (numpy, Pillow). Canh từng ảnh nét mặt theo ảnh gốc. Chỉ giữ vùng mặt có thay đổi. Xuất PNG nền trong suốt.
10. Khẩu hình: mở miệng ở mỗi chữ, khoảng 60% thời lượng của chữ.
11. Chớp mắt mỗi 2,6 đến 5 giây. Dùng seed cố định.

Kịch bản:
- Tên tiếng Anh đi qua bảng phiên âm (ví dụ: Claude đọc "Cờ lót"). Phụ đề giữ chữ gốc.
- Một câu, một ý. Không thêm dữ kiện ngoài log.

Báo cáo: cái gì đã cài, file thử nằm đâu, bước nào lỗi.

Mộtđiềucuối

Kuma đọc chữ build không đúng, nên mình dùng chữ 'biu' mà cũng không được nó đọc thành [BUI]. Vậy là phiên âm đổi thành biêu. Phải render lại 2 clip.

đang nghĩ vềTrí

Số trước

Xem toàn bộ nhật ký +
▶5:23