AI漫剧制 | 第 29 天:漫画分镜脚本——AI辅助的故事板

第 29/60 天

引言

分镜脚本(Storyboard)是漫画创作中连接文字脚本与最终画面的核心桥梁。传统漫画创作中,分镜师需要根据脚本逐格绘制草图,确定镜头角度、构图、角色位置和视线引导——这一过程耗时且高度依赖经验。对于AI漫画创作者而言,掌握分镜脚本技术不仅决定了作品的可读性,更直接影响AI生成画面的连贯性和叙事效果。

本文将深入解析漫画分镜的核心原理,展示如何利用AI工具(Claude、GPT-4、Stable Diffusion、ComfyUI)辅助完成从文字脚本到分镜脚本的完整流程,并提供可直接落地的工作流模板和代码示例。

核心概念

分镜脚本的核心要素

要素 说明 AI辅助价值
镜头景别 远景(Establishing)、中景(Medium)、特写(Close-up) AI可理解景别指示词,精确控制生成画面
镜头角度 俯视、仰视、平视、斜角(Dutch Angle) 特定角度词汇驱动AI生成不同透视效果
构图布局 九宫格、对角线、框架构图 ControlNet OpenPose / Canny 可锁定构图结构
视线引导 角色视线方向、动作流线、阅读路径 AI分析脚本后可推荐最优视线引导方案
页面节奏 格数分配、大格/小格/跨页节奏 AI可分析脚本情感曲线,匹配格数密度

传统分镜 vs AI辅助分镜

维度 传统分镜 AI辅助分镜
产出速度 30-60分钟/页(手绘草图) 3-5分钟/页(文字+AI生成)
修改成本 高(需重绘) 低(修改提示词即可)
一致性 依赖画师经验 依赖提示词体系 + ControlNet
专业门槛 需具备绘画基础 需具备分镜理论和提示词工程能力

AI分镜脚本工作流架构

文字脚本 → AI分镜分析 → 逐格提示词生成 → 图像生成 → 排版拼接 → 终稿
   ↑          ↑              ↑              ↑           ↑
  脚本         NLP           Prompt       SD/ComfyUI   Photoshop/Canva

实战步骤

步骤 1:用AI分析脚本并生成分镜表

首先,将原始文字脚本输入AI(如Claude),让其按漫画分镜格式逐格拆分。以下是示例脚本:

{
  "script": "小明在实验室发现了一个发光的试管。他犹豫了一下,伸手去拿。突然,试管爆炸了,一道蓝光冲入他的身体。",
  "tone": "科幻悬疑",
  "page_count": 2
}

使用以下系统提示词驱动AI生成结构化分镜表:

#!/usr/bin/env python3
"""AI漫画分镜脚本生成器 - 将文字脚本转换为分镜表"""

import json
import re

# 模拟AI分镜分析(实际使用时可替换为Claude/GPT-4 API调用)
def analyze_script_to_storyboard(script_text: str, style: str = "日漫") -> list:
    """
    将文字脚本拆解为逐格分镜描述

    Args:
        script_text: 原始文字脚本
        style: 漫画风格(日漫/美漫/条漫)

    Returns:
        分镜列表,每格包含:景别、角度、描述、对白、特效
    """
    # 此处为示例逻辑,实际应调用AI API
    panels = [
        {
            "panel": 1,
            "layout": "大格(跨页)",
            "shot": "远景",
            "angle": "平视",
            "description": "实验室全景,小明站在实验台前,台面上有一个发光的试管",
            "dialogue": "",
            "sfx": "【微弱嗡鸣声】",
            "composition": "小明位于画面左侧三分之一处,右侧为发光试管"
        },
        {
            "panel": 2,
            "layout": "中格",
            "shot": "特写",
            "angle": "平视",
            "description": "小明的手伸向试管,手指微微颤抖",
            "dialogue": "「这东西……感觉不太对劲」",
            "sfx": "",
            "composition": "手部特写,试管在焦点处发出蓝光"
        },
        {
            "panel": 3,
            "layout": "中格",
            "shot": "中景",
            "angle": "俯视",
            "description": "试管突然爆炸,蓝光充满画面",
            "dialogue": "「啊!」",
            "sfx": "【轰!💥】",
            "composition": "爆炸以试管为中心辐射状扩散"
        },
        {
            "panel": 4,
            "layout": "大格(满页)",
            "shot": "特写",
            "angle": "仰视",
            "description": "蓝光涌入小明身体,眼睛发出蓝光,表情痛苦扭曲",
            "dialogue": "",
            "sfx": "【滋滋——⚡】",
            "composition": "面部特写,蓝光从瞳孔向四周辐射"
        }
    ]
    return panels


