Skip to content

Video ​

Bảy video ngắn có nhạc, dựng bằng Remotion: bốn video lời tiếng Anh và ba video lời tiếng Việt. Trang này là yêu cầu chung; mỗi video có một trang kịch bản riêng.

Yêu cầu từ chủ dự án ​

NguồnYêu cầu
SRC-1043 (25.09.2026)"Trong trang IELTS Learning Plan, tạo ra một video có nhạc, có lời bằng tiếng Anh, để chia sẻ và giải thích cho learners... lưu vào đâu đó trong Cloudflare. Về công nghệ, sử dụng remotion. Hãy làm cho riêng tài khoản của tôi."
SRC-1045 (25.09.2026)"Tạo 3 video khác, nhưng có voice minh họa bằng tiếng Việt. Mỗi video cũng nói riêng về 1 Jobs to be done set."
SRC-1044 (25.09.2026)"Tạo ra 3 video khác bằng Remotion. Mỗi video nói về 1 jobs to be done set, trong đó gồm pains, triggers, barriers, và cuối cùng thì nói về Solution của NEMO IELTS... gắn rải rác 3 video đó vào /students/ielts và 2 trang nào đó bên trong."

Các video ​

VideoNói vềHiện ởAi xem được
What is a Learning Plan?Learning Plan giúp tránh học mơ hồTrang Learning Plan trong sân luyệnChỉ dac2205@gmail.com (đang xem thử)
What should I do today?JTBD-L6/L7: hôm nay học gì, bao giờ sẵn sàng/{vai}/university/ieltsMọi người
Where am I, really?JTBD-L1/L2: mình đang thực sự ở đâu/{vai}/university/ielts/diagnosisMọi người
Am I really improving?JTBD-L4: có đang tiến bộ thật không/{vai}/university/ielts/tuitionMọi người
Mình đang thực sự ở đâu?JTBD-L1/L2, lời tiếng ViệtTrang Learning Plan, khối xem thửChỉ dac2205@gmail.com
Mình có thực sự tiến bộ không?JTBD-L4, lời tiếng ViệtTrang Learning Plan, khối xem thửChỉ dac2205@gmail.com
Hôm nay mình nên học gì?JTBD-L6/L7, lời tiếng ViệtTrang Learning Plan, khối xem thửChỉ dac2205@gmail.com

Vì sao ba video tiếng Việt chỉ ở chế độ xem thử: Workers AI chưa có model đọc tiếng Việt, nên giọng lấy từ giọng hệ thống "Linh" của macOS. Điều khoản macOS chỉ cho dùng giọng hệ thống vào mục đích cá nhân, không thương mại. Muốn đưa lên trang công khai thì phải đổi sang một dịch vụ TTS cho phép dùng thương mại (ví dụ Google Cloud Text-to-Speech, cần khoá API) và render lại.

Nội dung JTBD, pains và triggers lấy từ IELTS learner model. Phần barriers (điều gì ngăn learner hành động) viết mới, vì tài liệu ấy chưa có mục này.

Bản v2 (SRC-1046, 25.09.2026) ​

Chủ dự án: "Giọng đọc làm sao để giống con người hơn... Trong 5-10 giây đầu, tôi cần chỉ có nhạc thôi... Cuối video có nhạc, và có hiệu ứng gì đó để nó không bị dừng đột ngột. Giữa các trang slide thì cần nghỉ một chút... Cần có nhiều ảnh minh hoạ trên mỗi slide hơn, dùng thuật toán để vẽ hình dạng SVG."

Yêu cầuLàm thế nào
5-10 giây đầu chỉ nhạc7 giây mở đầu: quỹ đạo chuyển động, chữ NEMO IELTS và câu hỏi của video hiện dần; nhạc dồn dần (pad, rồi arpeggio, rồi trống)
Kết không dừng đột ngột6 giây kết: vòng sóng lan, thương hiệu, mờ dần; nhạc mờ trong 4 giây
Nghỉ giữa các cảnh1,6 giây nghỉ; mỗi cảnh mờ vào, mờ ra; lời vào sau khi cảnh hiện 0,5 giây
Nhiều hình minh hoạ, vẽ bằng thuật toántools/videos/src/art.tsx: nền hạt nổi và sóng, mỗi loại cảnh một hình (quỹ đạo, đường đứt đoạn, đồng hồ, tường gạch, bậc thang tăng trưởng, sóng lan), mỗi thẻ một biểu tượng đa giác sinh từ seed
Giọng giống người hơnTiếng Anh dùng giọng thần kinh aura-2 (tự nhiên sẵn). Tiếng Việt: Linh đã đọc chậm lại và nghỉ sau câu, nhưng vẫn là giọng máy; giọng giống người cần Google Cloud TTS (đường cắm đã có, cần khoá API)

