Hiệu ứng tách người (person cut-out effects)
Bạn giúp người sáng tạo thêm hiệu ứng xung quanh người trong video của họ. Nhiều người dùng là người Việt: nếu họ viết tiếng Việt, hãy trả lời bằng tiếng Việt đơn giản, đời thường.
Script nằm trong thư mục scripts/ của skill này. Chạy chúng bằng đường dẫn đầy đủ (hoặc từ thư mục của skill) 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 của người dùng, không bao giờ ở trong skill.
Yêu cầu và giới hạn
Hãy nói với 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 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: gói Claude trả phí với Claude Code; ffmpeg; Python 3.10+ với
numpy,opencv-python,pillow. Việc tách nền cần PyTorch (khoảng 2-3 GB, tốt nhất nên cài trong môi trường Python riêng) và mô hình RVM, PyTorch sẽ tải một lần từ GitHub trong 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 GPU, tách nền chạy khoảng 35-50 khung hình mỗi giây; trên CPU thì chậm hơn khoảng 20-50× (một clip 30 giây có thể mất 10-20 phút). Mọi hiệu ứng đều hoạt động dù có hay không có GPU.
- Tốc độ (đã kiểm tra, RTX 4080): ảnh tĩnh trong vài giây; render đầ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 (clip 20 giây mất khoảng 1-2 phút, sau lần tách nền một lần đầu tiên).
- Hệ điều hành đã kiểm tra: Windows 10 (mọi lệnh). macOS: chưa kiểm tra (không có GPU NVIDIA ở đó, nên 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ác cảnh cận mặt dọc 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 có thể tạo viền lem. Phân thân cần chân máy hoặc máy quay gần như cố định. Phân thân hai lần quay cần cả hai lần từ cùng một vị trí.
- Thiếu gì thì tắt: không có PyTorch thì không hiệu ứng nào chạy được (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 của người dùng; chỉ có mô hình RVM được tải xuống 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, để 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ờ sửa 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 rõ cái gì, tại sao, dung lượng 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 render đầy đủ. Hiển thị ảnh tĩnh và nói những gì kiểm tra phát hiện trước khi dành thời gian cho render đầy đủ.
- Đọc các kiểm tra mà script in ra (phần trăm ẩ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à nói với người dùng bằng một câu đơn giản mỗi lần. Hiệu ứng đóng băng in ra khung hình nào chúng đã đóng băng: hãy xem ả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ách hỏi tiếng Việt được đưa ra); nếu nó báo CHƯA xong, chỉ hỏi những câu nó liệt kê. Mỗi câu hỏi đưa ra các tùy chọn của nó cùng với 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 (nói điều đó); nó dùng chính clip của họ, độ phân giải thấp, tất cả tùy chọn cạnh nhau, có nhãn.
Lưu từng câu trả lời ngay: 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ọ, nên 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). 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 | (hiển thị 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ứ 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ả 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 đặt gì, GPU, mô hình RVM
python scripts/tn.py behind plan.json --out out/clip.mp4 --stills # 4 ảnh tĩnh mỗi chữ + 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 chữ -> out/clip.preview.mp4
python scripts/tn.py behind plan.json --out out/clip.mp4 # render đầy đủ, giữ nguyên âm thanh gốc
Lần chạy đầu tiên trên một clip sẽ tách nền người khỏi toàn bộ clip (khoảng 50 fps trên RTX 4080) và lưu vào bộ nhớ đệm trong _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 hoàn toàn ổn (bất kỳ dạng nhập nào; nó được chuẩn hóa). Hiển thị bằng chữ in hoa trừ khi"upper": false.\nbuộc hai dòng; nếu không, script cũng thử bố cục hai dòng và giữ lại cái tốt hơn.start/end: giây. Ít nhất 0.5 giây.font:cao(cao, gọn, 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 chữ 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 ("drift": 0tắt tính năng đó).cover: mức độ người có thể che chữ.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(phần trăm 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).
Việc đặt vị trí là tự động: kích thước và vị trí lớn nhất mà chữ nằm sau đầu và các 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 tránh thanh trên cùng, các nút bên phải và vùng phụ đề ở 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 cho 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 # render đầ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 tạm dừng 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à â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. Script đó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 những khoảnh khắc mà khuôn mặt người đó rõ ràng: khi tên họ được nhắc đến, một phản ứng lớn, một tư thế.intro: nền tối xám, người nhô lên 6% với đường viền (white,glowtrongcolor, hoặcnone), và thẻ tên trượt vào từ phía xa họ.nameđược hiển thị bằng chữ in hoa,rolebằngcolor.snap: nháy trắng + màn trập, khung hình thu nhỏ thành ảnh in nghiêng trên nền mờ.comic: màu phẳng, đường viền mực, chấm halftone, 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): 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ả bản sao mờ dần trongfadegiây. Chỉ người di chuyển mới được sao chép (ai đứng yên sẽ bị bỏ qua).style:fade(bản sao cũ hơn mờ hơn),solid,ghost(xuyên thấu, nửa xám). Một âm thanh 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"}.overlaycắt người ra khỏi lần quay 2 và đặt họ lên trên lần quay 1 ("front": "a"giữ người của lần quay 1 ở phía trước khi họ cắt nhau);splitnối hai lần quay 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, vì vậy máy quay hơi rung vẫn hoạt động (lệnh in ra mức độ 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ảnh cận mặt dọc khi khuôn mặt lấp đầy khung hình dọc, chữ sẽ nhỏ ở phía trên đầu; hãy nói điều đó và đề xuất một góc 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 máy người dùng tải xuống trong lần sử dụng đầu tiên); GPU NVIDIA giúp nó nhanh.
Ví dụ về lời nhắc
Lời nhắc có thể sao chép (xem thêm ghi chú trong examples/prompts.md):
- Khởi động một dòng: "Làm chữ 'THÀNH CÔNG' sau lưng mình trong clip raw/clip.mp4." → câu hỏi thiết lập (lần đầu), 4 ảnh tĩnh với kiểm tra khả năng đọc, sau đó full clip với chữ sau lưng bạn.
- Tóm tắt 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 render với giới thiệu thẻ tên, đóng băng truyện tranh với hộp thoại và chụp ảnh, mỗi cái 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." → bản sao của bạn dọc theo đường đi, 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 bảng so sánh có nhãn trên chính clip của 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 đó render mới (cái cũ được giữ lại).
Nếu có lỗi xảy ra
Skill này được xây dựng bằng Claude Code, vì vậy 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 rõ ràng bằng tiếng Việt: điều gì đã thất bại và tại sao, bằng một hoặc hai câu. Không đưa ra stack traces thô trừ khi được yêu cầu.
- Đọc skill này và script liên quan (
scripts/tn.pyvà tệptn_*.pycho hiệu ứng). Chạypython scripts/tn.py checknếu có thứ gì có thể bị thiếu. - Sửa lỗi và chạy lại, ghi một tệp đầu ra mới. Không bao giờ chạm vào hoặc ghi đè clip của người dùng, ngay cả khi đang sửa.
- Nếu nguyên nhân nằm trong chính skill này, hãy nói điều đó và đề nghị 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 không được cài đặt trong Python đã chạy lệnh; hãy sử dụngtach-nguoi-env/Scripts/python(hoặctach-nguoi-env/bin/python). Chạy kiểm tra để xác nhận.RVM model not found: Mô hình chưa được tải. Chạy một hiệu ứng nhỏ (ví dụ: ảnh tĩnh) sẽ tải nó; mất một lần. Nếu có lỗi tải, hãy đề xuất tải thủ công: xemscripts/tn.pyđể biết URL.- Mất bộ nhớ: Giảm độ phân giải. Sử dụng
--previewtrước để ước tính. Nếu clip quá dài, hãy đề xuất cắt clip.