Bỏ qua tới nội dung
Track 07 · Hướng dẫn

Dựng video bằng Claude Code với video-use

Cài video-use, nối ffmpeg và khoá API ElevenLabs để agent tự cắt, chỉnh màu, làm phụ đề và xuất video từ footage thô.

Cơ bản@shine190411 phút đọc

Bài này giới thiệu video-use, cách cài nó vào agent của bạn và cách dùng để biến footage thô thành video hoàn chỉnh chỉ bằng trò chuyện.

video-use giúp bạn dựng video bằng Claude Code, 100% mã nguồn mở (open source). Bạn thả footage thô vào một thư mục, trò chuyện với Claude Code và nhận lại final.mp4. Nó dùng được cho mọi loại nội dung (người nói trước camera, montage, hướng dẫn, du lịch, phỏng vấn) mà không cần preset hay menu.

video-use làm được gì

  • Cắt bỏ từ đệm (umm, uh, câu nói hỏng) và khoảng chết giữa các lần quay.
  • Tự chỉnh màu từng đoạn (warm cinematic, neutral punch, hoặc bất kỳ chuỗi ffmpeg tùy chỉnh nào).
  • Fade âm thanh 30ms ở mỗi điểm cắt để bạn không bao giờ nghe tiếng "bụp".
  • In phụ đề theo phong cách của bạn: mặc định là cụm 2 từ VIẾT HOA, tùy chỉnh được hoàn toàn.
  • Tạo lớp hoạt hình phủ qua HyperFrames, Remotion, Manim hoặc PIL, chạy song song trong các sub-agent, mỗi hoạt hình một sub-agent.
  • Tự đánh giá output đã render tại mọi ranh giới cắt trước khi cho bạn xem.
  • Lưu bộ nhớ phiên trong project.md để phiên tuần sau tiếp tục từ chỗ bạn dừng.

Cài bằng prompt

Dán đoạn sau vào Claude Code, Codex, Hermes, Openclaw hoặc bất kỳ agent nào có quyền chạy shell:

text
Set up https://github.com/browser-use/video-use for me.

Read install.md first to install this repo, wire up ffmpeg, register the skill with whichever agent you're running under, and set up the ElevenLabs API key — ask me to paste it when you need it. Then read SKILL.md for daily usage, and always read helpers/ because that's where the editing scripts live. After install, don't transcribe anything on your own — just tell me it's ready and wait for me to drop footage into a folder.

Agent sẽ lo việc clone, cài dependency, đăng ký skill và hỏi bạn một lần để lấy khoá API ElevenLabs (lấy tại elevenlabs.io/app/settings/api-keys).

Sau đó chỉ agent tới một thư mục chứa các cảnh quay thô:

bash
cd /path/to/your/videos
claude    # or codex, hermes, etc.

Muốn dựng liên tục từ VPS riêng hoặc Telegram, bạn chạy agent qua Browser Use Box.

Trong phiên làm việc, bạn nói:

edit these into a launch video

Agent kiểm kê các nguồn, đề xuất chiến lược, chờ bạn đồng ý, rồi tạo edit/final.mp4 cạnh các file nguồn. Mọi output nằm trong <videos_dir>/edit/, thư mục skill luôn sạch.

Cài thủ công

Nếu bạn muốn tự làm:

bash
# 1. Clone and symlink into your agent's skills directory
git clone https://github.com/browser-use/video-use ~/Developer/video-use
ln -sfn ~/Developer/video-use ~/.claude/skills/video-use        # Claude Code
# ln -sfn ~/Developer/video-use ~/.codex/skills/video-use       # Codex

# 2. Install deps
cd ~/Developer/video-use
uv sync                         # or: pip install -e .
brew install ffmpeg             # required
brew install yt-dlp             # optional, for downloading online sources

# 3. Add your ElevenLabs API key
cp .env.example .env
$EDITOR .env                    # ELEVENLABS_API_KEY=...

Cách hoạt động

