Hiệu ứng tách người (person cut-out effects)
Bạn giúp một người sáng tạo tạo 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 bằng tiếng Việt, hãy trả lời bằng tiếng Việt nói thông thường.
Các 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ờ nằm 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 một yêu cầu cần thứ gì đó bị thiếu.
python scripts/tn.py check cho thấy 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 là trong môi trường Python riêng) và mô hình RVM, mô hình này PyTorch tải một lần từ GitHub trong lần tách người đầu tiên (khoảng 15-100 MB). - GPU: card NVIDIA được khuyến nghị mạnh mẽ. Với card này, việc tách người chạy ở tốc độ 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 độ (đã thử nghiệm, RTX 4080): ảnh tĩnh trong vài giây; render đầy đủ ở 1080p chạy 18-27 fps cho hiệu ứng chữ phía sau và phân thân, và 9-19 fps cho hiệu ứng đóng băng (một clip 20 giây trong khoảng 1-2 phút, sau lần tách người một lần).
- Hệ điều hành đã thử nghiệm: Windows 10 (mọi lệnh). macOS: chưa thử nghiệm (không có GPU NVIDIA ở đó, nên việc 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ận cảnh dọc khít khao sẽ có chữ nhỏ. Chuyển động nhanh, tóc trên nền bận rộn và các vật thể trong suốt 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 từ cùng một vị trí.
- Cái gì tắt nếu không có nó: không có PyTorch, không có hiệu ứng nào chạy được (mọi hiệu ứng đều cần tách người). Hãy nói như vậy 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 thể 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ả dưới dạng 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 một 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, kích thước bao nhiêu, lệnh chính xác).
- Ảnh tĩnh trước, sau đó là bản xem trước độ phân giải thấp, sau đó là render đầy đủ. Hiển thị các ảnh tĩnh và nói những gì các kiểm tra đã phát hiện trước khi dành thời gian cho một bản render đầy đủ.
- Đọc các kiểm tra mà script in ra (phần trăm bị che khuất, độ tương phản, ghi chú KHÔNG ĐỌC ĐƯỢC; cũng được lưu trong
checks.jsonbên cạnh các ảnh tĩnh) và nói với người dùng bằng một câu đơn giản cho mỗi cái. Hiệu ứng đóng băng in ra khung hình chúng đã đóng băng: hãy xem các ảnh tĩnh.
Thiết lập (chỉ lần đầu tiên)
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 mà nó liệt kê. Mỗi câu hỏi đưa ra các tùy chọn của nó cộng thêm hai lựa 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 "<a word from their video>", hiển thị tệp, sau đó hỏi lại. Mất 5-40 giây (hãy nói như vậy); nó sử dụng clip của chính họ, độ phân giải thấp, tất cả các tùy chọn cạnh nhau, có nhãn.
Lưu mỗi câu trả lời ngay lập tức: python scripts/tn.py settings set <key>=<value>. Các 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). Các kế hoạch (plan) 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ị | khóa | loại mẫu (sample kind) |
|---|---|---|---|---|
| 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 để đưa ra 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 điều 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 chạy với Python đã cài 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 cho mỗi chữ + kiểm tra (nhanh)
python scripts/tn.py behind plan.json --out out/clip.mp4 --preview # một 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 ra 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). Được hiển thị bằng chữ hoa trừ khi"upper": false. Một\nbuộc hai dòng; nếu không, script 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, kiểu cổ điển),dam(đậm),dam-vua(extra bold), hoặc đường dẫn đến 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 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 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 chữ là tự động: kích thước và vị trí lớn nhất nơi chữ nằm phía sau đầu và các chữ cái đầu và cuối của mỗi từ luôn hiển thị, bên 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ù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 (freeze-frame)
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 # một 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 hơn do thời gian tạm dừng; âm thanh gốc cũng tạm dừng và âm thanh của riêng 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 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 nơi 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 trở nên tối và xám, người xuất hiện nổi lên 6% với một đường viền (white,glowtrongcolor, hoặcnone), và thẻ tên trượt vào ở phía xa họ.nameđược hiển thị bằng chữ hoa,roletrongcolor.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ị làm 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 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ẽ được để nguyên).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 flash 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 nơi họ giao nhau);splitnối hai lần quay dọc theo cột ít người 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 trôi 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.
Cá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 một cận cảnh khít khao 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 như vậy và đề xuất một góc quay rộng hơn hoặc
cover: bold. - Việc tách người 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); một GPU NVIDIA làm cho nó nhanh.
Ví dụ prompt
Các prompt có thể sao chép (thêm với ghi chú trong examples/prompts.md):
- Bắt đầu 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 tiên), 4 ảnh tĩnh với kiểm tra khả năng đọc, sau đó là clip đầy đủ với chữ phía sau 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 bản render với 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 lần chụp ảnh, mỗi cái có âm thanh riêng.
- Chữ phía sau, 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 để lại 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 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 đó là bản render mới (bản cũ được giữ lại).
Nếu có sự cố
Skill 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 là 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ó một cách đơn giản, bằng tiếng Việt: cái gì đã thất bại và tại sao, bằng một hoặc hai câu. Không có raw stack traces 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 nó 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 đè các 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 như vậy và đề xuất báo cáo nó để 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ụng môi trườngtach-nguoi-envđã tạo ở trên hoặc nói "Em chưa có PyTorch, anh/chị có muốn em cài không?" và chạy lệnh từ phần cài đặt.- "Dừng hình không thấy rõ mặt" hoặc kết quả phát hiện kém: kiểm tra video gốc có chuyển động mờ không
(người và máy quay đứng yên lúc đó? Thời gian phơi sáng ngắn?). Nếu video có, thử
"at"hơi khác một chút hoặc nói với người dùng rằng khu vực đó bị mờ. - Phân thân không thẳng hàng: máy quay di chuyển quá nhiều. Chạy lệnh với
--stillsđể xem sự căn chỉnh nền trước. Bạn thậm chí có thể thấy điều này trong ảnh tĩnh: nếu nền nhân đôi, các lần quay không khớp. Hỏi người dùng xem họ có thể giữ máy quay tĩnh hơn không (dùng chân máy, hoặc ít nhất dựa vào tường). - Clip đầu ra hoàn toàn im lặng: người dùng đã tắt âm thanh nền (
"sfx": falsecũng tắt âm thanh hiệu ứng) nhưng lỗi phần mềm khiến nhầm lẫn giữa tắt âm thanh với giữ nguyên âm thanh gốc. Chạy lại với"sfx": truevà thêmsfx_gain: 0nếu họ muốn hiệu ứng im lặng. Nếu lỗi tái diễn, hãy báo cáo nó.