Bỏ qua tới nội dung
SkillTVT AgencyVideo & Motion· TVT Agency· 2026-11-03

High-End Editorial Magazine Typography Video Engine

High-End Editorial Magazine Typography Video Engine — Quy trình tự động hóa sản xuất video bằng mã nguồn (Hyperframes / Code-driven Video Engine).

High-End Editorial Magazine Typography Video Engine là một Agent Skill (SOP chuẩn SKILL.md) thuộc nhóm Video & Motion, giúp high-End Editorial Magazine Typography Video Engine — Quy trình tự động hóa sản xuất video bằng mã nguồn (Hyperframes / Code-driven Video Engine). Cần 2 đầu vào: Tiêu đề bài viết phong cách tạp chí; Trích dẫn ấn tượng và số liệu chuyên gia. Dùng trực tiếp với ChatGPT, Claude, Cursor/Windsurf hoặc xuất SKILL.md cho Claude Code, OpenClaw, Hermes.

Inputs

  • article_title · string · bắt buộc

    Tiêu đề bài viết phong cách tạp chí

  • key_quotes · textarea · bắt buộc

    Trích dẫn ấn tượng và số liệu chuyên gia

Tools

Không yêu cầu tool đặc biệt.

Quality gates

  • Editorial Typographic Hierarchy Gate
  • Grid Alignment Gate
  • Pacing & Whitespace Gate

Biến (2)

Còn 2 biến chưa điền — placeholder sẽ được giữ nguyên khi copy.

# SKILL: High-End Editorial Magazine Typography Video Engine

High-End Editorial Magazine Typography Video Engine — Quy trình tự động hóa sản xuất video bằng mã nguồn (Hyperframes / Code-driven Video Engine).

## INPUTS
- **article_title** (string, bắt buộc) — Tiêu đề bài viết phong cách tạp chí
- **key_quotes** (textarea, bắt buộc) — Trích dẫn ấn tượng và số liệu chuyên gia

## QUALITY GATES
- [ ] Editorial Typographic Hierarchy Gate
- [ ] Grid Alignment Gate
- [ ] Pacing & Whitespace Gate

# SKILL: tvt-magazine-type

> Skill 03 của bộ retention video. Đặc tả yêu cầu: `retention_video_skills_pack/03_SKILL_tvt-magazine-type.md`.
> Lõi dùng chung: `templates/hyperframes/` (`promo_core.py` · `promo_engine.js` · `render.py`) + `retention_video_skills_pack/tools/engine_core.py`.
> Trạng thái: engine chạy thật, đã render demo 29,6 s trong repo (`examples/out/editorial_premium_demo.mp4`).

---

## 1. DÙNG KHI NÀO

| | |
|:--|:--|
| **Dùng cho** | Video diễn giải 16:9 phong cách editorial — luận điểm, số liệu, trích dẫn, định nghĩa. Nền sáng, chữ serif, nhiều khoảng thở |
| **Tỉ lệ** | `16x9` — canvas CSS 960×540 @ scale 2 = khung chính **1920×1080** |
| **Thời lượng** | Theo `timeline[]` trong JSON (mỗi cảnh 4–6 s là hợp lý) |
| **Không dùng khi** | Cần video 9:16 dọc (dùng `tvt-voice-motion` hoặc `tvt-stickman`); cần lời đọc tự động tạo video (skill này **không** có TTS — cần `--voice`); cần b-roll quay thật (engine chỉ nhận ảnh bạn tự đặt) |

---

## 2. PIPELINE

