ComfyUI 本地部署 AI 漫劇自動質檢流水線:檢測幀間閃爍、校驗畫面並自動重渲染不合格鏡頭
ComfyUI 本地部署 AI 漫剧自动质检流水线|帧间闪烁检测、画面校验、不合格镜头自动重渲染量产方案
ComfyUI 本地部署 AI 漫劇質檢流水線,透過光流時序校驗及色彩波動檢測標記不合格鏡頭,並自動安排重渲染。8G 顯存即可運行,並整合本地 Faster-Whisper 字幕生成及 Python 調度腳本。整套流程離線部署,不需雲端審核接口;檢測只判斷畫面指標,不涉及內容合規審核。
2026-10-30 10
版权
版权声明:
本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
简介: 本文提出一套8G显存即可运行的本地AI漫剧量产流水线:基于ComfyUI API,集成光流时序校验、色彩波动检测、本地Faster-Whisper字幕生成及自动重跑机制,配套Python调度脚本与FFmpeg后期命令,全程离线部署,无需云端审核,显著提升批量渲染稳定性与效率。(239字)
摘要
本地 AI 漫剧量产最大痛点不是生成画面,而是批量渲染之后大量镜头存在闪烁、角色变脸、画面崩坏,人工逐帧检查耗时极高。本文基于 ComfyUI API,搭建一套带本地自动质检的 AI 漫剧流水线,8G 显存显卡可跑,集成光流时序校验、色彩波动检测、本地 Faster-Whisper 字幕生成、不合格镜头自动回队列重跑,配套完整 Python 调度脚本、批量处理指令、FFmpeg 后期自动化命令,整套流程离线本地部署,不需要云端审核接口,适合长期稳定批量产出漫剧短剧素材。
前置说明:Windows + NVIDIA 显卡,CUDA12.1,ComfyUI 开启 API 服务,所有脚本和检测逻辑全部在本地运行,检测仅做画面指标判断,不涉及内容合规审核,合规校验需要创作者自行把控。
具体详细资源教程请看这一篇文章:Wan2.2-ReMixV3.0 本地部署:8G 显存 AI 漫剧图生视频长片段生成实战_wan rar v2.3-CSDN博客
一、ComfyUI 开启 API 服务(启动指令)
常规启动 ComfyUI 默认开启 API,如果你关闭了,用这个启动脚本: 新建 start_comfy_api.bat
@echo off set CUDA_VISIBLE_DEVICES=0 set PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128,expandable_segments:True set HF_HUB_CACHE=./models_cache python main.py --enable-cors-header pause
启动成功后,API 地址:http://127.0.0.1:8188,所有脚本都通过这个地址提交工作流任务。
二、依赖安装指令
pip install torch opencv-python numpy faster-whisper requests pillow -i https://pypi.tuna.tsinghua.edu.cn/simple # faster-whisper 可选,用来本地字幕生成
三、核心模块 1:ComfyUI API 任务提交脚本(提交漫剧分镜工作流)
新建 comfy_api_submit.py
import requests import json import os import time COMFY_URL = "http://127.0.0.1:8188" def queue_workflow(workflow_json: dict): payload = {"prompt": workflow_json} resp = requests.post(f"{COMFY_URL}/prompt", json=payload, timeout=30) if resp.status_code == 200: return resp.json()["prompt_id"] else: print("工作流提交失败", resp.text) return None def wait_task_finish(prompt_id: str, interval=3): while True: res = requests.get(f"{COMFY_URL}/history/{prompt_id}", timeout=15) data = res.json() if prompt_id in data: return data[prompt_id] time.sleep(interval) if __name__ == "__main__": # 读取本地保存的漫剧工作流json with open("./manju_workflow.json","r",encoding="utf-8") as f: wf = json.load(f) pid = queue_workflow(wf) print(f"任务已入队,prompt_id={pid}") result = wait_task_finish(pid) print("渲染完成,输出信息:", result["outputs"])
运行命令:
python comfy_api_submit.py
四、核心模块 2:光流法时序稳定检测脚本(判断画面闪烁、角色漂移,质检核心)
原理:相邻帧光流均值突变,代表画面剧烈闪烁、人物五官漂移,直接标记镜头不合格,加入重渲染队列,适合 AI 漫剧批量质检。 新建 optical_flow_check.py
import cv2 import numpy as np def calc_optical_flow_score(prev_frame, curr_frame): gray1 = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(curr_frame, cv2.COLOR_BGR2GRAY) # Farneback稠密光流 flow = cv2.calcOpticalFlowFarneback( gray1, gray2, None, pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5, poly_sigma=1.2, flags=0 ) mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1]) avg_mag = np.mean(mag) return avg_mag def scan_video_flow(video_path, threshold=6.0): cap = cv2.VideoCapture(video_path) ret, prev = cap.read() if not ret: return False, 0 frame_count = 0 bad_count = 0 max_score = 0 while True: ret, curr = cap.read() if not ret: break score = calc_optical_flow_score(prev, curr) max_score = max(max_score, score) if score > threshold: bad_count +=1 prev = curr frame_count +=1 cap.release() if frame_count == 0: return False, max_score bad_ratio = bad_count / frame_count # 坏帧占比超过12%判定为闪烁镜头 if bad_ratio > 0.12: return False, max_score return True, max_score if __name__ == "__main__": test_vid = "./output_scene.mp4" ok, score = scan_video_flow(test_vid, threshold=6.0) if ok: print(f"镜头质检通过,最大光流值:{score:.2f}") else: print(f"镜头闪烁/漂移超标,需要重渲染,最大光流值:{score:.2f}")
运行:
python optical_flow_check.py
参数说明:threshold 阈值根据你的漫剧风格调整,平涂漫剧一般 4~7;写实视频可以拉高到 8~10。
五、核心模块 3:色彩波动检测(解决光影跳变、画面忽亮忽暗)
新建 color_stability_check.py
import cv2 import numpy as np def check_color_jitter(video_path, threshold=35): cap = cv2.VideoCapture(video_path) ret, frame = cap.read() if not ret: return False prev_mean = np.mean(frame) while True: ret, frame = cap.read() if not ret: break curr_mean = np.mean(frame) diff = abs(curr_mean - prev_mean) if diff > threshold: cap.release() return False prev_mean = curr_mean cap.release() return True if __name__ == "__main__": v = "./output_scene.mp4" res = check_color_jitter(v, threshold=35) if res: print("色彩稳定检测通过") else: print("画面亮度跳变严重,光影不稳定,建议重跑")
六、完整调度脚本:渲染 + 质检 + 失败自动重跑(量产流水线主程序)
新建 auto_render_pipeline.py
import json import os import time from comfy_api_submit import queue_workflow, wait_task_finish from optical_flow_check import scan_video_flow from color_stability_check import check_color_jitter SCENE_CONFIG = "./scene_batch.json" OUT_DIR = "./auto_output" os.makedirs(OUT_DIR, exist_ok=True) def single_scene_render(scene_cfg, max_retry=2): retry = 0 while retry <= max_retry: print(f"\n====开始渲染:{scene_cfg['scene_name']} 重试次数 {retry} ====") wf = scene_cfg["workflow"] pid = queue_workflow(wf) if not pid: retry +=1 time.sleep(5) continue task_result = wait_task_finish(pid) video_file = task_result["outputs"][scene_cfg["output_node_id"]]["images"][0]["filename"] vid_full_path = os.path.join(OUT_DIR, video_file) # 双重质检 flow_ok, flow_score = scan_video_flow(vid_full_path) color_ok = check_color_jitter(vid_full_path) if flow_ok and color_ok: print(f"{scene_cfg['scene_name']} 质检全部通过!") return True, vid_full_path else: print(f"{scene_cfg['scene_name']} 质检失败,准备重试,flow={flow_score:.2f}") retry +=1 time.sleep(8) print(f"{scene_cfg['scene_name']} 重试上限耗尽,标记为失败镜头") return False, None if __name__ == "__main__": with open(SCENE_CONFIG, "r", encoding="utf-8") as f: scene_list = json.load(f) for scene in scene_list: single_scene_render(scene) print("全部任务调度结束")
配套 scene_batch.json 结构示例:
[ { "scene_name":"scene_01开场", "output_node_id":"10", "workflow":{} }, { "scene_name":"scene_02对话", "output_node_id":"10", "workflow":{} } ]
workflow 里面直接填入导出的 ComfyUI 工作流 json,节点 ID 对应视频输出节点。
运行整条流水线:
python auto_render_pipeline.py
七、本地 Faster-Whisper 字幕批量生成脚本(漫剧配音字幕自动生成)
新建 gen_subtitle.py
from faster_whisper import WhisperModel import os def generate_srt(video_path, srt_out_path, model_size="base"): model = WhisperModel(model_size, device="cuda", compute_type="int8") segments, _ = model.transcribe(video_path, language="zh") with open(srt_out_path, "w", encoding="utf-8") as f: idx = 1 for seg in segments: start = seg.start end = seg.end def fmt(sec): h = int(sec//3600) m = int((sec%3600)//60) s = sec%60 return f"{h:02d}:{m:02d}:{s:06.3f}".replace(".",",") f.write(f"{idx}\n") f.write(f"{fmt(start)} --> {fmt(end)}\n") f.write(f"{seg.text.strip()}\n\n") idx +=1 print(f"字幕生成完成:{srt_out_path}") if __name__ == "__main__": generate_srt("./final_scene.mp4", "./subtitle.srt", model_size="base")
base 模型很小,8G 显存无压力;想要更高准确度换成 small,显存占用会上升。
八、FFmpeg 批量处理指令合集,适配短剧成片
8.1 批量把质检合格视频拼接
ffmpeg -f concat -safe 0 -i filelist.txt -c copy raw_all.mp4
filelist.txt 示例:
file 'auto_output/scene01.mp4' file 'auto_output/scene02.mp4'
8.2 自动嵌入 srt 字幕,生成带字幕成片
ffmpeg -i raw_all.mp4 -vf "subtitles=subtitle.srt:force_style='Fontsize=24,PrimaryColour=&H00ffffff&'" -c:a copy final_drama.mp4
8.3 批量补帧,提升镜头顺滑度(minterpolate)
ffmpeg -i raw_all.mp4 -vf minterpolate=fps=24:mi_mode=blend -c:a copy smooth.mp4
8.4 批量压缩,适配短剧平台上传规范(9:16 竖屏)
ffmpeg -i smooth.mp4 -c:v libx264 -preset medium -crf 23 -b:v 850k -r 24 -vf "scale=408:720" -c:a aac final_export.mp4
九、显存控制与流水线运行优化方案
- ComfyUI 每次渲染结束自动释放显存,可以在工作流末尾增加显存释放节点,或者脚本里主动调用:
import torch torch.cuda.empty_cache()
- 质检脚本单独跑,不要和视频推理同时抢占 GPU 显存,流水线逻辑:渲染完成→释放显存→再启动画面质检;
- 阈值可以做成配置文件,区分【漫剧平涂风格】和【写实视频风格】两套参数;
- 可以扩展:保存失败镜头清单,单独导出 csv 报表,方便人工复核。
十、常见故障排查
- ComfyUI API 连接失败:确认已经启动、防火墙没有拦截、没有开启密码验证;
- 光流检测速度很慢:视频分辨率太高,建议单镜头 408*720,不要直接跑 720P;
- Faster-Whisper CUDA 报错:模型换成 cpu 模式,修改
device="cpu"; - 误判严重:很多轻微镜头运动被判定闪烁,调高光流阈值,或者增加 “只检测关键帧” 的采样逻辑,跳过连续帧密集检测。
整套流水线适合打包进资源包:ComfyUI 工作流 json、全套 python 脚本、ffmpeg 批处理脚本、阈值配置说明,搭配 CSDN 文章分发。
來源:阿里雲開發者社區 AI · developer.aliyun.com