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ồn | Yê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
| Video | Nó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ện | Chỉ 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/ielts | Mọi người |
| Where am I, really? | JTBD-L1/L2: mình đang thực sự ở đâu | /{vai}/university/ielts/diagnosis | Mọi người |
| Am I really improving? | JTBD-L4: có đang tiến bộ thật không | /{vai}/university/ielts/tuition | Mọi người |
| Mình đang thực sự ở đâu? | JTBD-L1/L2, lời tiếng Việt | Trang 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ệt | Trang 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ệt | Trang 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ầu | Làm thế nào |
|---|---|
| 5-10 giây đầu chỉ nhạc | 7 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ột | 6 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ảnh | 1,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án | tools/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ơn | Tiế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ầu | Làm thế nào |
|---|---|
| Phụ đề Việt và Anh, bật/tắt được | Mỗ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ời | Giọ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ịch | Video 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."
| Video | Thông điệp | Hiện ở |
|---|---|---|
| skills-first | Skills first. Task types later. | Trang Reading trong sân luyện |
| listen-twice | Listen twice. Then answer. | Trang Listening |
| small-steps | Small steps, every day. | Trang chính /ielts, dưới dashboard |
| know-you | Tell Nemo about you. Get help that fits. | Learner Profile |
| three-months | Three 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 (
timingtrong 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
| Video | Thông điệp | Trang |
|---|---|---|
| sat-two-sections | Two sections. 1600 points. | /students/sat/test-format, /parents/sat/test-format |
| sat-target-first | Know your target score first. | /sat/learner/target-score |
| sat-check-up-first | Check up first. Then study. | /students/sat/diagnosis, /parents/sat/diagnosis |
| sat-roadmap | One roadmap. No random practice. | /sat/learner/roadmap |
| sat-is-it-for-me | Decide with facts, not guesses. | /sat/learner/is-sat-for-me |
CELTA
| Video | Thông điệp | Trang |
|---|---|---|
| celta-one-certificate | CELTA is one clear certificate. | /teachers/celta |
| celta-is-it-for-me | Answer five questions first. | /teachers/celta/is-celta-for-me |
| celta-entry | Three rules from Cambridge. | /teachers/celta/entry-requirements |
| celta-teaching-practice | You learn to teach by teaching. | /teachers/celta/lessons-from-the-classroom |
| celta-four-assignments | Four written assignments. | /teachers/celta/focus-on-the-learner |
TESOL
| Video | Thông điệp | Trang |
|---|---|---|
| tesol-field-not-course | TESOL is a field, not one course. | /teachers/tesol |
| tesol-is-core-for-me | Check if you are the right fit. | /teachers/tesol/is-tesol-core-for-me |
| tesol-what-to-look-for | Look at the facts, not the ads. | /teachers/tesol/what-to-look-for |
| tesol-red-flags | A red flag means: ask more. | /teachers/tesol/red-flags |
| tesol-ask-first | Ask before you sign up. | /teachers/tesol/questions-to-ask |
TEFL
| Video | Thông điệp | Trang |
|---|---|---|
| tefl-a-group | TEFL is a group of certificates. | /teachers/tefl |
| tefl-or-celta | Compare one course, not a label. | /teachers/tefl/tefl-or-celta |
| tefl-hours | Ask what the hours really are. | /teachers/tefl/hours |
| tefl-teaching-practice | Real practice makes real teachers. | /teachers/tefl/teaching-practice |
| tefl-red-flags | Stop 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ằngscripts/seed-videos.sql(sinh bởitools/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ặchidden; đổ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.tssinh từ registry (gen-web-map.mjs), khốiPageVideođặ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ằngmusic, 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_videosnhư SRC-1055. videos=allrender 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ình | tools/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 đọc | Tiế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ên | Workflow chạy tay .github/workflows/render-videos.yml (luật: mọi thứ chạm production đi qua GitHub) |
| Lưu | R2 nemo12-content/videos/<id>.mp4 và ảnh bìa <id>.jpg |
| Phát | GET /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
- Sửa
tools/videos/scripts-content/<id>.jsonvà trang kịch bản tương ứng ở đây. - Commit, gộp vào main.
gh workflow run render-videos.yml --ref main -f videos="<id>"(mặc định render cả bốn).- 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.