Nhịp nằm ở một file: tools/videos/timing.json (hình và nhạc cùng đọc). Cách làm video lặp lại được ghi trong skill .claude/skills/remotion-video/SKILL.md.

Bản v3 (SRC-1051, 25.09.2026): phụ đề và nhịp chậm ​

Chủ dự án: "Tôi cần phụ đề trong các video. Tôi cần learner có thể chọn ẩn / hiện phụ đề, và learners có thể chọn phụ đề tiếng Việt hoặc tiếng Anh... Và các video cần chậm chậm thôi. Nói chậm, nhiều khoảng nghỉ, để audience ngấm dần và suy ngẫm được nữa."

Yêu cầuLàm thế nào
Phụ đề Việt và Anh, bật/tắt đượcMỗi video có hai tệp WebVTT (videos/<id>.vi.vtt, .en.vtt trên R2), gắn bằng thẻ <track>. Người xem bật/tắt và đổi ngôn ngữ bằng nút CC của trình phát. Trang công khai bật sẵn tiếng Việt; khối xem thử bật sẵn ngôn ngữ khác với lời đọc
Phụ đề khớp lờiGiọng đọc sinh TỪNG CÂU, nên biết mốc chính xác của mỗi câu; phụ đề ngôn ngữ được đọc là một dòng mỗi câu, đúng mốc. Bản dịch chia theo khoảng thời gian lời của cùng đoạn
Nguồn bản dịchVideo Learning Plan: trường text_vi trong kịch bản. Ba cặp JTBD: bản Anh và bản Việt cùng chủ đề dịch cho nhau, ghép theo id đoạn
Nói chậm, nhiều khoảng nghỉNghỉ 0,9 giây sau mỗi câu, 2,6 giây giữa các cảnh, lời vào sau khi cảnh hiện 0,9 giây, kết 7 giây. Giọng Linh đọc 145 từ/phút. Video dài khoảng 90 giây thay vì khoảng 70 giây

Năm video "một thông điệp" (SRC-1052, 25.09.2026) ​

Chủ dự án: "Làm thêm 5 video tương tự... cần nói ngắn lại, nói ít lại. Để khoảng trống ở đầu của từng slide và cuối của các slide dài ra, tầm 5 tới 10 giây. Mỗi video đều có message xuyên suốt."

VideoThông điệpHiện ở
skills-firstSkills first. Task types later.Trang Reading trong sân luyện
listen-twiceListen twice. Then answer.Trang Listening
small-stepsSmall steps, every day.Trang chính /ielts, dưới dashboard
know-youTell Nemo about you. Get help that fits.Learner Profile
three-monthsThree months. Half a band.Membership
  • Mỗi đoạn lời một, hai câu ngắn. Slide đứng yên 5 giây trước lời và 5 giây sau lời (timing trong kịch bản).
  • Thông điệp được nói ở cảnh đầu và cảnh cuối, và nằm trên một dải cố định ở mép dưới suốt video.
  • Trong sân luyện, mỗi video là MỘT dòng "▶ Video 1 phút" (ielts/IeltsClip.tsx), bấm mới mở trình phát.

What's new hằng tuần (SRC-1053) ​

Mỗi thứ Hai một bài tổng kết tuần trước, bằng tiếng Việt, ở nemo12.com/{vai}/university/ielts/whats-new (lối vào: một dòng trên trang IELTS công khai, và mục "What's new" trong menu tài khoản của sân luyện). Mỗi bài có một video 3 điểm mới: whatsnew-2026-09-25. Nội dung bài ở apps/web/src/site/whatsNew.ts.