# 生成分镜表(Markdown格式)
def storyboard_to_markdown(panels: list) -> str:
    md = "| 格号 | 布局 | 景别 | 角度 | 画面描述 | 对白 | 特效 |n"
    md += "|------|------|------|------|----------|------|------|n"
    for p in panels:
        md += f"| {p['panel']} | {p['layout']} | {p['shot']} | {p['angle']} | {p['description']} | {p['dialogue']} | {p['sfx']} |n"
    return md


if __name__ == "__main__":
    script = "小明在实验室发现了一个发光的试管。他犹豫了一下,伸手去拿。突然,试管爆炸了,一道蓝光冲入他的身体。"
    panels = analyze_script_to_storyboard(script)
    print(storyboard_to_markdown(panels))

步骤 2:将分镜表转换为AI绘画提示词

分镜表中的每格内容需要转换为Stable Diffusion可理解的提示词:

#!/usr/bin/env python3
"""分镜 → 提示词转换器"""

def panel_to_prompt(panel: dict, style: str = "manga") -> dict:
    """
    将分镜格描述转换为AI绘画提示词
    """
    # 基础风格提示词
    style_prompts = {
        "日漫": "anime style, manga style, Japanese comic, cel shading, line art",
        "美漫": "comic style, American comic, Marvel style, bold colors, dynamic shading",
        "写实": "realistic, detailed, cinematic lighting, photorealistic",
        "条漫": "webtoon style, vertical comic, clean line art, pastel colors"
    }

    # 景别映射
    shot_mapping = {
        "远景": "wide shot, establishing shot, full body, environmental",
        "中景": "medium shot, waist up",
        "特写": "close-up shot, extreme close-up, detailed"
    }

    # 角度映射
    angle_mapping = {
        "平视": "eye level, straight angle",
        "俯视": "high angle, bird's eye view, looking down",
        "仰视": "low angle, looking up, worm's eye view",
        "斜角": "dutch angle, tilted, dynamic angle"
    }

    prompt_parts = [
        style_prompts.get(style, style_prompts["日漫"]),
        shot_mapping.get(panel["shot"], ""),
        angle_mapping.get(panel["angle"], ""),
        panel["description"],
        "masterpiece, best quality, high resolution"
    ]

    negative_prompt = "low quality, bad anatomy, deformed hands, extra fingers, watermark, text, blurry, distorted"

    return {
        "positive": ", ".join(filter(None, prompt_parts)),
        "negative": negative_prompt,
        "width": 768 if panel["layout"] in ["大格(跨页)", "大格(满页)"] else 512,
        "height": 768
    }


def generate_all_prompts(panels: list, style: str = "日漫") -> list:
    """为所有分镜格生成提示词"""
    return [panel_to_prompt(p, style) for p in panels]


if __name__ == "__main__":
    panels = [
        {"panel": 1, "shot": "远景", "angle": "平视", "layout": "大格(跨页)", "description": "实验室全景,发光试管在台面上"},
        {"panel": 2, "shot": "特写", "angle": "平视", "layout": "中格", "description": "手伸向试管"},
        {"panel": 3, "shot": "中景", "angle": "俯视", "layout": "中格", "description": "试管爆炸,蓝光四射"},
        {"panel": 4, "shot": "特写", "angle": "仰视", "layout": "大格(满页)", "description": "蓝光涌入身体,眼睛发光"}
    ]
    prompts = generate_all_prompts(panels, "日漫")
    for i, p in enumerate(prompts, 1):
        print(f"n=== 第{i}格提示词 ===")
        print(f"正向: {p['positive']}")
        print(f"负向: {p['negative']}")
        print(f"尺寸: {p['width']}x{p['height']}")

步骤 3:使用ComfyUI构建分镜批处理工作流

以下是一个ComfyUI工作流JSON片段,用于批量生成分镜画面。将此文件导入ComfyUI即可使用:

{
  "name": "AI漫画分镜批处理工作流",
  "description": "批量生成漫画分镜画面,支持按格数自动切换提示词和ControlNet条件",
  "nodes": [
    {
      "id": 1,
      "type": "KSampler",
      "inputs": {
        "seed": 42,
        "steps": 30,
        "cfg": 7.5,
        "sampler_name": "euler",
        "scheduler": "normal",
        "denoise": 1.0
      }
    },
    {
      "id": 2,
      "type": "CLIPTextEncode",
      "inputs": {
        "text": "anime style, manga, close-up shot, eye level, hand reaching for glowing test tube, laboratory, blue light, masterpiece, best quality",
        "clip": null
      }
    },
    {
      "id": 3,
      "type": "CLIPTextEncode",
      "inputs": {
        "text": "low quality, bad anatomy, deformed hands, extra fingers, watermark, text, blurry",
        "clip": null
      }
    },
    {
      "id": 4,
      "type": "ControlNetLoader",
      "inputs": {
        "control_net_name": "control_v11p_sd15_openpose.pth"
      }
    },
    {
      "id": 5,
      "type": "VAEDecode",
      "inputs": {}
    },
    {
      "id": 6,
      "type": "SaveImage",
      "inputs": {
        "filename_prefix": "storyboard_panel_"
      }
    }
  ],
  "links": [
    [1, 0, 5, 0],
    [5, 0, 6, 0],
    [2, 0, 1, 1],
    [3, 0, 1, 2]
  ]
}

