跳到正文
阿里雲開發者社區 AI·· 3 小時前AI 評分44

ComfyUI 本地部署 AI 漫劇自動質檢流水線:檢測幀間閃爍、校驗畫面並自動重渲染不合格鏡頭

ComfyUI 本地部署 AI 漫剧自动质检流水线|帧间闪烁检测、画面校验、不合格镜头自动重渲染量产方案

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

image.gif

启动成功后,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 可选,用来本地字幕生成

image.gif

三、核心模块 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"])

image.gif

运行命令:

python comfy_api_submit.py

image.gif

四、核心模块 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}")

image.gif

运行:

python optical_flow_check.py

image.gif

参数说明: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("画面亮度跳变严重,光影不稳定,建议重跑")

image.gif

六、完整调度脚本:渲染 + 质检 + 失败自动重跑(量产流水线主程序)

新建 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("全部任务调度结束")

image.gif

配套 scene_batch.json 结构示例:

[
    {
        "scene_name":"scene_01开场",
        "output_node_id":"10",
        "workflow":{}
    },
    {
        "scene_name":"scene_02对话",
        "output_node_id":"10",
        "workflow":{}
    }
]

image.gif

workflow 里面直接填入导出的 ComfyUI 工作流 json,节点 ID 对应视频输出节点。

运行整条流水线:

python auto_render_pipeline.py

image.gif

七、本地 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")

image.gif

base 模型很小,8G 显存无压力;想要更高准确度换成 small,显存占用会上升。

八、FFmpeg 批量处理指令合集,适配短剧成片

8.1 批量把质检合格视频拼接

ffmpeg -f concat -safe 0 -i filelist.txt -c copy raw_all.mp4

image.gif

filelist.txt 示例:

file 'auto_output/scene01.mp4'
file 'auto_output/scene02.mp4'

image.gif

8.2 自动嵌入 srt 字幕,生成带字幕成片

ffmpeg -i raw_all.mp4 -vf "subtitles=subtitle.srt:force_style='Fontsize=24,PrimaryColour=&H00ffffff&'" -c:a copy final_drama.mp4

image.gif

8.3 批量补帧,提升镜头顺滑度(minterpolate)

ffmpeg -i raw_all.mp4 -vf minterpolate=fps=24:mi_mode=blend -c:a copy smooth.mp4

image.gif

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

image.gif

九、显存控制与流水线运行优化方案

  1. ComfyUI 每次渲染结束自动释放显存,可以在工作流末尾增加显存释放节点,或者脚本里主动调用:
import torch
torch.cuda.empty_cache()

image.gif

  1. 质检脚本单独跑,不要和视频推理同时抢占 GPU 显存,流水线逻辑:渲染完成→释放显存→再启动画面质检;
  2. 阈值可以做成配置文件,区分【漫剧平涂风格】和【写实视频风格】两套参数;
  3. 可以扩展:保存失败镜头清单,单独导出 csv 报表,方便人工复核。

十、常见故障排查

  1. ComfyUI API 连接失败:确认已经启动、防火墙没有拦截、没有开启密码验证;
  2. 光流检测速度很慢:视频分辨率太高,建议单镜头 408*720,不要直接跑 720P;
  3. Faster-Whisper CUDA 报错:模型换成 cpu 模式,修改 device="cpu";
  4. 误判严重:很多轻微镜头运动被判定闪烁,调高光流阈值,或者增加 “只检测关键帧” 的采样逻辑,跳过连续帧密集检测。

整套流水线适合打包进资源包:ComfyUI 工作流 json、全套 python 脚本、ffmpeg 批处理脚本、阈值配置说明,搭配 CSDN 文章分发。

來源:阿里雲開發者社區 AI · developer.aliyun.com