```bash
# 1. Soạn JSON theo schema (LLM hoặc tay) — BẮT BUỘC đúng schema
#    retention_video_skills_pack/schemas/tvt-magazine-type_schema.json
#    Mẫu chạy được: skills/tvt-magazine-type/examples/tvt-magazine-type.json

# 2. Dựng project (HTML/CSS/JS + render_config.json) — build kiểm schema trước,
#    rồi đo hình học thật trong chromium
python3 skills/tvt-magazine-type/scripts/build.py \
        skills/tvt-magazine-type/examples/tvt-magazine-type.json \
        --face-boxes skills/tvt-magazine-type/examples/face_boxes.json

# 3. Kiểm nội dung (schema + luật riêng skill 03) — exit 0 PASS, 2 FAIL
#    --report là BẮT BUỘC: không có nó thì các quy tắc phụ thuộc kết quả dựng
#    (diện tích accent, né mặt, ẩn caption) sẽ KHÔNG được kiểm
python3 skills/tvt-magazine-type/scripts/qa_content.py \
        skills/tvt-magazine-type/examples/tvt-magazine-type.json \
        --report skills/tvt-magazine-type/out/tvt-magazine-type/qa_content.json

# 4. QA hình học: safe margin + tràn chữ + khung hình trống (chặn trước khi render)
python3 skills/tvt-magazine-type/scripts/render.py skills/tvt-magazine-type/out/tvt-magazine-type --qa

# 5. Render MP4 (tự chạy lại QA trước)
python3 skills/tvt-magazine-type/scripts/render.py skills/tvt-magazine-type/out/tvt-magazine-type

# 6. Tự kiểm từ file sạch (build -> qa -> render -> ffprobe)
bash skills/tvt-magazine-type/scripts/selftest.sh

# 7. Tái tạo lại video demo trong repo
bash skills/tvt-magazine-type/scripts/make_demo.sh

# 8. Test lõi dùng chung (chuẩn âm thanh, schema, SFX, khung trống) — 38 test
python3 retention_video_skills_pack/tools/test_engine_core.py
```

**Không sửa tay `skills/tvt-magazine-type/out/<project>/`** — sửa JSON rồi build lại.

### Tuỳ chọn

| Tuỳ chọn | Tác dụng |
|:--|:--|
| `--voice <file>` | Ghép giọng đọc vào MP4. File được **chuẩn hoá tự động** về chuẩn pack (−14 LUFS ±0,5 · TP ≤ −1 dBTP) trước khi trộn; bản xuất cuối được kiểm lại và **FAIL (exit 2)** nếu lệch chuẩn |
| `--alignment <file>` | `alignment.json` sinh bởi `templates/hyperframes/align.py` — dùng làm nguồn mốc thời gian thay cho ước lượng |
| `--fps` (mặc định 30) | 30 fps là đủ cho đồ họa tĩnh kiểu editorial; 60 fps nặng gấp đôi |
| `--caption-hide-ratio` (mặc định 0.5) | Ngưỡng ẩn sub, tính trên diện tích safe box |

---

## 3. SCHEMA — trường JSON -> hiệu ứng hình

| Trường | Hiệu ứng |
|:--|:--|
| `brand.accent_color` | Màu accent duy nhất → `--accent` (rule, số liệu). Nếu tương phản < 4.5:1 với nền thì **không** dùng cho chữ |
| `brand.name` | Nhãn thương hiệu góc trên phải |
| `brand.tone` | Không ảnh hưởng hình — giữ để đúng schema |
| `grid.columns` | Số cột lưới (mặc định 12) |
| `grid.text_span` | Khoảng span cho phép của khối chữ (mặc định `[6, 8]`) |
| `grid.margin_percent` | Không dùng trực tiếp — safe box lấy từ `media_dna.json` |
| `typography.headline_font` | `Playfair Display` (đã vendor trong `kit/fonts/`) |
| `typography.headline_size_px` | Cỡ headline theo **px khung chính 1920×1080**; engine chia cho `scale` (96 → 48 px CSS) |
| `typography.body_size_px` | Cỡ caption theo px khung chính (38 → 19 px CSS) |
| `typography.max_accent_area_percent` | Trần 10%; engine đo tổng diện tích hộp accent thật và ghi vào `qa_content.json` |
| `face_avoidance.enabled` | Bật/tắt né mặt |
| `face_avoidance.min_distance_px` | Khoảng cách tối thiểu tới hộp mặt (px khung chính) |
| `face_avoidance.protected_features` | Ghi nhận, engine không tách vùng mắt/miệng riêng (xem GIỚI HẠN) |
| `timeline[].content_type` | `claim` / `data` / `quote` / `definition` / `transition` → nhãn kicker; `data` thì số trong headline tô màu accent |
| `timeline[].text` | Được tách tất định thành **headline** (serif lớn) + **caption** (serif nhỏ) — xem mục 4 |
| `timeline[].layout.column_start/column_end` | Cột đặt khối chữ. `12 − (end − start + 1)` phải nằm trong `[4, 6]` |
| `timeline[].layout.vertical_position` | `top` / `middle` / `bottom` → canh dọc khối chữ |
| `timeline[].animation.type` | `fade` (8–12 frame) hoặc `slide` (12–24 px). Cấm bounce/shake |
| `timeline[].broll_prompt` | **Văn bản mô tả**, không phải ảnh — dùng làm nhãn placeholder |
| `timeline[].sfx` | `none` / `soft_riser` / `single_impact` — tổng hợp bằng ffmpeg |