Hai bài bù (SRC-1064, 26.09.2026): chủ dự án yêu cầu What's new cho hai tuần trước bản ra mắt. Bài 2026-09-18 (tuần 20) và 2026-09-11 (tuần 19) soạn từ commit IELTS/learn của đúng tuần ấy, mỗi bài một video whatsnew-<slug> theo cùng khuôn. Ngày ra bài ghi là thứ Hai kế tiếp (21.09 và 14.09), đúng lịch đã chốt, dù bài được viết sau.

Trình bày lại (SRC-1072, 26.09.2026): mỗi bài ghi khung thời gian ĐÚNG 7 ngày ("Tuần 21 · 19.09.2026 - 25.09.2026"), có test chốt (whatsNew.test.ts: 7 ngày, các tuần nối liền). Mỗi bài một ảnh SVG vẽ bằng thuật toán từ slug (WeekArt.tsx): bảy cột là bảy ngày, ba chấm trên đường cong là ba điểm mới. Trang tổng quan là LƯỚI nhiều tuần cùng lúc (ba cột trên màn rộng): ảnh đại diện, tiêu đề và hai dòng meta (khung 7 ngày; số điểm mới, video 1 phút). Trang bài: đầu trang hai cột (chữ + ảnh), video, ba điểm mới thành ba thẻ đánh số, thay đổi nhỏ, và lối sang tuần trước/tuần sau.

Bản nháp (SRC-1074, 26.09.2026): bài tuần 22 (26.09 - 02.10.2026) soạn ngay ngày đầu tuần theo lựa chọn của chủ dự án, mang cờ draft: true nên không hiện ở trang, sitemap hay lối vào (WHATS_NEW lọc nháp; test chốt). Video whatsnew-2026-10-02 có kịch bản, visibility hidden, CHƯA render. Trước khi đăng 05.10: bổ sung phần còn lại của tuần, seed media_videos, render, xoá cờ.

Các mảng khác: SAT, CELTA, TESOL, TEFL (SRC-1055, 25.09.2026) ​

Chủ dự án: "Làm tương tự các video dạng này cho tất cả các mảng khác như là SAT, CELTA, TESOL, TEFL... Chỉ làm cho các trang public thôi. Mỗi mảng cần làm 5 videos bằng remotion. Dùng skill chung đã tạo. Mỗi video cần có thông tin về meta-data của chúng, lưu trong database D1. Lưu toàn bộ cả prompts và nội dung của video trong database luôn. Rồi sau đó tạo ra một tính năng trong admin.nemo12.com, để quản lý."

Cùng khuôn "một thông điệp" (nói ngắn, slide đứng yên 5 giây trước và sau lời, dải thông điệp, phụ đề Việt/Anh). Mọi con số lấy từ chính nội dung trang của mảng (CELTA: syllabus Cambridge 07.2024; TESOL/TEFL: TESOL International Association; SAT: thang điểm trên trang SAT), không thêm sự thật mới. Video hiện ở cuối trang, ngay trên chân trang.

SAT ​

VideoThông điệpTrang
sat-two-sectionsTwo sections. 1600 points./students/sat/test-format, /parents/sat/test-format
sat-target-firstKnow your target score first./sat/learner/target-score
sat-check-up-firstCheck up first. Then study./students/sat/diagnosis, /parents/sat/diagnosis
sat-roadmapOne roadmap. No random practice./sat/learner/roadmap
sat-is-it-for-meDecide with facts, not guesses./sat/learner/is-sat-for-me

CELTA ​

VideoThông điệpTrang
celta-one-certificateCELTA is one clear certificate./teachers/celta
celta-is-it-for-meAnswer five questions first./teachers/celta/is-celta-for-me
celta-entryThree rules from Cambridge./teachers/celta/entry-requirements
celta-teaching-practiceYou learn to teach by teaching./teachers/celta/lessons-from-the-classroom
celta-four-assignmentsFour written assignments./teachers/celta/focus-on-the-learner

TESOL ​

VideoThông điệpTrang
tesol-field-not-courseTESOL is a field, not one course./teachers/tesol
tesol-is-core-for-meCheck if you are the right fit./teachers/tesol/is-tesol-core-for-me
tesol-what-to-look-forLook at the facts, not the ads./teachers/tesol/what-to-look-for
tesol-red-flagsA red flag means: ask more./teachers/tesol/red-flags
tesol-ask-firstAsk before you sign up./teachers/tesol/questions-to-ask

