- Điểm nghẽn của kho lưu trữ video không nằm ở công cụ biên tập mà ở việc không thể tìm kiếm, nên trọng tâm là biến các clip không có nhãn thành một chỉ mục có thể truy vấn bằng tiếng Anh
- Thiết kế ưu tiên cục bộ tạo tệp sidecar
.description.md bên cạnh mỗi clip, và trích xuất rating, ánh sáng, vị trí, bản chép lời, từ khóa và mô tả văn xuôi chỉ trong một lần gọi mô hình thị giác
- Pipeline kết hợp
ffprobe, exiftool, Nominatim, ffmpeg, WhisperX, insightface và mô hình thị giác để tạo metadata, GPS, frame, bản chép lời và embedding khuôn mặt
- MacBook Pro 16 inch 2021 M1 Max 64GB chạy Gemma 4 31B Q4 trong LM Studio, và khi xử lý hàng loạt thì swap tăng tối đa tới 50.89GB
- Schema có cấu trúc và ràng buộc enum giúp giảm hallucination, đồng thời cho phép xử lý chỉ mục số lượng lớn bằng mô hình 31B cục bộ rồi chỉ đánh giá lại 10–20% trường hợp khó bằng mô hình đám mây
Điểm khởi đầu của vấn đề: tìm kiếm trước cả biên tập
- Trong gần nửa năm ở Maasai Mara, video quay bằng iPhone, DJI Pocket, drone, Nikon Z8 và Ray-Ban Meta cứ liên tục tăng lên, nhưng phần lớn bị bỏ lại mà không bao giờ được mở lại
- Các kênh mạng xã hội của Mara Hilltop bị đình trệ suốt 3 tháng không phải vì thiếu nội dung mà vì thiếu thời gian biên tập
- Với Claude Code và Opus 4.5/4.6, công việc phát triển đã có thể chạy agent trong thời gian dài và làm song song, trong khi đợt ra mắt cơ sở lưu trú trả phí đầu tiên của KaribuKit lại càng làm thời gian dành cho biên tập video bị thu hẹp
- Giải pháp đầu tiên được nghĩ tới là một stack SaaS 140 USD/tháng gồm Eddie AI, Higgsfield MCP, Submagic và Buffer, nhưng nó không khớp với điểm nghẽn thực tế
- Video AI tạo sinh không phù hợp với một thương hiệu du lịch thực, và trong bối cảnh khách lưu trú mong đợi đúng địa điểm thật, các cảnh AI gắn nhãn sai có thể làm tổn hại niềm tin
- Tần suất đăng bài thực tế gần với 2–3 bài/tuần hơn là 3–5 bài/tuần, nên kế hoạch ban đầu có khả năng thất bại ngay từ tuần thứ hai
- DaVinci Resolve Studio đã có sẵn cùng IntelliSearch, Smart Bins và Voice to Subtitle của Resolve 21 đã bao phủ khoảng 70% tính năng mà Eddie cung cấp
- Phần còn lại là để Claude Code điều khiển Resolve qua MCP DaVinci Resolve mã nguồn mở, và chỉ dùng ElevenLabs để tạo voiceover cho các clip mang tính thông tin, đưa chi phí xuống còn 22 USD/tháng
Điểm nghẽn thật sự: cần chỉ mục trước cả trình biên tập AI
- Các trình biên tập video AI trên thị trường đều giả định video đã được gắn nhãn, nhưng kho lưu trữ thực tế lại rải rác với các tên như
IMG_*.mov, DJI_*.mp4, Mara june 2024 backup final FINAL
- Eddie có thể tìm kiếm theo bản chép lời, nhưng không thể tìm ra cảnh kiểu “voi trên đồi vào giờ vàng” trong một kho lưu trữ không có nhãn
- Chỉ từ tên tệp, thư mục cha, tọa độ GPS và văn bản chép lời thì không thể biết được nội dung thị giác như “wide shot lúc bình minh có hươu cao cổ trong khung hình”
- Đòn bẩy thực sự không nằm ở tầng trình biên tập mà ở lớp phía trước nó, và cần một chỉ mục để trước hết biến kho lưu trữ thành dạng có thể truy vấn bằng tiếng Anh
Thiết kế bộ lập chỉ mục ưu tiên cục bộ
- Cấu trúc tổng thể tương tự các bản dựng AI-native mà SimbaStack làm cho khách hàng, nhưng ở đây người làm vừa là khách hàng vừa là kỹ sư nên việc ra quyết định nhanh hơn
-
Bốn ràng buộc
- Phải ưu tiên cục bộ
- Kho lưu trữ của Mara Hilltop nằm trên SSD vật lý và video cá nhân ở trên laptop, nên việc tải lên đám mây hàng nghìn clip nhiều GB là không hợp lý cả về chi phí lẫn quyền riêng tư
- Muốn dùng tệp sidecar hơn là một DB trung tâm
- Đặt
.description.md cạnh mỗi clip để có thể grep bằng văn bản thuần
- Kể cả bộ lập chỉ mục sau này hỏng thì các tệp vẫn còn, và khi di chuyển giữa các ổ đĩa thì dữ liệu cũng đi cùng
- Cần trích xuất toàn bộ thông tin cần thiết chỉ trong một lần gọi thị giác
- Vì việc chạy vision pass trên các frame đã trích là đắt đỏ, schema ngay từ đầu được thiết kế rộng để lấy luôn cả những thông tin có thể sau này mới cần đến
- Các mục gồm rating, chất lượng kỹ thuật, ánh sáng, thời điểm trong ngày, bảng màu, chất lượng âm thanh, số người, từ khóa, khuôn mặt, vị trí, bản chép lời, mô tả văn xuôi...
- Cho phép chọn giữa ba backend thị giác
- Mặc định là CLI của gói Claude Max, không có chi phí cận biên
- Khi cần tốc độ thì dùng Anthropic API
- Khi xử lý hàng loạt thì dùng backend cục bộ trỏ tới LM Studio, và đây mới là phần cốt lõi
Pipeline xử lý theo từng clip
- Đọc metadata bằng
ffprobe
- Đọc vĩ độ, kinh độ và độ cao GPS bằng
exiftool; hoạt động giống nhau trên video iPhone, DJI Pocket và drone
- Dùng Nominatim để reverse geocoding; miễn phí, có giới hạn tốc độ và không cần API key
- Dùng
ffmpeg để trích 5 frame kích thước 1920px ở các khoảng cách đều nhau
- Dùng WhisperX để chép lời với căn chỉnh theo từng từ và tách người nói bằng pyannote; hỗ trợ 97 ngôn ngữ gồm Hindi, English, Swahili...
- Dùng
insightface để phát hiện khuôn mặt, và lưu embedding ArcFace 512 chiều vào DB khuôn mặt SQLite trung tâm để sau này có thể tìm người trên toàn bộ kho lưu trữ
- Mô hình thị giác đọc frame, một phần bản chép lời và ngữ cảnh thư mục rồi trả về YAML frontmatter và mô tả văn xuôi
- Kết quả cuối cùng được ghi thành sidecar
.description.md bên cạnh clip
- Với clip thực tế
IMG_1103.MOV của Mara Hilltop, chỉ nhìn tên tệp thì không biết ngữ cảnh, nhưng sidecar do Gemma tạo ra bao gồm phần dựng lều safari, cú pan máy từ trong nhà ra thảo nguyên, loại shot và mục đích dùng như reel marketing hay B-roll vlog du lịch
- Ở cấp thư mục, ngoài sidecar cạnh từng clip còn sinh ra
_INDEX.json và _INDEX.md ở cấp trên để grep nhanh và chuyển cho LLM
- Toàn bộ triển khai là một skill Claude Code khoảng 1.400 dòng Python; Claude Code viết phần lớn, còn con người phụ trách kiến trúc, prompt, thiết kế schema và triage bug
Mô hình 31B cục bộ chạy trên MacBook cũ
- MacBook Pro 16 inch M1 Max 64GB RAM mua năm 2021 ban đầu không dành cho LLM mà để chạy đồng thời Chrome tab, DaVinci Resolve, Slack, Discord và Drive
- Năm năm sau, cùng chiếc laptop đó chạy Gemma 4 31B Q4 trong LM Studio để xử lý một năm video lưu trữ
- Trong LM Studio, mô hình 28.40GB được nạp vào bộ nhớ và REST API chạy tại
127.0.0.1:1234
- Trong quá trình xử lý hàng loạt, 64GB RAM là không đủ, và theo Activity Monitor thì mức dùng swap đạt tối đa 50.89GB
- Đây không phải trạng thái có thể duy trì cho một ngày làm việc bình thường, nhưng được xem là chấp nhận được cho kiểu ép máy mạnh vào cuối tuần
- Laptop nóng lên và quạt quay rất to, nhưng vẫn tiếp tục tạo sidecar trong lúc làm việc khác
- M1 Max 16 inch cho thấy phần cứng 5 năm tuổi vẫn còn dư địa để chạy mô hình 31B tham số ở tốc độ dùng được, và nếu LLM cục bộ còn hiệu quả hơn nữa thì có thể dùng thêm 3–5 năm nữa
Bốn lỗi và bài học rút ra
-
Thay đổi API tách người nói trong WhisperX 3.8
- Trong WhisperX 3.8,
whisperx.DiarizationPipeline được chuyển sang submodule whisperx.diarize
- Đối số khởi tạo
use_auth_token được đổi thành token theo pyannote 3.x
- Cách giải quyết là introspection chữ ký hàm
- Script trước tiên thử
token=, và nếu constructor ném TypeError thì fallback sang use_auth_token=
- Khi gọi các thư viện AI thay đổi nhanh, gọi constructor theo kiểu phòng thủ là một bảo hiểm rẻ mà hiệu quả
-
Claude CLI trả lỗi quyền như thể là phản hồi thành công
- Trong lần thử đầu tiên với backend CLI, cả 4 sidecar đều trả về cùng một đoạn “I need permission to read the image frames...”
- Exit code là 0 và output không rỗng nên vượt qua được kiểm tra thành công của script
- Ở chế độ non-interactive, nếu không có
--permission-mode bypassPermissions thì Claude CLI sẽ trả văn bản từ chối quyền trong phần thân phản hồi thay vì prompt
- Cách sửa là thêm cờ đó và thêm một kiểm tra phòng thủ để coi những phản hồi ngắn có chứa “I need permission” là lỗi chứ không phải mô tả
- Khi xử lý công cụ AI bằng script, luồng cấp quyền non-interactive có thể ẩn chứa các lỗi im lặng
-
Gemma trả về people_count: "many"
- Prompt thị giác đã chỉ dẫn
integer or the string "many" if >10, nên Gemma thực ra chỉ đang làm đúng yêu cầu
- Lỗi không nằm ở mô hình mà ở thiết kế schema
- Sau khi sửa, prompt ghi rõ hãy ước lượng số nguyên từ 0–99, và parser ép chuyển các phản hồi
"many" cũ
- Trường schema không nên tạo union kiểu
int hoặc một string cụ thể; hãy cố định luôn là số nguyên hoặc luôn là chuỗi để downstream consumer đơn giản hơn
-
Clip đi xe máy rung lắc bị loại bỏ sai
- Prompt cull ban đầu gần với tiêu chí portfolio ảnh, nên motion blur mạnh, soft focus và rung lắc bị đánh giá là
cull
- Một clip quay cầm tay ban đêm khi đi xe máy trong chuyến đi Tây Ban Nha cũng bị loại, dù chính sự mờ đó lại là bầu không khí của ký ức
- Tiêu chí cull được đổi từ “không quay hoàn hảo” sang “không phải ghi chép thực tế”
- Các clip bị loại được thu hẹp còn kiểu nắp ống kính che camera, video quay trong túi, clip test dài 2 giây, hoặc phơi sáng hỏng hoàn toàn
- Kho ảnh nên cull mạnh tay, còn kỷ niệm video nên cull khoan dung; dù dùng cùng schema thì vẫn cần phân định mode thật rõ
Kết luận từ schema có cấu trúc và mô hình cục bộ
-
Ràng buộc enum giúp giảm hallucination
- Gemma 4 E4B từng mô tả một ảnh không gian coworking chụp ban đêm là “brightly lit, abundant natural light, floor-to-ceiling windows”, dù bên ngoài cửa sổ là đêm tối hoàn toàn
- Khi đưa schema có cấu trúc cho 31B và buộc chọn một trong
golden_hour | bright_daylight | overcast | dim_interior | nighttime | mixed | unclear, cả thinking-off lẫn thinking-on đều quay lại chọn nighttime
- Trong văn xuôi mở, mô hình có thể bịa ra mô tả sai, nhưng với enum thì nó không thể phát minh ra giá trị mới, chỉ có thể chọn sai trong số các giá trị có sẵn
- Schema an toàn hơn chỉ dẫn
-
31B cục bộ và prompt có cấu trúc thu hẹp khoảng cách với đám mây
- Gemma 4 31B Q4 thinking-off cho đầu ra ở nhiều clip thử nghiệm khó phân biệt với Sonnet 4.6 khi dùng schema có cấu trúc
- Phần giá trị cao cấp của mô hình đám mây nằm ở 10–20% clip khó
- Với các tác vụ hàng loạt như lập chỉ mục hàng nghìn clip qua đêm, chạy cục bộ rồi chỉ đánh giá lại các clip bị cục bộ gắn cờ
review bằng đám mây là một cấu trúc hai tầng có thể mở rộng
-
Trình biên tập video AI đang cạnh tranh ở tầng quá cao
- Tầng có giá trị không phải là trình biên tập mà là chỉ mục có thể tìm kiếm
- Nếu có thể truy vấn bằng ngôn ngữ tự nhiên như “clip cầm tay trong nhà ở Mara, giờ vàng, có người, dài hơn 8 giây” thì trình biên tập nằm phía trên sẽ trở nên đơn giản hơn
- Thị trường trình biên tập AI đang cạnh tranh ở lớp bề mặt phía trên một chỉ mục vốn chưa tồn tại, tức là bỏ qua điều kiện tiên quyết là chỉ mục đó
Bước tiếp theo và giới hạn
- Công việc tiếp theo là tạo một trình biên tập dùng Claude Code làm bộ điều phối, dùng DaVinci Resolve MCP để dựng cut, và gắn voiceover ElevenLabs cho các clip mang tính thông tin
- Voice clone có những giới hạn rõ ràng
- Chỉ dùng cho nội dung tiện ích như hướng dẫn chỉ đường, mô tả phòng, phiên bản đa ngôn ngữ hoặc các thông tin thực tế mà chính tác giả cũng sẽ nói
- Không dùng cho đánh giá hay thông điệp từ nhà sáng lập
- Tới năm 2026, các luật liên quan tới nghĩa vụ công khai sẽ là thực tế, và niềm tin với một thương hiệu hospitality rất dễ mất
- Khi đã có chỉ mục, có thể tránh việc phải tự kéo scrub qua 47GB video DJI Pocket chỉ để tìm wide shot lúc bình minh
- Hiện tại, một năm video của Mara Hilltop đã có thể truy vấn bằng tiếng Anh trên chiếc laptop 5 năm tuổi, với cái giá là một cuối tuần và 50GB swap
- Những năm còn lại nằm trên các SSD cũ sẽ là mục tiêu xử lý tiếp theo
- Kênh mạng xã hội của Mara Hilltop vẫn chưa thực sự hồi sinh
- Bộ lập chỉ mục chỉ giải quyết bài toán tìm đúng clip
- Phần còn lại là một trình biên tập biến nó thành reel hoàn chỉnh; nếu thành công sẽ có bài viết tiếp theo, còn nếu thất bại sẽ viết về lý do thất bại
- Câu trả lời đúng cũng có thể là thuê người
- Tìm được một editor có cảm quan ấm áp và tinh tế, phù hợp với Mara Hilltop, có thể còn khó hơn việc viết thêm một skill nữa
- Những reel kiểu MTV bị cắt dựng quá đà không phải hướng mong muốn
- Mã nguồn đã được công khai tại github.com/Simbastack-hq/framedex và đang nhận PR cùng issue
1 bình luận
Ý kiến trên Hacker News
Có vẻ Claude đã chọn nhầm URL để chia sẻ khi viết bài. Trừ khi thư mục home bị lộ ra ngoài, còn không thì sẽ không thể truy cập
~/.claude/skills/video-index/, nên mình muốn hỏi liệu bạn có thể chia sẻ tệp Skill khôngCập nhật: mình đã vội tạo repo này - https://github.com/Simbastack-hq/framedex
Giấy phép là MIT, và mình vẫn chưa kịp kiểm thử kỹ sau khi tổng quát hóa nó. Mình sẽ sớm rà soát cẩn thận hơn và bổ sung thêm cập nhật
Hai mục TODO lớn là, 1) dùng chỉ mục này cùng sự hỗ trợ của Claude để chỉnh sửa video nhanh hơn trong DaVinci Resolve, và 2) hiện tại mới xử lý video nhưng sẽ mở rộng để hiểu cả hàng nghìn ảnh tĩnh trong máy ảnh
Mình không rõ vì sao lại cần swap nhiều đến vậy. Nếu xét băng thông bộ nhớ cần thiết thì chuyện này có thể làm giảm tuổi thọ SSD khá nhanh
Mô hình Gemma 4 31B lượng tử hóa 4-bit lẽ ra chỉ khoảng 19GiB chứ không phải 28.4GiB [1]. Mình không thường đưa ảnh vào nên không rõ cần thêm bao nhiêu bộ nhớ cho context, nhưng chắc không đến mức vượt 10GiB
Nhìn trong Activity Monitor thì ngoài Handy và máy ảo cho Claude Code có vẻ đang tải mô hình, còn có cả một đống ứng dụng Electron khác cũng đang chạy, nên có lẽ nguyên nhân thật sự nằm ở đó. Khi laptop bắt đầu cày đĩa dữ dội thì mấy app kiểu đó sẽ bị treo, nên chắc cũng chẳng hữu ích mấy
[1] https://huggingface.co/mlx-community/gemma-4-31b-it-4bit
Dù vẫn hơi khựng, mình vẫn thấy ấn tượng ở chỗ là ngay cả khi mở rất nhiều tab trong Brave thì vẫn có thể tiếp tục làm việc khác
Không biết bạn có biết là thứ này đã tồn tại, hoạt động khá ổn, và cũng không ngốn tới 50GB swap không
https://github.com/iliashad/edit-mind
Hay đấy. Ước gì mình có đủ RAM để chạy mô hình cục bộ. Vài tuần gần đây mình cũng làm một thứ rất giống thế này, nhưng là một ứng dụng Electron chạy cục bộ dùng Whisper, ffmpeg, và mình thêm tìm kiếm ngữ nghĩa cùng embedding để trò chuyện với video
Phân tích hình ảnh, gắn thẻ và chat với video thì giao tiếp với Claude. Mình tò mò không biết dự án này có phải gửi từng ảnh riêng lẻ không. Bên mình dùng thuật toán phát hiện cảnh tùy chỉnh để tìm nhiều hình khác nhau cho mỗi video, rồi gửi chúng cùng phụ đề tới Claude trong một request. Đây chắc chắn là phần tốn chi phí nhất. Nếu dùng Sonnet 4.6 để phân tích và Haiku để gắn thẻ thì khoảng 1 USD cho mỗi giờ video, còn chạy cục bộ thì có vẻ sẽ chậm
Tuy nhiên cách chọn khung hình của mình là điểm yếu. Phát hiện cảnh chắc chắn sẽ giúp ích và là ưu tiên số 1 trong lộ trình. Mình muốn hỏi liệu bạn có thể chia sẻ cách bạn chọn khung hình từ bước phát hiện cảnh không
Mình không thêm tìm kiếm vector mà chọn giữ mọi thứ đơn giản bằng các tệp Markdown thông thường, dễ di chuyển hơn. Dù có chuyển SSD thì tri thức vẫn đi cùng các tệp, không có chỉ mục nào phải đồng bộ, và văn bản thuần còn có lợi thế là sống lâu hơn công cụ. Nhưng hướng đi khác mà bạn nói cũng đáng để khám phá
Cũng có vài lựa chọn khác khá ổn. Gemini 3.1 Flash Lite rất hợp cho kiểu việc này. Nhưng Gemini 3.5 Flash thì không. Giá của nó không ổn lắm
https://openrouter.ai/google/gemma-4-31b-it
Mình có hai câu hỏi
description.mdcó các mục nhưfaces -> cluster_id. Mình muốn hỏi liệu đây có phải dữ liệu lấy từ chỉ mục khuôn mặt của DaVinci Resolve không. Với bộ sưu tập ảnh thì những thông tin như khuôn mặt+tên, vị trí rất quan trọng, nhưng LLM thông thường lại không xử lý tốt mấy thứ này.description.mddạng văn bản thuần được đặt cạnh mỗi clip videoSau này khi brainstorm với Claude, kiểu như “mình muốn làm một video về các phòng cao cấp của lodge”, bạn có thể truy vấn chúng và Claude có thể rà qua các tệp để biết video nào sẽ hữu ích
Cũng có một tệp ở mức thư mục gốc để gom các mô tả văn bản lại cho dễ tìm. Mình đã gắn ảnh ví dụ trong blog - https://blog.simbastack.com/_media/gvcycx2n.png
Khuôn mặt đến từ insightface. Nó phát hiện bằng RetinaFace trong gói mã nguồn mở
buffalo_l, chạy cục bộ trên CPU. Nó phát hiện và embedding khuôn mặt từ các khung hình mẫu của từng clip rồi ghi các dòng vào~/.framedex/faces.dbNói thật là phần này mình biết nó đang được lưu vào DB cục bộ, nhưng vẫn chưa kiểm thử đầy đủ xem nó hoạt động tốt đến đâu. Mình sẽ sớm kiểm tra kỹ hơn
Nói rộng hơn thì đó cũng là lý do framedex cố ý không giao việc xử lý khuôn mặt hay vị trí cho LLM. Khuôn mặt được xử lý bằng embedding insightface / ArcFace nên có thể so sánh giữa các clip một cách xác định. Mô hình thị giác chỉ cung cấp số lượng người tương đối, chứ không cố nhận diện đó là ai
Vị trí thì được xử lý bằng EXIF GPS qua exiftool và reverse geocoding bằng Nominatim/OpenStreetMap. Đó là metadata chắc chắn chứ không phải phỏng đoán
LLM chỉ làm những gì nó giỏi: mô tả cảnh, bầu không khí, kiểu shot, từ khóa, và điểm đánh giá lưu trữ/xem lại/loại bỏ. Phần chấm điểm cuối cùng này thì đúng là vẫn còn gây tranh cãi
Mình đã thử chạy Gemma trên một chiếc ThinkPad đời 2015 để làm việc tương tự. May mà mình có thể nâng cấp bộ nhớ, chứ không thì chắc khá đau khổ
Mình không thể nói dối là khi chạy llama.cpp thì quạt quay hết công suất. Nhưng dù sao nó vẫn chạy và hoàn thành công việc
Đôi khi nó có vẻ chỉ là cách nói ẩn dụ cho “dùng 100% tài nguyên”, và chắc ở đây cũng là ý đó, nhưng trong ngữ cảnh khác thì rõ ràng đôi khi người ta dùng nó như một lời phàn nàn thật sự
Mình nghĩ đa số host Airbnb sẽ không đồng ý với câu “video AI tạo sinh không có chỗ đứng trong một thương hiệu du lịch thật”
Còn cách nói “bị TripAdvisor đóng đinh” thì mình thật sự không hiểu mấy host Airbnb đăng chỗ nghỉ giả làm sao vẫn sống được
Mặt khác thì video thật lại tốn thời gian và làm chậm toàn bộ quy trình
Mình nghĩ các ứng dụng AI B2C bị giới hạn về mặt cấu trúc vì rất khó tạo ra ngữ cảnh cá nhân hóa
Nếu một mô hình cục bộ đủ giỏi có thể tự thu thập ngữ cảnh, nghiên cứu, gắn thẻ từ đầu ở quy mô lớn, thì đây có thể là một bước đột phá lớn
Bạn ném vào đó một loạt ảnh chụp màn hình, nó sẽ cố đặt tên thông minh dựa trên nội dung bên trong. Video, PDF... cũng vậy
Nhưng đúng như bạn nói, mình không hề cố kiếm tiền từ nó vì cảm giác Apple rồi sẽ đơn giản tích hợp luôn thành tính năng
https://finalfinalreallyfinaluntitleddocumentv3.com/
Nhưng mình nghĩ chỉ còn là vấn đề thời gian trước khi các agent đủ thông minh để cả những người bạn không chuyên kỹ thuật cũng chỉ cần nói “hãy sắp xếp các video trong thư mục này để mình có thể hiểu chúng”, rồi nó sẽ làm luôn đúng như vậy