我们是如何在一周内使用 Google Gemini 构建 AI 漫画工作室的

发布: (2026年3月13日 GMT+8 20:07)
5 分钟阅读
原文: Dev.to

I’m happy to translate the article for you, but I need the full text you’d like translated. Could you please paste the content (or the portion you want translated) here? Once I have the text, I’ll provide a Simplified Chinese translation while preserving the original formatting, markdown, and any code blocks or URLs.

概述

漫画是世界上最具表现力的叙事形式之一,但传统创作需要多年艺术训练。Enpitsu(鉛筆 — 日语中“铅笔”的意思)是一个由 Google Gemini 驱动的全 AI 漫画工作室。用户输入故事创意,选择类型,Enpitsu 会生成完整的漫画——包括脚本、角色设定和绘制的分镜——并导出为 PDF。

基于 Gemini 的脚本生成

第一步使用 Gemini 2.5 Flash 并输出结构化的 JSON。通过传入题材和故事提示,Gemini 会返回完整的漫画脚本,内容包括:

  • 标题和日文标题
  • 剧情简介
  • 带有视觉描述的角色
  • 按面板划分的场景描述及对白

Gemini 的关键特性是 response_mime_type: "application/json"Pydantic response_schema 的组合,确保返回有效、可直接使用的 JSON,避免脆弱的解析。

response = await client.aio.models.generate_content(
    model="gemini-2.5-flash",
    contents=user_prompt,
    config=GenerateContentConfig(
        system_instruction=SYSTEM_PROMPT,
        response_mime_type="application/json",
        response_schema=StoryResponse,
    ),
)

角色设定表生成

对于每个角色,Gemini 的图像模型会生成专业的 settei (設定)——在真实动画制作中使用的角色参考表。每张表包含正面、3/4 视角和侧面视图以及情绪表情,线条干净,背景为白色。

在可用的 Gemini 图像预览模型之间采用三模型回退链,以确保在出现问题时能够优雅降级,而不是直接失败。

一致的面板生成

生成单个面板很简单,但在 20+ 面板中保持角色一致性具有挑战性。Enpitsu 通过以下方式解决:

  1. 在每次面板生成调用中,将每个角色的设定表作为多模态图像参考传入。
  2. 将每个参考标记为 “IN THIS PANEL”(必须完全匹配)“reference only”(仅作风格一致性参考)
  3. 将前一个面板作为额外的视觉提示。
for char_name, sheet_bytes in character_sheets.items():
    contents.append(types.Part.from_bytes(data=sheet_bytes, mime_type="image/png"))
    if char_name in present_set:
        contents.append(types.Part.from_text(
            text=f"[CHARACTER REFERENCE — IN THIS PANEL] {char_name} — match this design EXACTLY."
        ))
    else:
        contents.append(types.Part.from_text(
            text=f"[CHARACTER REFERENCE — NOT IN PANEL] {char_name} — provided for style consistency."
        ))

这种方法使角色从第 1 页一直到第 10 页都保持可辨识性。

实时流式传输(Server‑Sent Events)

生成大量面板可能需要时间。Enpitsu 不使用静态加载旋转图标,而是使用 Server‑Sent Events (SSE) 将面板在生成时实时流式传输到 UI,让用户能够实时观看漫画的绘制过程。

async def event_stream():
    for panel in panels:
        png_bytes = await generate_panel(panel, ...)
        event = PanelGenerationEvent(
            image_base64=base64.b64encode(png_bytes).decode()
        )
        yield f"data: {event.model_dump_json()}\n\n"
    yield "data: [DONE]\n\n"

return StreamingResponse(event_stream(), media_type="text/event-stream")

完成的漫画会在阅读器 UI 中显示,并使用 html2canvas + jsPDF 导出为 PDF。

技术栈

技术
前端Next.js 16, React 19, TypeScript, Tailwind CSS
后端Python, FastAPI, Uvicorn
AIGoogle Gemini 2.5 Flash + Gemini Image Models (Google GenAI SDK)
认证Firebase Authentication + Firebase Admin SDK
导出html2canvas + jsPDF

Lessons Learned

  • 多模态输入 是一种强大的连贯性工具;将角色表视为“视觉锚点”适用于任何需要一致 AI 角色的项目。
  • 使用带有 response_schema结构化 JSON 输出 可消除对 Gemini 文本输出的后处理。
  • SSE 是一种简单且高效的流式 AI 结果协议,通常比 WebSockets 更适合服务器到客户端的进度更新。

未来工作

  • Phase 2: LiveKit 集成——使用语音描述场景,并实时观看其生成。
  • 项目持久化和面板再生成也在路线图上。

Source Code

完整实现可在以下位置获取:

0 浏览
Back to Blog

相关文章

阅读更多 »