LLM không bao giờ xem video. Nó đọc video qua hai lớp, đủ để cắt chính xác tới ranh giới từng từ.

Ảnh ghép timeline_view: dải khung hình, track người nói, dạng sóng, nhãn từ và các điểm cắt ứng viên ở khoảng lặng

Lớp 1: bản chép lời âm thanh (luôn được nạp). Mỗi nguồn gọi ElevenLabs Scribe một lần, cho timestamp theo từng từ, phân tách người nói (speaker diarization) và sự kiện âm thanh ((laughter), (applause), (sigh)). Mọi cảnh quay được gói vào một file takes_packed.md khoảng 12KB, là góc nhìn chính để LLM đọc.

code
## C0103  (duration: 43.0s, 8 phrases)
  [002.52-005.36] S0 Ninety percent of what a web agent does is completely wasted.
  [006.08-006.74] S0 We fixed this.

Lớp 2: ảnh ghép hình ảnh (khi cần). timeline_view tạo một ảnh PNG gồm dải khung hình, dạng sóng và nhãn từ cho bất kỳ khoảng thời gian nào. Nó chỉ được gọi ở các điểm cần quyết định: khoảng ngừng mơ hồ, so sánh các lần quay lại, kiểm tra điểm cắt.

Cách ngây thơ: 30.000 khung hình × 1.500 token = 45 triệu token nhiễu. Video Use: 12KB văn bản + vài ảnh PNG.

Cùng ý tưởng với việc browser-use đưa cho LLM một DOM có cấu trúc thay vì ảnh chụp màn hình, nhưng áp dụng cho video.

Pipeline

code
Transcribe ──> Pack ──> LLM Reasons ──> EDL ──> Render ──> Self-Eval
                                                              │
                                                              └─ issue? fix + re-render (max 3)

Vòng tự đánh giá chạy timeline_view trên output đã render tại mọi ranh giới cắt, bắt các lỗi nhảy hình, tiếng "bụp" và phụ đề bị che. Bạn chỉ thấy bản xem trước sau khi nó qua được bước này.

Nguyên tắc thiết kế

  1. Văn bản + hình ảnh khi cần. Không đổ khung hình hàng loạt. Bản chép lời là bề mặt làm việc.
  2. Âm thanh là chính, hình ảnh theo sau. Điểm cắt lấy từ ranh giới lời nói và khoảng lặng.
  3. Hỏi → xác nhận → thực thi → tự đánh giá → lưu lại. Không bao giờ đụng tới bản dựng khi chiến lược chưa được duyệt.
  4. Không giả định gì về loại nội dung. Xem, hỏi, rồi mới dựng.
  5. 12 quy tắc cứng, còn lại tự do sáng tạo. Độ chính xác khi sản xuất là bắt buộc. Gu thẩm mỹ thì không.

Xem SKILL.md để biết đầy đủ quy tắc sản xuất và kỹ thuật dựng.

Agent cài đặt như thế nào

Phần này dịch từ install.md, file mà agent đọc khi cài lần đầu hoặc kết nối lại. Khi dựng hằng ngày, agent đọc SKILL.md, và luôn đọc helpers/ vì các script nằm ở đó.

Sau khi cài, bạn thả footage thô vào một thư mục bất kỳ, chạy agent (claude, codex…) ở đó và nói "edit these into a launch video". Agent làm phần còn lại bằng cách đọc SKILL.md.

Trên máy cần có ba thứ:

  1. Repo video-use được clone vào một chỗ cố định.
  2. ffmpeg trên $PATH (thêm yt-dlp nếu muốn lấy nguồn online).
  3. Khoá API ElevenLabs trong .env ở thư mục gốc repo (cho phần chép lời Scribe).

Và agent hiện tại phải tìm được SKILL.md, qua thư mục skill toàn cục (~/.claude/skills/, ~/.codex/skills/) hoặc qua import trong CLAUDE.md / system prompt.