### Cách tách headline / caption (tất định, không đoán)

1. Có dòng mới → dòng đầu là headline, phần còn lại là caption.
2. Có ranh giới mệnh đề (`. ! ? … ,` hoặc ` — `) sau ≥ 12 ký tự → phần trước là headline.
3. Quá 6 từ → cắt giữa theo từ.
4. Còn lại → toàn bộ là headline, caption rỗng.

---

## 4. BA QUY TẮC HÌNH ẢNH CỦA SKILL NÀY

| Quy tắc | Nguồn | Cách engine thực hiện |
|:--|:--|:--|
| **Caption serif** | Yêu cầu track | Cả headline lẫn caption dùng `Playfair Display` đã vendor (`kit/fonts/`). Font hệ thống chỉ là fallback — không dùng lúc render |
| **Tìm & né khuôn mặt** | `03_SKILL…:18-22` | Engine **không** tự dò mặt (máy này không có `cv2`). Engine **tiêu thụ** `face_boxes.json`; nếu thiếu → `status: "no-data"`, **không** kết luận PASS. Thứ tự né: (1) đổi cột sang vùng trống, (2) đổi vị trí dọc, (3) giảm cỡ chữ theo bậc 96→88→80 px khung chính, (4) ẩn caption, (5) cuối cùng mới ghi `overflow-fallback` |
| **Ẩn sub khi màn nhiều chữ** | **Quy tắc MỚI do track này định nghĩa** — KHÔNG có trong `03_SKILL_tvt-magazine-type.md` hay tài liệu pack nào | `text_area_ratio` = tổng diện tích hộp chữ của cảnh ÷ diện tích safe box, đo thật trong chromium. `ratio ≥ 0.5` → caption của cảnh đó bị đặt `data-caption="off"`. Tỷ lệ được tính trên **bộ chữ đầy đủ** (trước khi áp dụng quy tắc ẩn) |

---

## 5. THƯ VIỆN TOKEN

| Token CSS | Nguồn | Giá trị |
|:--|:--|:--|
| `--safe-top/bottom/left/right` | `media_dna.json` → `frame_16x9.safe_px` (54/108/96/96 px khung chính) | 27/54/48/48 px CSS |
| `--paper` | `03_SKILL…:53` | `#F9F9F6` (nền ngà) |
| `--ink` | `03_SKILL…:54` | `#111111` |
| `--ink-soft` | dùng cho chữ phụ | `#6B6B66` (5,4:1 trên nền ngà) |
| `--accent` | `brand.accent_color` (ghi đè qua `tokens.css`) | `#B08D57` trong ví dụ |
| `--accent-text` | tính tự động: accent nếu ≥ 4,5:1, nếu không thì `--ink` | |
| `--serif` | `kit/fonts/PlayfairDisplay-*.woff2` | Playfair Display 400–700 |
| `--sans` | `retention_video_skills_pack/assets/fonts/BeVietnamPro-Black.ttf` | Be Vietnam Pro |
| `--ease` | `03_SKILL…:35-38` | chỉ fade/slide, không bounce |

---

## 6. GIỚI HẠN ĐÃ BIẾT

