Pixelle-Video: Một dòng chủ đề, một dây chuyền ComfyUI
TL;DR
- Dự án xâu chuỗi lên kịch bản (tuỳ chọn), sinh media từng shot, tổng hợp giọng, nhạc nền tuỳ chọn, rồi ffmpeg dựng file trong
output/qua giao diện Streamlit ba cột (README tiếng Anh). - Ảnh và video lấy từ ComfyUI máy bạn hoặc workflow JSON trên RunningHub; thêm graph bằng cách thả file API Format đúng tiền tố
image_,video_,tts_vàoworkflows/(FAQ). - Hợp người làm nội dung ngắn, đã coi ComfyUI là bếp pixel và chấp nhận tinh chỉnh workflow thay vì kéo layer trong NLE (README tiếng Anh).
- Điểm khác: từng bước là workflow có thể thay (đổi model ảnh, đổi TTS) mà khung Streamlit vẫn giữ nhịp (README tiếng Anh).
- Lộ trình thực tế:
uv run streamlit run web/app.py, mởhttp://localhost:8501, lưu cấu hình LLM và ComfyUI hoặc khóa RunningHub, bấm tạo video, đọc đường dẫn mp4 cùng thời lượng và số shot trên UI (README tiếng Anh, FAQ).
Tôi từng nghĩ khó nhất là nghĩ được câu mở đầu hay. Hoá ra khó nhất là lúc nửa đêm, shot thứ năm vẫn kẹt trên hàng đợi GPU và người viết caption nhắn hỏi “mình đổi một dòng thoại được không”. Lúc đó không thiếu ý tưởng, chỉ thiếu người chuyển bếp.
Tình huống: clip ngắn mà không muốn làm conveyor tay
Làm video dọc kiểu giải thích hay trend giống như quán bếp giờ cao điểm: có người ghi order, có người nấu, có người bày đĩa. Một mình gánh cả ba thì cái hình ảnh “bếp êm” sẽ vỡ. Pixelle-Video đóng vai người điều phối: giữ order rõ, đẩy từng món đúng trạm ComfyUI, rồi trả đĩa thành phẩm trong output/ (README tiếng Anh). Căng thẳng còn lại là máy bạn có giữ được ComfyUI không.
Nhiệm vụ: một câu cho người mới
Pixelle-Video là ứng dụng Streamlit mã nguồn Apache-2.0 tự động hoá video ngắn bằng cách nối LLM kiểu OpenAI (tuỳ chọn), workflow ComfyUI hoặc RunningHub cho khung hình, TTS, nhạc nền tuỳ chọn, template HTML, rồi ffmpeg, để một chủ đề hoặc kịch bản biến thành file đã dựng mà không lệ thuộc timeline NLE (README tiếng Anh).
Tình huống dùng thực tế
- Video kiểu giải thích từ một prompt: chế độ AI sinh nội dung, nhập chủ đề, hệ thống viết thoại và sinh hình (README tiếng Anh).
- Đã có kịch bản: chế độ Fixed Script bỏ bước LLM viết, vẫn chạy ảnh và giọng (README tiếng Anh).
- Giọng nhất quán: tải file tham chiếu MP3, WAV, FLAC cho workflow clone giọng như Index-TTS nếu bạn đặt graph đúng tiền tố
tts_(README tiếng Anh). - Thử nhiều khung hình: chọn template
static_*,image_*,video_*theo nhóm dọc, vuông, ngang (README tiếng Anh). - Tự chế workflow Comfy: sửa tiêu đề node text thành
$prompt.text!hoặc$prompt.value!, xuất API Format, đặt tên đúng, bỏ vàoworkflows/(FAQ).
Trước và sau nút bấm
# Trước (làm tay trong đầu)
1. Viết script ở Google Docs.
2. Sinh ảnh hoặc clip ở tool khác.
3. Chạy TTS hoặc thu âm riêng.
4. Căn layer trong NLE rồi export.
# Sau (happy path Pixelle-Video)
git clone https://github.com/AIDC-AI/Pixelle-Video.git
cd Pixelle-Video
uv run streamlit run web/app.py
# Mở http://localhost:8501
# Cấu hình hệ thống: LLM + ComfyUI http://127.0.0.1:8188 hoặc khóa RunningHub → Lưu
# Bấm tạo video → theo dõi tiến trình → mở output/<file>.mp4
UI sẽ báo kiểu “Frame 3/5 - Generating Image” và cuối cùng hiện thời lượng, dung lượng, số shot kèm file (README tiếng Anh, FAQ). Nhưng khi TTS miễn phí trục trặc thì sao?
Cách chạy cụ thể
-
Clone repo
- Lệnh:
git clone https://github.com/AIDC-AI/Pixelle-Video.git && cd Pixelle-Video - Kết quả: có
web/app.py, thư mụcworkflows/,templates/,bgm/(README tiếng Anh).
- Lệnh:
-
Bật Streamlit bằng uv
- Lệnh:
uv run streamlit run web/app.py - Kết quả: server cục bộ cổng
8501, giao diện ba cột (README tiếng Anh).
- Lệnh:
-
Gói Windows all-in-one
- Hành động: tải bản release mới nhất, chạy
start.bat - Kết quả: cùng cổng, không cần cài Python tay (README tiếng Anh).
- Hành động: tải bản release mới nhất, chạy
-
Chọn backend ảnh
- Máy bạn: điền URL ComfyUI, bấm kiểm tra kết nối
- Cloud: dán khóa RunningHub khi dùng workflow
runninghub/*.json(README tiếng Anh,config.example.yaml).
-
Kiểm tra file ra
- Lệnh:
ls output/sau khi chạy xong - Kết quả: các mp4 UI đã chỉ (FAQ).
- Lệnh:
Cây thư mục nên nhớ:
Pixelle-Video/
web/app.py
workflows/
templates/
bgm/
output/
Minh hoạ Markdy: đêm TTS báo lỗi
--> // making it invisible to querySelectorAll. // // This inline script is NOT touched by Rocket Loader (no src, no type attr). // It rescues module scripts via two strategies: // 1. Query the DOM for type$="-module" + src (covers case A) // 2. Regex-parse the raw HTML for commented-out script tags (covers case B) // Dynamically-created scripts bypass Rocket Loader entirely. (function () { if (window.__markdyRescue) return; window.__markdyRescue = true; var rescued = false; function rescueModuleScripts() { if (rescued) return; rescued = true; var srcs = []; // Strategy 1: Rocket Loader kept the tag in DOM but changed the type. // type="module" → type="{uuid}-module" (still has src attribute) document.querySelectorAll('script[type$="-module"][src]').forEach(function (s) { srcs.push(s.src); }); // Strategy 2: Rocket Loader COMMENTED OUT the script tag entirely: // // These are invisible to querySelectorAll, so we parse the raw HTML. // We handle both attribute orderings (type-first or src-first). var html = document.documentElement.innerHTML; var reSrcFirst = //g; var reTypeFirst = //g; var m; while ((m = reSrcFirst.exec(html)) !== null) { srcs.push(m[1]); } while ((m = reTypeFirst.exec(html)) !== null) { srcs.push(m[1]); } // Re-inject each found src as a real module script. // Deduplicate first, then inject. Dynamically-created scripts bypass // Rocket Loader entirely. Modules with the same URL are only executed // once by the browser (cached), so re-injecting already-running scripts // is safe. var seen = {}; srcs.forEach(function (src) { if (seen[src]) return; seen[src] = true; var fix = document.createElement('script'); fix.type = 'module'; fix.src = src; document.head.appendChild(fix); }); } // Rescue when user clicks the placeholder (fallback if autoplay failed). document.addEventListener('click', function (e) { var t = e.target; if (t && typeof t.closest === 'function' && t.closest('.markdy-placeholder')) { rescueModuleScripts(); } }); // Rescue automatically after a short delay for autoplay. // Only fires if initAll() never ran (no data-markdy-init on any root). setTimeout(function () { if (document.querySelector('.markdy-root:not([data-markdy-init])')) { rescueModuleScripts(); } }, 1500); }());Cấu hình và tuỳ biến
- Khối LLM trong
config.example.yaml:api_key,base_url,modelcho bất kỳ endpoint tương thích OpenAI; đổi khi bạn chuyển từ preset Qwen, GPT, DeepSeek hay Ollama (config.example.yaml). - URL ComfyUI và Docker: máy thật dùng
http://127.0.0.1:8188; container trên Mac hoặc Windows thửhost.docker.internal:8188, Linux thì IP máy host (config.example.yaml). runninghub_concurrent_limit: chỉ tăng khi gói RunningHub cho phép song song cao hơn, tránh hóa đơn bất ngờ (config.example.yaml).prompt_prefix: chuỗi tiếng Anh định hình style ảnh hoặc video; siết lại khi thương hiệu bắt một look cố định (config.example.yaml).template.default_template: ví dụ1080x1920/image_default.html; đổi khi kênh phát yêu cầu tỷ lệ khác (config.example.yaml).
💡 Mẹo: Sao chép config.example.yaml thành config.yaml cho mặc định tĩnh, nhưng UI cũng ghi cấu hình runtime. Không commit secret (config.example.yaml).
Chỗ nào hợp, chỗ nào không
- Hợp khi ComfyUI hoặc RunningHub đã là phần quen thuộc và bạn muốn lớp UI dẫn việc cho video ngắn, có lịch sử, batch, và các pipeline mở rộng như motion transfer được ghi trong mục cập nhật gần đây (README tiếng Anh).
- Không hợp khi bạn cần biên tập timeline cộng tác, keyframe tay từng milisecond; đây là tự động hoá trước hết.
- Có thể đứng cạnh Pixelle-MCP nếu bạn còn muốn agent gọi ComfyUI trực tiếp (README tiếng Anh).
Góc tối
- Edge-TTS phụ thuộc giao diện miễn phí của Microsoft, dễ lỗi mạng; FAQ khuyên chuyển sang workflow ComfyUI tiền tố
tts_cho ổn định hơn (FAQ). - Lỗi LLM thường là
base_urlsai, hết quota, hoặc gõ sai tên model; FAQ bảo kiểm tra từng mục (FAQ). - Một số tính năng cần Chromium; lỗi “Could not find a Chrome executable” hết khi cài Chrome (FAQ).
- Thời gian render phụ thuộc số shot, tốc độ model, mạng; README nói theo phút, không phải giây (README tiếng Anh).
⚠️ Cảnh báo: Khóa API là tiền thật. Streamlit mặc định cục bộ, nhưng mở cổng ra ngoài mà lộ RunningHub hoặc LLM key thì vẫn có thể bị quẹt phí.
So sánh nhanh: dự án README liệt kê
README cảm ơn Pixelle-MCP, MoneyPrinterTurbo, NarratoAI, MoneyPrinterPlus, và ComfyKit (README tiếng Anh). Pixelle-Video đặt cược vào workflow ComfyUI tách lớp cộng giao diện Streamlit thay vì một NLE đơn khối.
Kết
Tôi đỡ đếm đêm bằng số lần kéo layer. Kết quả cụ thể là file mp4 trong output/, một UI đọc cho bạn từng shot, và cộng đồng đẩy repo vượt mười hai nghìn sao trong lúc vẫn thêm pipeline digital human và motion transfer (README tiếng Anh). Bếp vẫn nóng, nhưng order cuối cùng cũng in ra được chữ rõ.
AIDC-AI/Pixelle-Video · Apache-2.0 · 12738 · docs
Hoang Yell
Một nhà phát triển phần mềm và là người kể chuyện kỹ thuật. Tôi dành thời gian để khám phá những repository mã nguồn mở thú vị nhất trên GitHub và trình bày chúng dưới dạng những câu chuyện dễ hiểu cho mọi người.