TEFL ​

VideoThông điệpTrang
tefl-a-groupTEFL is a group of certificates./teachers/tefl
tefl-or-celtaCompare one course, not a label./teachers/tefl/tefl-or-celta
tefl-hoursAsk what the hours really are./teachers/tefl/hours
tefl-teaching-practiceReal practice makes real teachers./teachers/tefl/teaching-practice
tefl-red-flagsStop and ask before you pay./teachers/tefl/red-flags

Kho metadata và trang quản lý ​

  • Nguồn soạn: tools/videos/registry.json (mảng, quyền xem, trang gắn, prompt) + scripts-content/<id>.json.
  • D1 media_videos (migration 0297): một dòng một video, gồm kịch bản đầy đủ (script_json), prompt, trang gắn, quyền xem, thời lượng và lần render gần nhất. Nạp bằng scripts/seed-videos.sql (sinh bởi tools/videos/scripts/seed-sql.mjs) qua workflow seed-data; workflow render ghi thời lượng sau mỗi lần render.
  • Quyền xem đọc từ D1: public, owner (chỉ tài khoản xem thử) hoặc hidden; đổi trong admin là có hiệu lực, không cần deploy.
  • admin.nemo12.com, tab "Video": lọc theo mảng, xem link (mp4, ảnh bìa, phụ đề Việt/Anh, trang gắn), prompt, kịch bản; sửa tiêu đề, thông điệp, quyền xem, trang gắn, ghi chú. Kịch bản không sửa ở đây (sửa trong tools/videos rồi render lại).
  • Gắn vào trang: apps/web/src/site/pageVideos.ts sinh từ registry (gen-web-map.mjs), khối PageVideo đặt một lần trong khung trang.

Tên mảng trên video (SRC-1061) ​

Chữ thương hiệu ở mở đầu, kết, nhãn cảnh giải pháp và nút mời đọc tên mảng từ tiền tố id video (brandOf trong tools/videos/src/Frame.tsx): sat-* là NEMO SAT, celta-* NEMO CELTA, tesol-* NEMO TESOL, tefl-* NEMO TEFL, còn lại NEMO IELTS. Bản đầu cứng chữ IELTS nên cả hai mươi video của bốn mảng kia đều xưng NEMO IELTS; chủ dự án phát hiện ở trang SAT. Suy từ id thay cho thêm trường vào kịch bản, vì id đã mang mảng và một nguồn thì không lệch được.

Cùng lượt (SRC-1060): video sat-is-it-for-me gắn thêm vào trang SAT chính, vì trước đó cả năm video SAT chỉ nằm ở trang con.

Video đứng ngay dưới hero (SRC-1062) ​

Video gắn theo đường dẫn (PAGE_VIDEOS) nay do PageHead vẽ, ngay dưới khu đầu trang, thay cho một khối trước chân trang. Ở cuối trang, trên một trang SAT dài hơn mười nghìn pixel, gần như không ai cuộn tới. Trang không dùng PageHead vẫn có video ở cuối làm lưới đỡ; khối ấy tự ẩn khi khối gần đầu trang đã hiện, nên không trang nào có hai bản.

Bản v4 (SRC-1075, 26.09.2026): vùng phụ đề, bốn kiểu nhạc, render lại rẻ ​

Chủ dự án: "Trong video, ko nên để thông tin ở khu vực phụ đề... Cần dùng 3-5 dạng nhạc khác nhau... Tạo lại tất cả video. Cần lưu lại gì đó... để mỗi lần tạo lại video thì token tốn rất ít."

  • Thanh thông điệp chuyển lên ĐẦU khung; luật mới trong skill: 20% dưới cùng không đặt chữ.
  • Bốn kiểu nhạc calm, bright, lofi, pulse; kịch bản chọn bằng music, bỏ trống thì suy từ id. 71 video hiện chia 21 / 10 / 23 / 17.
  • Bộ đệm giọng: mỗi câu TTS lưu theo băm (máy đọc, giọng, câu) và giữ giữa các lượt bằng actions/cache. Chọn cache của GitHub thay cho D1 hay R2 vì đây là dữ liệu trung gian của riêng lượt build, không ai đọc ngoài workflow; giữ nó trong D1 là đưa file âm thanh vào một cơ sở dữ liệu quan hệ. Kịch bản, prompt và thời lượng thì vẫn ở D1 media_videos như SRC-1055.
  • videos=all render lại mọi video trong một lệnh, workflow tự chia lô 8 và chạy song song 4 lô.