Quy ước khi cài

  • Agent tự làm mọi thứ. Chỉ hỏi bạn những gì nó không tự tạo được: khoá API ElevenLabs, và xác nhận trước khi chạy brew install.
  • Ưu tiên đường dẫn clone cố định như ~/Developer/video-use (không phải /tmp, không phải ~/Downloads).
  • Skill gọi helper bằng tên trần (transcribe.py, render.py). Cách này chạy được vì SKILL.md và helpers/ đi cùng nhau, nên khi đăng ký skill phải giữ chúng nằm cạnh nhau.
  • Sau khi cài, kiểm tra bằng một lệnh thật trên một file thật. Không kết luận thành công chỉ vì file tồn tại.

1. Clone vào đường dẫn cố định

bash
test -d ~/Developer/video-use || git clone https://github.com/browser-use/video-use ~/Developer/video-use
cd ~/Developer/video-use

Nếu repo đã có, chạy git pull --ff-only rồi làm tiếp.

2. Cài dependency Python

bash
# Prefer uv if available; fall back to pip.
command -v uv >/dev/null && uv sync || pip install -e .

pyproject.toml liệt kê requests, librosa, matplotlib, pillow, numpy. Không có console script: helper được gọi trực tiếp bằng python helpers/<name>.py.

3. Cài ffmpeg (và yt-dlp nếu cần)

ffmpeg và ffprobe là bắt buộc. yt-dlp chỉ cần khi bạn muốn lấy nguồn từ URL. Các engine hoạt hình như HyperFrames, Remotion và Manim chỉ được cài khi một dự án thực sự cần lần đầu.

bash
# macOS
command -v ffmpeg >/dev/null || brew install ffmpeg
command -v yt-dlp >/dev/null || brew install yt-dlp     # optional

# Debian / Ubuntu
# sudo apt-get update && sudo apt-get install -y ffmpeg
# pip install yt-dlp

# Arch
# sudo pacman -S ffmpeg yt-dlp

Nếu brew / apt / pacman đòi mật khẩu sudo, agent phải đưa bạn lệnh chính xác và chờ. Không được bịa mật khẩu.

4. Đăng ký skill với agent hiện tại

Agent xác định nó đang chạy dưới agent nào và đăng ký một lần. Symlink cả thư mục repo là cách đúng, vì helpers/ phải nằm cạnh SKILL.md.

  • Claude Code (có ~/.claude/):

    bash
    mkdir -p ~/.claude/skills
    ln -sfn ~/Developer/video-use ~/.claude/skills/video-use
    
  • Codex (có $CODEX_HOME hoặc ~/.codex/):

    bash
    mkdir -p "${CODEX_HOME:-$HOME/.codex}/skills"
    ln -sfn ~/Developer/video-use "${CODEX_HOME:-$HOME/.codex}/skills/video-use"
    
  • Hermes / Openclaw / agent khác có thư mục skill: symlink ~/Developer/video-use vào thư mục skill của agent đó với tên video-use. Nếu agent không có thư mục skill, thêm một dòng vào system prompt / cấu hình trỏ tới ~/Developer/video-use/SKILL.md (ví dụ import @~/Developer/video-use/SKILL.md trong file tương đương CLAUDE.md).

Nếu không xác định được, agent hỏi bạn một lần: "which agent am I running under — Claude Code, Codex, or something else?" rồi chọn đích phù hợp.

5. Khoá API ElevenLabs

