Hiệu ứng tách người (person cut-out effects)
Bạn giúp một người sáng tạo thêm hiệu ứng xoay quanh nhân vật trong video của họ. 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 đơn giản, nói tự nhiên.
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 của người dùng, không bao giờ nằm 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 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 người 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 một lần từ GitHub trong lần tách đầu tiên (khoảng 15-100 MB). - GPU: card NVIDIA được khuyến nghị mạnh mẽ. Nếu có, việc tách người chạy khoảng 35-50 khung hình mỗi giây; trên CPU nó 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; render đầy đủ ở 1080p chạy 18-27 fps cho hiệu ứng chữ sau lưng và phân thân, và 9-19 fps cho hiệu ứng dừng hình (một clip 20 giây mất khoảng 1-2 phút, sau lần tách người một lầ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 người 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 thẳng đứng sẽ làm chữ nhỏ. Chuyển động nhanh, tóc trên nền phức tạp và các vật thể trong suốt có thể tạo 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 cảnh quay cần cả hai cảnh từ cùng một vị trí.
- Những gì sẽ tắt nếu thiếu: không có PyTorch, không hiệu ứng nào chạy được (mọi hiệu ứng đều cần tách người). Hãy nói điều đó và đề xuất 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 biệt, để 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 một 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 render đầy đủ. Hiển thị ảnh tĩnh và nói những gì kiểm tra tìm thấy trước khi dành thời gian cho render đầy đủ.
- Đọc các kết quả kiểm tra mà tập lệnh in ra (% ẩ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 cái. Hiệu ứng dừng hình in khung hình mà chúng dừng lại: 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 diễn đạt tiếng Việt được đưa ra); 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 cung cấp 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 lựa 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 ngay mỗi câu trả lời: 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 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 cần đưa ra cho "chưa chắc":
- Mỗi ứng dụng 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 của nó, độ 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, màu nhấn vàng, âm thanh bật) và tiếp tục.
Cá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 # những gì đã cài đặt, 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 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 được chấp nhận (bất kỳ dạng đầu vào nào; nó được chuẩn hóa). Sẽ được hiển thị dưới dạng chữ hoa trừ khi"upper": false. Một\nbuộc hai dòng; nếu không, tập lệnh 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(chữ cao, hẹp, kiểu cổ điển),dam(chữ đậm),dam-vua(chữ đậm vừa), hoặc đường dẫn đến tệp .ttf.anim:rise,pop,letters(từng chữ cái 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 của nó ("drift": 0tắt điều đó).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 thủ công),width(phần của chiều rộng khung hình),shadow(phát sáng 0-1; được đặt tự động từ kiểm tra độ tương phản).
Vị trí được đặt tự động: kích thước lớn nhất và vị trí nơi 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ị, bên trong vùng an toàn của nền tảng (9:16 tránh thanh trên cùng, nút bên phải và khu vực chú thích ở dưới cùng).
Hiệu ứng dừng hình (freeze-frame)
python scripts/tn.py freeze plan.json --out out/clip.mp4 --stills # ảnh tĩnh chính cho mỗi lần dừ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 trở nên dài hơn do các lần tạm dừng; âm thanh gốc cũng tạm dừng và âm thanh của hiệu ứng phát (được tạo từ đầu, không có bản quyền;"sfx": falsetắt chúng,"sfx_gain"điều chỉnh chúng). atlà thời gian trong clip nguồn. Tập lệnh dừng trên khung hình nét nhất trong vòng ±0,25 giây (không có mờ chuyển động);"exact": truegiữ nguyên khung hình chính xác. Hãy chọn những khoảnh khắc mà khuôn mặt của 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 trở nên tối và xám, người nhảy về phía trước 6% với một đường viền (white,glowtrongcolorhoặcnone) và bảng tên trượt vào phía đối diện với họ.nameđược hiển thị dưới dạng chữ hoa,rolebằngcolor.snap: đèn flash trắng + màn trập, khung hình thu nhỏ thành một bức ảnh in nghiêng trên một bản sao bị mờ.comic: màu phẳng, đường 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 cảnh 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 (ai đó đứng yên sẽ được giữ lại).style:fade(các bản sao cũ mờ hơn),solid,ghost(trong suốt, nửa xám). Một âm thanh nhẹ nhàng phát khi mỗi bản sao xuất hiện ("sfx": falseở đầu kế hoạch sẽ tắt nó).two(hai cảnh 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 từ cảnh quay 2 và đặt họ lên trên cảnh quay 1 ("front": "a"giữ người của cảnh quay 1 ở phía trước khi họ giao nhau);splitnối hai cảnh 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 từng 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 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, xoay, 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 chặt chẽ nơi 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 cảnh quay rộng hơn hoặc
cover: bold. - Tách người toàn bộ video cần PyTorch và mô hình RVM (GPL-3.0, được tải xuống bởi máy của 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
Lời nhắc sao chép-dán (thêm với 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 đó toàn bộ clip với chữ sau lưng bạn.
- Mô 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 intro bảng tên, dừng hình 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." → các bản sao của bạn được để lại dọc theo đường đi, mờ dần cùng nhau.
- Hai cảnh 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 cạnh nhau có nhãn trên clip của chính 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ó vấn đề 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 một cách đơn giản, bằng tiếng Việt: cái gì hỏng và tại sao, trong một hoặc hai câu. Không in raw stack traces 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 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 đè lên clip của người dùng, ngay cả khi sửa lỗi.
- 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
Các 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ụngtach-nguoi-env/Scripts/python scripts/tn.py ...(hoặc môi trường PyTorch của bạn). Chạypython scripts/tn.py check.No module named 'cv2'or 'numpy': Gói cần thiết bị thiếu. Chạy `pip install opencv-python numpy pill``