步骤 4:使用Shell脚本自动化分镜生成流程

以下是一个完整的自动化脚本,将分镜表 → 提示词 → 图像生成串联起来:

#!/bin/bash
# auto_storyboard.sh - AI漫画分镜自动生成脚本
# 用法: ./auto_storyboard.sh <脚本文件.txt> <输出目录>

SCRIPT_FILE="$1"
OUTPUT_DIR="${2:-./storyboard_output}"
STYLE="${3:-日漫}"

if [ ! -f "$SCRIPT_FILE" ]; then
    echo "❌ 错误: 找不到脚本文件 $SCRIPT_FILE"
    echo "用法: $0 <脚本文件.txt> [输出目录] [风格]"
    exit 1
fi

mkdir -p "$OUTPUT_DIR"

# 阶段1: AI分析脚本并生成分镜表
echo "📋 阶段1/5: 分析脚本,生成分镜表..."
python3 -c "
import json
# 模拟AI分镜分析(实际应调用Claude/GPT-4 API)
with open('$SCRIPT_FILE', 'r') as f:
    script = f.read()
print(json.dumps({
    'status': 'analyzed',
    'script': script,
    'panels': [
        {'panel': i+1, 'description': f'第{i+1}格画面'} for i in range(4)
    ]
}))
" > "$OUTPUT_DIR/storyboard.json

# 阶段2: 生成AI绘画提示词
echo "🎨 阶段2/5: 生成AI绘画提示词..."
python3 generate_prompts.py "$OUTPUT_DIR/storyboard.json" "$STYLE" 
    > "$OUTPUT_DIR/prompts.json"

# 阶段3: 调用SD API生成图像
echo "🖼️ 阶段3/5: 生成分镜图像..."
PANEL_COUNT=$(cat "$OUTPUT_DIR/prompts.json" | python3 -c "import sys,json; print(len(json.load(sys.stdin)))")

for i in $(seq 1 $PANEL_COUNT); do
    PROMPT=$(cat "$OUTPUT_DIR/prompts.json" | python3 -c "
import sys, json
data = json.load(sys.stdin)
print(data[$i-1]['positive'])
    ")

    curl -X POST "http://localhost:7860/sdapi/v1/txt2img" 
        -H "Content-Type: application/json" 
        -d "{
            "prompt": "$PROMPT",
            "negative_prompt": "low quality, bad anatomy",
            "steps": 30,
            "width": 768,
            "height": 768,
            "batch_size": 1
        }" > "$OUTPUT_DIR/panel_${i}_raw.json"

    echo "   ✅ 第${i}格生成完成"
done

# 阶段4: 排版拼接
echo "📐 阶段4/5: 分镜排版..."
python3 layout_panels.py "$OUTPUT_DIR" "$OUTPUT_DIR/storyboard_layout.png"