Scribe (ElevenLabs) làm toàn bộ phần chép lời. Không có khoá thì không chép lời được.

  1. Kiểm tra trạng thái hiện có theo thứ tự, dừng ở kết quả đầu tiên:

    bash
    # a) env var already exported
    [ -n "$ELEVENLABS_API_KEY" ] && echo "env"
    # b) .env at repo root already has it
    grep -q '^ELEVENLABS_API_KEY=..' ~/Developer/video-use/.env 2>/dev/null && echo "dotenv"
    
  2. Nếu cả hai đều chưa có, agent hỏi bạn đúng một lần:

    I need an ElevenLabs API key for transcription (word-level timestamps, speaker diarization, filler tagging). Grab one at https://elevenlabs.io/app/settings/api-keys and paste it here — I'll write it to ~/Developer/video-use/.env. Or if you already have it exported as ELEVENLABS_API_KEY, say "use env" and I'll skip.

    Khi bạn dán khoá, agent ghi nó vào ~/Developer/video-use/.env:

    bash
    printf 'ELEVENLABS_API_KEY=%s\n' "$KEY" > ~/Developer/video-use/.env
    chmod 600 ~/Developer/video-use/.env
    

    Không bao giờ in lại khoá trong output của tool. Không bao giờ commit .env.

  3. Kiểm tra nhanh bằng một lời gọi rẻ, không tốn quota:

    bash
    curl -s -o /dev/null -w '%{http_code}\n' \
      -H "xi-api-key: $(sed -n 's/^ELEVENLABS_API_KEY=//p' ~/Developer/video-use/.env)" \
      https://api.elevenlabs.io/v1/user
    

    200 nghĩa là khoá dùng được. 401 nghĩa là khoá sai hoặc hết hạn: hỏi lại một lần rồi dừng. Các kết quả khác (lỗi mạng, 5xx) thì bỏ qua và kiểm tra ở lần chép lời thật đầu tiên.

6. Kiểm tra đầu cuối

Chạy một thứ thật, ưu tiên cách kiểm tra nhẹ nhất mà vẫn chứng minh pipeline đã được nối:

bash
python ~/Developer/video-use/helpers/timeline_view.py --help >/dev/null && echo "helpers OK"
ffprobe -version | head -1

Thử chép lời đầy đủ lúc cài là tùy chọn, vì nó tốn credit Scribe. Tốt hơn là chờ tới khi bạn đưa clip đầu tiên.

7. Bàn giao

Agent báo bạn trong một tin nhắn ngắn:

  • Skill được cài ở đâu (~/Developer/video-use).
  • Bạn nên cd vào thư mục footage và khởi động agent ở đó (ví dụ claude).
  • Tin nhắn đầu tiên nên là "edit these into a launch video" hoặc "inventory these takes and propose a strategy."
  • Mọi output nằm trong <videos_dir>/edit/, repo luôn sạch.

Cập nhật skill

  • cd ~/Developer/video-use && git pull --ff-only lấy code mới nhất. Symlink tự nhận bản mới ở lần chạy sau.
  • Nếu pyproject.toml đổi dependency, chạy lại uv sync / pip install -e . sau khi pull.

Lưu ý khi cài từ đầu

  • Symlink cả thư mục, không chỉ SKILL.md. Các helper phải nằm cạnh nó.
  • Nếu .env có nhưng khoá rỗng, coi như chưa có. Có file không có nghĩa là khoá hợp lệ.
  • ffmpeg bản static build chạy tốt. Bản hiện đại bất kỳ (từ 4.x trở lên) là đủ.
  • yt-dlp là tùy chọn. Đừng chặn việc cài vì nó; chỉ cài khi bạn lần đầu yêu cầu lấy nguồn từ URL.
  • Node.js/npm chỉ cần cho slot HyperFrames hoặc Remotion. HyperFrames hiện yêu cầu Node.js 22 trở lên.
  • HyperFrames, Remotion và Manim là các engine hoạt hình tùy chọn. Không cài hay ưu tiên engine nào trên toàn máy lúc thiết lập; chọn engine cho từng slot hoạt hình theo SKILL.md. HyperFrames chạy được qua npx --yes hyperframes ... trong thư mục slot. Remotion có thể dựng khung bằng npx create-video@latest hoặc cài trong slot trước khi render.
  • Không bao giờ chạy chép lời trong bước kiểm tra cài đặt trừ khi bạn yêu cầu rõ, vì Scribe tốn tiền thật.
  • Nếu bạn dùng Linux mà không có trình quản lý gói Claude nhận ra, agent in URL cài ffmpeg thủ công và chờ, thay vì đoán.

Nguồn

Viết thêm guide cho track này