우리가 일주일 만에 Google Gemini로 AI 만화 스튜디오를 구축한 방법

발행: (2026년 3월 13일 오후 09:07 GMT+9)
7 분 소요
원문: Dev.to

Source: Dev.to

해당 텍스트를 번역하려면 실제 기사 내용이 필요합니다.
위에 제공된 것은 소스 링크만 포함되어 있으므로, 번역할 본문을 알려주시면 요청하신 대로 한국어로 번역해 드리겠습니다.

개요

만화는 세계에서 가장 표현력이 풍부한 스토리텔링 형식 중 하나이지만, 전통적으로 제작하려면 수년간의 예술 훈련이 필요합니다. Enpitsu(鉛筆 — 일본어로 “연필”)는 Google Gemini가 지원하는 완전한 AI 만화 스튜디오입니다. 사용자는 스토리 아이디어를 입력하고 장르를 선택하면 Enpitsu가 스크립트, 캐릭터 아트, 그리고 삽화가 포함된 완전한 만화를 생성하고 PDF로 내보냅니다.

Gemini 기반 스크립트 생성

첫 번째 단계에서는 구조화된 JSON 출력을 지원하는 Gemini 2.5 Flash를 사용합니다. 장르와 스토리 프롬프트를 전달하면 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 이미지 프리뷰 모델들 사이에 3개의 모델을 활용한 폴백 체인을 구축하여, 실패 대신 점진적인 품질 저하를 보장합니다.

일관된 패널 생성

하나의 패널을 생성하는 것은 간단하지만, 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

배운 점

  • Multimodal input은 강력한 일관성 도구이며, 캐릭터 시트를 “시각적 앵커”로 활용하면 일관된 AI 캐릭터가 필요한 모든 프로젝트에 적용할 수 있습니다.
  • response_schema를 사용한 Structured JSON output은 Gemini의 텍스트 출력에 대한 후처리를 없애줍니다.
  • SSE는 AI 결과를 스트리밍하기 위한 간단하고 효과적인 프로토콜이며, 서버‑클라이언트 진행 상황 업데이트에 WebSockets보다 선호되는 경우가 많습니다.

향후 작업

  • Phase 2: LiveKit 통합—음성으로 장면을 설명하고 실시간으로 생성되는 모습을 확인합니다.
  • 프로젝트 지속성 및 패널 재생성도 로드맵에 포함됩니다.

소스 코드

전체 구현은 다음에서 확인할 수 있습니다:

0 조회
Back to Blog

관련 글

더 보기 »

트라비고

Gemini와 함께 말하는 속도만큼 빠르게 여행하세요! 라이브 에이전트가 몰입형 스토리텔링 및 3D 내비게이션과 만나는 곳. 이 프로젝트는 Gemini Live Ag...에 진입하기 위해 만들어졌습니다.