| # | Giới hạn | Bằng chứng / hệ quả |
|:-:|:--|:--|
| L1 | **Không tự phát hiện khuôn mặt.** Máy đo không có `cv2` nên `retention_video_skills_pack/tools/crop_plan.py:57` dừng ngay. Engine chỉ đọc `face_boxes.json` | Khi thiếu file này, `qa_content.json` ghi `face_avoidance.status = "no-data"` và `qa_content.py` in cảnh báo, **không** coi là PASS |
| L2 | **Chưa tách vùng mắt/miệng.** `face_avoidance.protected_features` được ghi nhận nhưng engine chỉ né **hộp mặt** chứ không né riêng mắt/miệng | Chữ không được đặt lên mặt; chưa chứng minh được không đè lên mắt/miệng |
| L3 | **Mốc thời gian là ước lượng khi không có `--alignment`.** Dùng `promo_core.draft_alignment` (4,6 âm tiết/giây) | `qa_content.json` ghi `timing_source`. **Không** có ground-truth để chứng minh lệch ≤ 80 ms (`docs/OVERNIGHT_BRIEF.md:60`) |
| L4 | **B-roll là placeholder hoặc ảnh của bạn.** Không có ảnh AI, không có ảnh stock | Engine không tạo ảnh. Chất lượng hình ảnh phụ thuộc tài liệu bạn đặt vào `assets/broll/` |
| L5 | **SFX là âm tổng hợp bằng ffmpeg**, không phải thư viện âm thanh | `soft_riser` = chirp 200→1200 Hz/600 ms; `single_impact` = sine 90 Hz + 45 Hz/250 ms. Ghi nhãn rõ trong báo cáo |
| L6 | **Demo không có voice** → track âm thanh là im lặng + SFX. Đo được `-30,7 LUFS` (không đạt chuẩn `-14 LUFS`) | Chuẩn `-14 LUFS ±0,5` chỉ áp dụng khi có `--voice`; `*.qc.json` ghi `voice_present: false` |
| L7 | **Chỉ xuất 16:9.** Không tự sinh bản 9:16 | `render_master.py` của pack cứng 1080×1920, nên skill này dùng riêng `templates/hyperframes/render.py` |
| L8 | **Quy tắc "ẩn sub khi màn nhiều chữ" là quy tắc mới** do track này định nghĩa, không phải yêu cầu có sẵn của pack | Ngưỡng 0,5 có thể chỉnh bằng `--caption-hide-ratio` |
| L9 | **Chưa thử Windows / Linux.** Môi trường đo: macOS + Chromium 1248 + ffmpeg 9.0.2 + Python 3.14.7 | `docs/OVERNIGHT_BRIEF.md:61` cũng ghi chưa có test Windows/Linux |
| L10 | **Thời gian render 3,2 phút cho 29,6 s @ 30 fps** trên máy đo (đo lại 22/10/2026, `time` khi chạy `render.py`) | Trang thật nặng hơn trang tối giản (đo trước đó: 49,9 ms/frame). Số này KHÔNG áp dụng cho máy khác |
| L11 | **Chuẩn âm thanh chỉ kiểm được trên bản CÓ `--voice`.** Bản demo không có voice nên không đạt `-14 LUFS` và cũng **không** được kết luận là đạt | `render.py` đo lại bằng `rvlib.measure_loudness()` rồi mới kết luận; `*.qc.json` ghi `voice_present` + `loudness_check` |
| L12 | **Hiệu chỉnh âm thanh dùng gain đơn giản (không nén động)** nên giữ nguyên tỉ lệ voice/SFX, nhưng nếu voice quá ngắn so với video thì phần im lặng cuối vẫn được tính vào thời lượng | Đo thật: voice 10 s + video 31,8 s → vẫn ra `-14,0 LUFS` nhờ cổng EBU R128 loại khoảng lặng, nhưng người xem sẽ nghe phần lặng đó |

---

## 7. CẤU TRÚC SKILL

```
skills/tvt-magazine-type/
├── SKILL.md                          # tài liệu này
├── scripts/
│   ├── build.py                      # JSON -> project (HTML/CSS/JS + render_config.json)
│   ├── render.py                     # wrapper của templates/hyperframes/render.py (out trong skills/tvt-magazine-type/out/)
│   ├── qa_content.py                 # schema + luật skill 03 -> JSON, exit 2 khi FAIL
│   ├── make_face_boxes.py            # crop_plan.json -> face_boxes.json
│   ├── make_demo.sh                  # tái tạo video demo từ file sạch
│   └── selftest.sh                   # build -> qa -> render -> ffprobe, exit 0/2
├── kit/
│   ├── style.css                     # token + bố cục editorial
│   ├── engine.js                     # bản sao promo_engine.js + phần mở rộng data-draw
│   └── fonts/                        # Playfair Display (OFL) + OFL.txt
├── assets/
│   ├── README.md                     # hướng dẫn đặt ảnh thật
│   └── broll/                        # đặt scene_01.jpg, scene_02.jpg, ...
├── examples/
│   ├── tvt-magazine-type.json        # input mẫu đúng schema
│   ├── face_boxes.json               # mẫu hộp khuôn mặt (để thấy né mặt chạy thật)
│   └── out/
│       ├── editorial_premium_demo.mp4    # video demo 29,6 s đã render
│       └── editorial_premium_demo.qc.json
└── out/                              # sinh ra khi chạy (không commit)
```

Lõi dùng chung (KHÔNG sửa): `templates/hyperframes/{promo_core.py, promo_engine.js, render.py}`,
`retention_video_skills_pack/tools/{rvlib.py, engine_core.py, qc_engine.py}`.