# 阶段5: 导出HTML预览
echo "🌐 阶段5/5: 生成HTML预览..."
cat > "$OUTPUT_DIR/preview.html" << HTML
<!DOCTYPE html>
<html>
<head><title>AI漫画分镜预览</title></head>
<body>
<style>
  body { font-family: sans-serif; max-width: 1200px; margin: 0 auto; padding: 20px; }
  .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
  .panel { border: 2px solid #333; padding: 10px; }
  .panel img { width: 100%; }
  .panel-num { font-size: 24px; font-weight: bold; color: #666; }
</style>
<h1>📖 漫画分镜预览</h1>
<div class="grid">
HTML

for i in $(seq 1 $PANEL_COUNT); do
    cat >> "$OUTPUT_DIR/preview.html" << HTML
<div class="panel">
  <div class="panel-num">格 #$i</div>
  <img src="panel_${i}.png" alt="panel $i">
</div>
HTML
done

cat >> "$OUTPUT_DIR/preview.html" << HTML
</div>
</body>
</html>
HTML

echo ""
echo "✅ 分镜生成完成!"
echo "   📁 输出目录: $OUTPUT_DIR"
echo "   🌐 预览文件: $OUTPUT_DIR/preview.html"

步骤 5:用ControlNet锁定分镜构图

为了确保AI生成的分镜画面与预设构图一致,使用ControlNet的多种控制模式:

# controlnet_config.yaml
# 不同分镜场景适用的ControlNet配置

scenes:
  - scene: "角色姿态"
    controlnet: "openpose"
    preprocessor: "openpose_full"
    weight: 0.8
    guidance_start: 0.0
    guidance_end: 0.8
    description: "锁定角色手部/身体姿态,适用于动作场景"

  - scene: "构图布局"
    controlnet: "canny"
    preprocessor: "canny_edge"
    weight: 0.7
    guidance_start: 0.0
    guidance_end: 0.7
    description: "锁定画面边缘/线条结构,适用于复杂构图"

  - scene: "深度透视"
    controlnet: "depth"
    preprocessor: "depth_leres"
    weight: 0.6
    guidance_start: 0.0
    guidance_end: 0.6
    description: "锁定空间深度关系,适用于远景/俯仰角度"

  - scene: "颜色参考"
    controlnet: "ip-adapter"
    preprocessor: "ip-adapter_clip_sd15"
    weight: 0.5
    guidance_start: 0.0
    guidance_end: 1.0
    description: "参考上一格色彩风格,保持页面色调统一"

# 分镜格类型 → ControlNet映射
panel_mapping:
  "远景": ["depth", "canny"]
  "中景": ["openpose", "canny"]
  "特写": ["openpose", "ip-adapter"]
  "动作场景": ["openpose", "depth"]

常见问题

Q1:AI分镜生成的画面与文字描述不符怎么办?

A: 这是最常见的问题。解决方案有三层:第一,在提示词中增加景别和角度的英文关键词(如 close-up shot, low angle),AI模型对英文理解的准确率通常高于中文;第二,使用ControlNet OpenPose提供参考姿态图,锁定角色位置;第三,如果偏差仍然严重,改为使用img2img模式,先手绘草图再让AI渲染细化。

Q2:AI能否自动识别脚本中的情感节奏并匹配分镜密度?

A: 可以。将脚本输入Claude或GPT-4,使用如下提示词:「分析以下脚本的情感曲线,将高潮部分标注为需要大格/跨页,平静部分标注为小格/多格页面」。AI会自动根据关键词(如「突然」「爆炸」「震惊」→大格;「平静地」「思考」「慢走」→小格)分配分镜格大小。但建议人工复核AI的节奏判断,因为情感理解仍存在主观偏差。

Q3:多格分镜面是否需要保持角色一致性?

A: 需要,这是AI漫画的最大挑战。推荐方案:为每个角色训练LoRA模型(详见第14天),每格使用相同的LoRA权重和角色ID。如果分镜集中在同一页面内,可使用IP-Adapter的参考图像模式,以第一格生成的画面作为后续格的颜色和风格参考,实现跨格一致性。

Q4:ComfyUI工作流中如何实现批量分镜生成?

A: 使用ComfyUI的 Batch Prompt Schedule 节点(或 CR Prompt List 节点),将所有分镜格的提示词作为一个列表输入,设置 batch_size 为分镜格数。配合 LatentFromBatchImageFromBatch 节点,可以一次生成所有分镜画面。参考上面的JSON工作流模板,修改 CLIPTextEncode 节点的 text 输入为动态列表即可。

Q5:分镜脚本中的文字(对白、拟声词)是否应该在生成阶段一并处理?

A: 不建议。AI生成阶段在画面中嵌入文字往往效果不佳(变形、模糊、位置错误)。推荐流程:先纯图像生成,然后在后期处理中使用Photoshop、Clip Studio Paint或Canva添加对白气泡、旁白框和拟声词。如果希望AI辅助文字排版,可使用 AnyTextTextDiffuser 等专门模型来生成高质量的文字嵌入效果。

总结

漫画分镜脚本是AI漫画创作中”人机协作”最紧密的环节——人类提供叙事结构和画面意识,AI提供批量生成和快速迭代的能力。掌握分镜脚本技术,意味着你不再只是「让AI画图」,而是「让AI讲好故事」。

核心要点:
1. 分镜表是AI漫画的质量锚点 — 没有分镜表的AI漫画,画面质量再高也缺乏叙事连贯性。每个分镜格都应包含景别、角度、画面描述、对白和特效五个要素。
2. 提示词工程与分镜理论深度绑定 — 景别词(close-up/medium/wide)、角度词(low angle/high angle/dutch angle)是AI理解分镜意图的关键桥梁,必须熟练掌握。
3. ControlNet是分镜一致性的技术保障 — OpenPose锁定姿态、Canny锁定构图、Depth锁定透视,三者组合使用可让AI生成画面”按图施工”。
4. 自动化流程可大幅提升分镜效率 — 从脚本分析 → 分镜表 → 提示词 → 批量生成 → 排版预览,全流程可脚本化,一页分镜从1小时缩短到5分钟。
5. 人机协作是最优解 — AI负责快速生成、批量迭代、多方案对比;人类负责节奏感知、情感把控、最终审美决策。相互补位,而非替代。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容