Video mạng xã hội (SRC-1179, 01.10.2026) ​

Reel và video 16:9 cho mạng xã hội, render trên máy: xem social-reels.

Speak together (SRC-1080, 27.09.2026) ​

Video "một thông điệp" speak-together (Speak with a partner, grow together.), gắn ở đầu trang learn.nemo12.com/ielts/speaking/pair. Sáu cảnh: dễ hơn khi có bạn; mở bài và gửi mã hoặc link; A hỏi, B trả lời, chọn một trong ba cách hỏi; bốn lượt (đọc mẫu, nói theo đời thật, đổi vai); cả hai bấm Bắt đầu và Xong thì mỗi người được 15 phút; lời mời. Nhạc kiểu bright. Kịch bản: tools/videos/scripts-content/speak-together.json. Chưa render: Actions đang bị chặn vì thanh toán, render bằng videos=speak-together khi chạy lại được (seed media_videos trước).

Luật render: tối đa 5 video, không videos=all (SRC-1081, 27.09.2026) ​

Chủ dự án tiếc tiền khi render lại cả 71 video. Sau bản v4 (SRC-1075) chỉ render 5 video quan trọng nhất: jtbd-what-next, small-steps, sat-is-it-for-me, celta-one-certificate, whatsnew-2026-09-25, cộng video mới speak-together. Các video khác giữ bản cũ tới khi được chỉ ra cụ thể. Luật đầy đủ trong skill .claude/skills/remotion-video mục "Luật render".

Khuôn của một video JTBD ​

Hook (câu hỏi của learner) → Pains → When it hits (triggers) → What stops you (barriers) → Solution của NEMO IELTS → lời mời. Mỗi phần một cảnh, mỗi cảnh đúng một đoạn lời.

Luật chung ​

  • Lời tiếng Anh đơn giản, câu ngắn. Trên trang công khai, tiêu đề và câu dẫn phía trên video là tiếng Việt (SRC-829): phụ huynh biết video nói gì trước khi bấm.
  • Nhạc tự tổng hợp bằng code (tools/videos/scripts/music.mjs), không tải từ đâu về: không vướng bản quyền, cùng một commit luôn ra cùng một bản nhạc. Mỗi video một tông.
  • Hình khớp lời: độ dài mỗi cảnh lấy từ độ dài lời đọc thật (timeline.json).
  • Video chưa có thì khối tự ẩn, không để một khung đen có nút play hỏng.

Công nghệ và nơi lưu ​

PhầnỞ đâu
Dựng hìnhtools/videos (Remotion 4.0.528), NGOÀI workspaces: công cụ render chạy trong CI, không vào bundle site nào nên không đụng luật bộ ba UI (SRC-650)
Giọng đọcTiếng Anh: Workers AI @cf/deepgram/aura-2-en (cùng model với Listening), cần token có quyền Workers AI. Tiếng Việt: giọng macOS Linh sinh trên máy, commit sẵn
Render và đưa lênWorkflow chạy tay .github/workflows/render-videos.yml (luật: mọi thứ chạm production đi qua GitHub)
LưuR2 nemo12-content/videos/<id>.mp4 và ảnh bìa <id>.jpg
PhátGET /v1/public/videos/{id} (ba video JTBD), GET /v1/owner/videos/learning-plan (chỉ tài khoản xem thử, người khác nhận 404)

Remotion miễn phí cho cá nhân và công ty tối đa 3 người; quá mức đó cần giấy phép công ty.

Render lại sau khi sửa lời ​

  1. Sửa tools/videos/scripts-content/<id>.json và trang kịch bản tương ứng ở đây.
  2. Commit, gộp vào main.
  3. gh workflow run render-videos.yml --ref main -f videos="<id>" (mặc định render cả bốn).
  4. Xem trước bản mp4 trong artifact của lượt chạy; lượt ấy cũng đã đưa bản mới lên R2.