---

## 8. ĐỔI ẢNH MINH HỌA

Xem `assets/README.md`. Tóm tắt: đặt `assets/broll/scene_NN.jpg` (1920×1080 khuyến nghị),
`NN` = số thứ tự cảnh trong `timeline[]`. Thiếu ảnh → engine dựng khung placeholder có nhãn
`B-ROLL PLACEHOLDER`. Không có ảnh AI, không có ảnh stock.

---

## 9. VÍ DỤ

```bash
# video demo nằm trong repo
ffprobe skills/tvt-magazine-type/examples/out/editorial_premium_demo.mp4
# -> 1920x1080, h264, yuv420p, 30 fps, 29.6 s, có 1 stream aac

# tái tạo y hệt từ file sạch
bash skills/tvt-magazine-type/scripts/make_demo.sh
```

Trong ví dụ mẫu:
- cảnh 3 (`quote`) có khuôn mặt trong `face_boxes.json` → engine **tự dời khối chữ** từ cột 1–6
  sang cột 7–12 (báo cáo `layout[2].rule = "fit+face"`).
- cảnh 5 (`claim`, văn bản dày) có `text_area_ratio = 0,504 ≥ 0,5` → **caption bị ẩn**
  (`scenes_with_caption_hidden = 1`).
- cảnh 2 (`data`) tô màu accent cho số `64%`.

## Tham Số Đầu Vào Của Kỹ Năng
- **article_title** (Tiêu đề bài viết phong cách tạp chí): `{{article_title}}`
- **key_quotes** (Trích dẫn ấn tượng và số liệu chuyên gia): `{{key_quotes}}`
13.209 ký tự · ~3.669 tokens đã điền còn trống

Câu hỏi thường gặp

High-End Editorial Magazine Typography Video Engine dùng để làm gì?

High-End Editorial Magazine Typography Video Engine là một Agent Skill (SOP chuẩn SKILL.md) thuộc nhóm Video & Motion, giúp high-End Editorial Magazine Typography Video Engine — Quy trình tự động hóa sản xuất video bằng mã nguồn (Hyperframes / Code-driven Video Engine). Cần 2 đầu vào: Tiêu đề bài viết phong cách tạp chí; Trích dẫn ấn tượng và số liệu chuyên gia. Dùng trực tiếp với ChatGPT, Claude, Cursor/Windsurf hoặc xuất SKILL.md cho Claude Code, OpenClaw, Hermes.

Cần chuẩn bị những thông tin đầu vào nào?

Tiêu đề bài viết phong cách tạp chí ({{article_title}}); Trích dẫn ấn tượng và số liệu chuyên gia ({{key_quotes}}). Mỗi biến có ô nhập riêng và giá trị mẫu để thử ngay.

Dùng High-End Editorial Magazine Typography Video Engine với ChatGPT, Claude hoặc Cursor như thế nào?

1. DÙNG KHI NÀO: Dùng cho | Video diễn giải 16:9 phong cách editorial — luận điểm, số liệu, trích dẫn, định nghĩa. Nền sáng, chữ serif, nhiều khoảng thở | 2. PIPELINE: PIPELINE 3. Tuỳ chọn: Tuỳ chọn | Tác dụng | 4. SCHEMA — trường JSON -> hiệu ứng hình: Trường | Hiệu ứng |

Skill này có những quality gate nào?

Trước khi bàn giao, agent phải vượt qua: Editorial Typographic Hierarchy Gate; Grid Alignment Gate; Pacing & Whitespace Gate.

  • SkillTVT Agency

    Automated Motion Graphic B-Roll Generator — Quy trình tự động hóa sản xuất video bằng mã nguồn (Hyperframes / Code-driven Video Engine).

    #Video#B-Roll#Motion Graphics#Word-Level Timing
    Video & Motion3 gatesChi tiết
  • SkillTVT Agency

    Automated Word-Level Silence Cut & Footage Trimmer — Quy trình tự động hóa sản xuất video bằng mã nguồn (Hyperframes / Code-driven Video Engine).

    #Video#Auto Cut#Silence Removal#Word-Level EDL
    Video & Motion3 gatesChi tiết
  • SkillTVT Agency

    B2B Service Showcase Video Production Assembly Line — Quy trình tự động hóa sản xuất video bằng mã nguồn (Hyperframes / Code-driven Video Engine).

    #Video#Service Promo#B2B Video#Agency Delivery
    Video & Motion3 gatesChi tiết