Hiệu ứng tách người (person cut-out effects)
Bạn hỗ trợ người sáng tạo thêm hiệu ứng xoay quanh chính họ trong video. Nhiều người dùng là người Việt: nếu họ viết bằng tiếng Việt, hãy trả lời bằng tiếng Việt giao tiếp, giản dị.
Các tập lệnh nằm trong thư mục scripts/ của kỹ năng này. Chạy chúng bằng đường dẫn đầy đủ (hoặc từ thư mục của kỹ năng) khi đang làm việc trong thư mục của người dùng: tệp cài đặt và mọi đầu ra đều nằm trong thư mục người dùng, không bao giờ ở trong kỹ năng.
Yêu cầu và giới hạn
Hãy thông báo cho người dùng những điều này trước khi cài đặt bất cứ thứ gì và bất cứ khi nào có yêu cầu cần thứ gì đó còn thiếu.
python scripts/tn.py check hiển thị những gì đã có.
- Cần có: gói Claude trả phí với Claude Code; ffmpeg; Python 3.10+ với
numpy,opencv-python,pillow. Tác vụ tách nền cần PyTorch (khoảng 2-3 GB, tốt nhất trong môi trường Python riêng) và mô hình RVM, mà PyTorch tải xuống một lần từ GitHub ở lần tách nền đầu tiên (khoảng 15-100 MB). - GPU: card NVIDIA được khuyến nghị mạnh mẽ. Với card này, tác vụ tách nền chạy khoảng 35-50 khung hình/giây; trên CPU thì chậm hơn khoảng 20-50 lần (một clip 30 giây có thể mất 10-20 phút). Mọi hiệu ứng đều hoạt động theo cả hai cách.
- Tốc độ (đã kiểm tra, RTX 4080): ảnh tĩnh trong vài giây; kết xuất đầy đủ ở 1080p chạy 18-27 fps cho chữ sau lưng và phân thân và 9-19 fps cho hiệu ứng đóng băng (một clip 20 giây mất khoảng 1-2 phút, sau khi tách nền một lần).
- HĐH đã kiểm tra: Windows 10 (mọi lệnh). macOS: chưa được kiểm tra (không có GPU NVIDIA ở đó, nên tác vụ tách nền chậm).
- Giới hạn: hoạt động tốt nhất với một hoặc hai người và có khoảng trống phía trên hoặc bên cạnh đầu. Cận cảnh dọc quá chặt sẽ làm chữ nhỏ. Chuyển động nhanh, tóc trên nền phức tạp và vật thể trong suốt sẽ tạo ra các cạnh thô. Phân thân cần chân máy hoặc máy quay gần như đứng yên. Phân thân hai lần quay cần cả hai lần quay từ cùng một vị trí.
- Cái gì sẽ tắt nếu thiếu: nếu không có PyTorch, không có hiệu ứng nào có thể chạy (mọi hiệu ứng đều cần tách nền). Hãy nói điều đó và đề nghị cài đặt (hỏi trước).
- Quyền riêng tư: mọi thứ đều chạy trên máy tính của người dùng; bản tải xuống duy nhất là mô hình RVM, một lần.
Cài đặt PyTorch (hỏi trước; nói rằng nó khoảng 2-3 GB)
Trong một môi trường riêng, để nó không làm hỏng các công cụ Python khác:
python -m venv tach-nguoi-env
tach-nguoi-env/Scripts/python -m pip install numpy opencv-python pillow (macOS/Linux: tach-nguoi-env/bin/python)
tach-nguoi-env/Scripts/python -m pip install torch --index-url https://download.pytorch.org/whl/cu126 (NVIDIA GPU)
tach-nguoi-env/Scripts/python -m pip install torch (không có NVIDIA GPU)
Sau đó chạy mọi lệnh tn.py với Python đó (tach-nguoi-env/Scripts/python scripts/tn.py ...).
Quy tắc (luôn luôn)
- Không bao giờ thay đổi clip gốc của người dùng. Đọc chúng; ghi mọi kết quả thành tệp mới bên cạnh kế hoạch (hoặc nơi người dùng yêu cầu). Không có gì bị ghi đè: chọn tên mới.
- Hỏi trước khi cài đặt bất cứ thứ gì (nói cái gì, tại sao, kích thước bao nhiêu, lệnh chính xác).
- Ảnh tĩnh trước, sau đó xem trước độ phân giải thấp, rồi kết xuất đầy đủ. Hiển thị ảnh tĩnh và nói những gì các kiểm tra tìm thấy trước khi dành thời gian cho kết xuất đầy đủ.
- Đọc các kiểm tra mà tập lệnh in ra (% bị ẩn, độ tương phản, ghi chú KHÔNG ĐỌC ĐƯỢC; cũng được lưu trong
checks.jsonbên cạnh ảnh tĩnh) và thông báo cho người dùng bằng từng câu đơn giản. Hiệu ứng đóng băng in ra khung hình mà chúng đã đóng băng: hãy nhìn vào ảnh tĩnh.
Thiết lập (chỉ lần đầu)
Trước hiệu ứng đầu tiên, chạy python scripts/tn.py settings. Nếu nó báo CHƯA lưu, hãy hỏi các câu hỏi thiết lập bên dưới, từng câu một, bằng ngôn ngữ của người dùng (có kèm từ tiếng Việt); nếu nó báo CHƯA hoàn thành, chỉ hỏi những câu nó liệt kê. Mỗi câu hỏi đều đưa ra các tùy chọn của nó cộng thêm hai tùy chọn nữa:
- "Mình chưa chắc, giải thích giúp mình": giải thích bằng một hoặc hai câu đơn giản tùy chọn đó thay đổi điều gì, sau đó hỏi lại.
- "Cho mình xem hết để so sánh": chạy
python scripts/tn.py sample <kind> <their clip> --out <project>/tach-nguoi-mau/<kind>.mp4 --text "<một từ trong video của họ>", hiển thị tệp, sau đó hỏi lại. Mất 5-40 giây (hãy nói điều đó); nó sử dụng clip của chính họ, độ phân giải thấp, mọi tùy chọn cạnh nhau, có nhãn.
Lưu từng câu trả lời ngay lập tức: python scripts/tn.py settings set <key>=<value>. Câu trả lời nằm trong tach-nguoi.settings.json trong thư mục dự án của họ, vì vậy thiết lập sẽ không bao giờ chạy lại trừ khi họ yêu cầu ("làm lại phần cài đặt" → tn.py settings reset, sau đó hỏi lại). Các kế hoạch vẫn có thể ghi đè bất kỳ cài đặt nào cho một video.
| # | Câu hỏi (tiếng Việt) | Tùy chọn → giá trị | key | loại mẫu |
|---|---|---|---|---|
| 1 | Video của bạn đăng ở đâu nhiều nhất? | TikTok → tiktok · YouTube Shorts → shorts · Reels → reels · YouTube video ngang → youtube | platform | platform |
| 2 | Bạn thích kiểu chữ nào? | Chữ cao, gọn → cao · Chữ đậm → dam · Đậm vừa → dam-vua | font | font |
| 3 | Chữ màu gì? | Trắng → #ffffff · Vàng → #ffd400 · Đen → #111111 · Màu của kênh (hỏi mã màu) | color | color |
| 4 | Người che chữ tới mức nào? | Ít, chữ lúc nào cũng dễ đọc → light · Vừa → medium · Nhiều, kiểu trend → bold | cover | cover |
| 5 | Chữ hiện ra kiểu nào? | Trồi lên → rise · Bật ra → pop · Hiện từng chữ cái → letters · Hiện luôn → none | anim | anim |
| 6 | Lúc giới thiệu nhân vật, viền quanh người kiểu nào? | Viền trắng → white · Viền phát sáng → glow · Không viền → none | outline | outline |
| 7 | Màu điểm nhấn (vạch cạnh tên, dòng chức danh, hộp chữ truyện tranh)? | Vàng → #ffd400 · Màu của kênh (hỏi mã màu) | accent | (show outline) |
| 8 | Có thêm tiếng động không? | Có → on · Không → off | sfx | sfx (phát từng âm thanh) |
Giải thích cho "chưa chắc":
- Mỗi app che một phần màn hình (nút bấm bên phải, phần mô tả bên dưới). Mình đặt chữ và bảng tên tránh mấy chỗ đó.
- Chữ cao, gọn nhìn giống mấy video trend nhất; chữ đậm dễ đọc trên điện thoại nhỏ.
- Mình tự kiểm tra độ tương phản: chữ khó đọc trên nền thì mình thêm bóng mờ và báo bạn.
- "Ít" thì đầu chỉ chạm nhẹ vào chữ. "Nhiều" thì đầu che hẳn một hai chữ cái giữa từ, nhìn giống trend hơn nhưng khó đọc hơn. Chữ cái đầu và cuối mỗi từ luôn được giữ lại.
- Chỉ là cách chữ xuất hiện trong nửa giây đầu.
- Viền giúp người nổi lên khỏi nền tối khi video dừng hình.
- Tiếng động được tạo mới hoàn toàn, không dính bản quyền.
Đừng hỏi về những thứ mà clip đã trả lời (hình dạng, độ dài của nó). Nếu người dùng nói "cứ làm đi" hoặc "mặc định", chạy python scripts/tn.py settings defaults (tiktok, cao, trắng, medium, rise, white, điểm nhấn vàng, bật âm thanh) và tiếp tục.
Lệnh
Tất cả các lệnh đều chạy với Python có các gói (xem python scripts/tn.py check).
python scripts/tn.py check # đã cài gì, GPU, mô hình RVM
python scripts/tn.py behind plan.json --out out/clip.mp4 --stills # 4 ảnh tĩnh mỗi văn bản + kiểm tra (nhanh)
python scripts/tn.py behind plan.json --out out/clip.mp4 --preview # nửa kích thước, chỉ phạm vi văn bản -> out/clip.preview.mp4
python scripts/tn.py behind plan.json --out out/clip.mp4 # kết xuất đầy đủ, giữ nguyên âm thanh gốc
Lần chạy đầu tiên trên một clip sẽ tách người ra khỏi toàn bộ clip (khoảng 50 fps trên RTX 4080) và lưu cache vào _tach-nguoi-work/ bên cạnh đầu ra.
Tệp kế hoạch (bạn viết nó)
{"clip": "raw/my-clip.mp4",
"items": [{"text": "Thành công", "start": 1.0, "end": 7.0,
"font": "cao", "color": "#ffffff", "anim": "rise", "cover": "medium"}]}
text: tiếng Việt được chấp nhận (mọi dạng đầu vào; nó được chuẩn hóa). Được hiển thị bằng chữ in hoa trừ khi"upper": false. Ký tự\nbuộc thành hai dòng; nếu không, tập lệnh cũng thử bố cục hai dòng và giữ lại bố cục tốt hơn.start/end: giây. Ít nhất 0,5 giây.font:cao(cao, gọn gàng, kiểu cổ điển),dam(đậm),dam-vua(siêu đậm) hoặc đường dẫn tới tệp .ttf.anim:rise,pop,letters(từng chữ một),none. Mọi văn bản cũng mờ dần trong 0,25 giây và đẩy vào 3% trong suốt thời gian tồn tại của nó ("drift": 0tắt tính năng đó).cover: mức độ người có thể che văn bản.light(luôn dễ đọc),medium(mặc định),bold(kiểu trend nặng).- Tùy chọn:
x,y(tâm 0-1, để đặt bằng tay),width(tỷ lệ chiều rộng khung hình),shadow(0-1 phát sáng; được đặt tự động từ kiểm tra độ tương phản).
Vị trí tự động: kích thước lớn nhất và vị trí mà văn bản nằm sau đầu và chữ cái đầu và cuối của mỗi từ vẫn hiển thị, trong vùng an toàn của nền tảng (9:16 giữ khoảng cách với thanh trên, các nút bên phải và khu vực chú thích ở dưới cùng).
Hiệu ứng đóng băng khung hình
python scripts/tn.py freeze plan.json --out out/clip.mp4 --stills # ảnh tĩnh chính mỗi lần đóng băng (nhanh)
python scripts/tn.py freeze plan.json --out out/clip.mp4 --preview # nửa kích thước -> out/clip.preview.mp4
python scripts/tn.py freeze plan.json --out out/clip.mp4 # kết xuất đầy đủ
{"clip": "raw/my-clip.mp4",
"items": [
{"effect": "intro", "at": 2.0, "name": "Anh Tuấn", "role": "Đầu bếp · 20 năm nghề", "outline": "white", "color": "#ffd400"},
{"effect": "snap", "at": 8.5},
{"effect": "comic", "at": 13.2, "caption": "Ủa, thiệt hả?!"}
]}
- Video dừng lại trên một khung hình trong
holdgiây (mặc định: intro 2.4, snap 1.6, comic 1.8), sau đó tiếp tục. Clip dài ra do các lần dừng; âm thanh gốc cũng tạm dừng và các âm thanh riêng của hiệu ứng phát ra (được tạo từ đầu, không có giấy phép;"sfx": falsetắt chúng,"sfx_gain"điều chỉnh âm lượng). atlà thời gian trong clip nguồn. Tập lệnh đóng băng trên khung hình sắc nét nhất trong vòng ±0,25 giây (không bị nhòe chuyển động);"exact": truegiữ nguyên khung hình chính xác. Chọn thời điểm khuôn mặt người rõ ràng: khi tên họ được nói, một phản ứng lớn, một tư thế.intro: nền chuyển sang tối và xám, người nhô lên 6% với một đường viền (white,glowvớicolor, hoặcnone) và thẻ tên trượt vào ở phía xa họ.nameđược hiển thị bằng chữ in hoa,rolebằngcolor.snap: đèn flash trắng + màn trập, khung hình thu nhỏ thành ảnh in nghiêng trên bản sao bị làm mờ.comic: màu phẳng, đường mực, chấm bán sắc, các đường tốc độ nhấp nháy phía sau người, hộpcaptiontùy chọn (colorđặt màu hộp).
Phân thân (clones)
python scripts/tn.py clone plan.json --out out/clip.mp4 --stills | --preview | (đầy đủ)
{"clip": "raw/walk.mp4",
"items": [{"effect": "trail", "start": 6.3, "end": 13.0, "every": 0.8, "style": "fade", "fade": 0.6}]}
trail(một lần quay): trong khi người di chuyển, một bản sao được để lại mỗieverygiây giữastartvàendvà ở lại, sau đó tất cả các bản sao mờ dần trongfadegiây. Chỉ người di chuyển mới được sao chép (người đứng yên sẽ không bị ảnh hưởng).style:fade(các bản sao cũ hơn mờ hơn),solid,ghost(trong suốt, nửa xám). Một âm thanh nhấp nháy nhẹ phát ra khi mỗi bản sao xuất hiện ("sfx": falseở đầu kế hoạch tắt nó).two(hai lần quay, một người trong hai vai):{"effect": "two", "second": "raw/take2.mp4", "start": 0, "end": 10, "b_start": 0, "mode": "overlay"}.overlaytách người ra khỏi take 2 và đặt họ lên trên take 1 ("front": "a"giữ người của take 1 ở phía trước nơi họ băng qua);splitnối hai take dọc theo cột trống nhất, với một đường nối mềm.- Cả hai đều căn chỉnh mọi khung hình với nền trước, do đó máy quay hơi trôi vẫn hoạt động (lệnh in ra khoảng cách máy quay đã di chuyển). Chân máy vẫn là tốt nhất: máy quay di chuyển, lia hoặc cầm tay với các chuyển động lớn sẽ không căn chỉnh được.
Giới hạn đã biết
- Hoạt động tốt nhất khi có khoảng trống phía trên hoặc bên cạnh đầu. Trong cận cảnh chặt, nơi khuôn mặt lấp đầy khung hình dọc, văn bản sẽ nhỏ phía trên đầu; hãy nói điều đó và đề xuất một cảnh quay rộng hơn hoặc
cover: bold. - Tách nền toàn bộ video cần PyTorch và mô hình RVM (GPL-3.0, được tải xuống bởi máy người dùng trong lần sử dụng đầu tiên); GPU NVIDIA giúp nó nhanh.
Ví dụ lời nhắc
Các lời nhắc sao chép-dán (thêm ghi chú trong examples/prompts.md):
- Một dòng khởi đầu: "Làm chữ 'THÀNH CÔNG' sau lưng mình trong clip raw/clip.mp4." → các câu hỏi thiết lập (lần đầu), 4 ảnh tĩnh kèm kiểm tra khả năng đọc, sau đó toàn bộ clip với chữ sau lưng bạn.
- Yêu cầu chi tiết: "Clip raw/phong-van.mp4: giây 2 giới thiệu nhân vật tên 'Chị Lan', chức danh 'Chủ quán phở · 15 năm', giây 9 dừng hình kiểu truyện tranh với câu 'Thiệt luôn hả?!', giây 14 chụp ảnh dừng hình. Có tiếng động." → một kết xuất với phần giới thiệu thẻ tên, một lần đóng băng truyện tranh với hộp thoại và một bức ảnh chụp nhanh, mỗi cái đều có âm thanh riêng.
- Chữ sau lưng, kiểu trend: "Chữ 'ĐÀ LẠT' sau lưng mình, cho đầu che nhiều như trend, chữ vàng, hiện từng chữ cái."
- Phân thân: "Clip raw/di-bo.mp4 mình đi ngang qua: để lại bóng mình mỗi 0,8 giây rồi mờ dần." → các bản sao của bạn được để lại dọc theo đường đi của bạn, mờ dần cùng nhau.
- Hai lần quay: "Mình quay 2 lần cùng chỗ (raw/vai-a.mp4, raw/vai-b.mp4), ghép thành 2 người nói chuyện với nhau."
- So sánh: "Cho mình xem các kiểu chữ để so sánh." → một hình ảnh cạnh nhau có nhãn trên clip của riêng bạn.
- Ghi chú chỉnh sửa: "Chữ to hơn chút, dời lên trên, dừng hình lâu hơn 1 giây, bỏ tiếng chụp ảnh." → chỉ những thay đổi đó; ảnh tĩnh mới, sau đó kết xuất mới (bản cũ được giữ lại).
Nếu có sự cố xảy ra
Kỹ năng này được xây dựng với Claude Code, vì vậy nó có thể có lỗi và mỗi máy tính đều khác nhau. Khi một bước thất bại, hoặc người dùng nói kết quả trông sai:
- Giải thích đơn giản bằng tiếng Việt: cái gì bị lỗi và tại sao, bằng một hoặc hai câu. Không hiển thị stack trace thô trừ khi được yêu cầu.
- Đọc kỹ năng này và tập lệnh liên quan (
scripts/tn.pyvà tệptn_*.pycho hiệu ứng). Chạypython scripts/tn.py checknếu có thể có thứ gì đó bị thiếu. - Sửa nó và chạy lại, viết tệp đầu ra mới. Không bao giờ chạm vào hoặc ghi đè lên clip của người dùng, ngay cả khi đang sửa.
- Nếu nguyên nhân nằm trong chính kỹ năng này, hãy nói điều đó và đề xuất báo cáo để nó được sửa cho mọi người: https://github.com/thegentleminh/thegentleminh-skills/issues
Lỗi thường gặp
No module named 'torch': PyTorch chưa được cài đặt trong Python đã chạy lệnh; hãy sử dụng Pythontach-nguoi-env(xem phần cài đặt ở trên).