그림 · 음성 스타일 가이드
채널마다 AI 그림의 화풍 문장, AI Studio 에서 고르는 목소리, 말투 지시(Style)를 그대로 옮겨 적었습니다. 새 편을 만들 때 여기서 복사해 쓰면 편이 바뀌어도 그림체와 음색이 흔들리지 않습니다.
여덟 살의 질문
- 그림 일본 개그만화 스티커풍, 화풍 앵커 그림 첨부
- 음성 AI Studio 여러 화자 — 아빠 Algenib 아이 Leda 엄마 Kore
숫자로 보는 요즘
- 그림 쓰지 않음 — 글자 · 도형 · 코드로 그린 차트만
- 음성 지금까지는 없음(자막 + 코드 합성 BGM). 넣을 때의 후보 Laomedeia
웃긴 영상툰
- 그림 얼굴만 — 한국 개그웹툰 '그로테스크-귀여움' 표정 6칸 시트
- 음성 한 줄씩 단일 화자 — 선배 Charon 후배 Puck 등
0. 공통
| 무엇 | 어디서 | 메모 |
|---|---|---|
| 음성 | Google AI Studio — Generate speech | 사전 정의 목소리(Algenib · Leda …) 중에서 고르고, Style 칸에 말투를 영어 문장으로 적는다. 받은 파일은 24kHz · 16비트 · 모노 WAV. |
| 그림 | Gemini 앱(손으로) 또는 Gemini API(스크립트) | 캐릭터 · 소품은 단색 초록 #00FF00 배경으로 받아서 코드가 배경을 지운다. |
| API 키 | 저장소 루트 D:\youtube\.env 하나만 | GEMINI_API_KEY(기본) · GEMINI_API_KEY2(한도에 걸리면 예비). 프로젝트마다 복사하지 않는다. |
artgen.mjs epNN --list, voice.mjs epNN jobs / studio, facegen.mjs --list)를 쓴다.세 채널이 똑같이 지키는 것
- 목소리 복제 기능은 쓰지 않는다. 실존 인물 목소리를 흉내 내지 않고, 사전 정의 목소리만 쓴다.
- 그림에 글자를 그리지 않는다. 자막 · 간판 · 숫자는 영상 코드가 얹는다. 모든 프롬프트 끝에
No text, no letters, no numbers, no logos. - 정해진 목소리는 바꾸지 않는다. 바꿔야 하면 설정 파일과 이 문서를 같이 고치고 날짜를 남긴다.
- 말투 지시는 Style 칸(또는 API 프롬프트 앞머리)에만 쓴다. 대사 칸에 쓰면 그대로 읽어 버린다.
qna1. 여덟 살의 질문
설정 원본은 qna/video/src/voice.json(음성)과 qna/video/scripts/prompts.mjs · qna/video/src/art-common.json(그림)입니다. 자세한 설명은 qna/video/VOICE.md, 공통 그림 프롬프트 전체는 qna/art/common/GEMINI_PROMPTS.md.
1-1. 목소리 — AI Studio 여러 화자 모드
| 자리 | 누구 (역할 id) | 목소리 | Style 칸에 넣는 말투 지시 | 상태 |
|---|---|---|---|---|
| Speaker 1 | 나레이션 · 아빠 · 다큐 톤narr dad docu | Algenib | A balding Korean dad in his mid-forties: thick, deep, slightly husky ajusshi voice, relaxed and good-humored, telling a story about his kid | 1편부터 확정 |
| Speaker 2 | 아이 kid | Leda | His eight-year-old child: bright, curious, high-pitched (1편 AI Studio 에서는 비워 둠 — 목소리 기본값) | 1편부터 확정 |
| 비는 자리 | 엄마 mom | Kore | The kid's mom, a Korean woman in her late thirties: calm, clear, slightly low voice with a quiet knowing smile in it, dry and gently teasing toward the dad, warm and patient with the kid, never shrill or scolding | 2026-10-16 정함, 들어 보기 전 |
| 비는 자리 | 시장 할머니 granny (3편) | Gacrux | A loud, cheerful Korean market grandmother in her seventies: hearty, quick and teasing in a thick country accent, with a laugh in her voice, warm and never angry | 들어 보기 전 |
| 비는 자리 | 이발사 할아버지 barber (4편) | Charon | A Korean barber grandpa in his early seventies who has run a neighborhood barbershop for fifty years: dry, slow, deadpan and gently teasing, a warm low old-man voice with a chuckle in it, proud of his craft and happy to laugh at his own bald head, never stern | 들어 보기 전 · 아빠와 비슷하면 Sadaltager / Rasalgethi |
| 비는 자리 | 약사 선생님 pharmacist (5편) | Sulafat | A calm, kind Korean pharmacist woman in her early fifties who has run a small neighborhood pharmacy for twenty years: warm, clear, unhurried voice with a gentle dry humor, precise and reassuring, never stern | 들어 보기 전 |
| 비는 자리 | 간호사 선생님 nurse | Zephyr | A calm, kind Korean pediatric nurse woman in her early thirties: soft, clear, gentle voice with a warm smile in it, patient and reassuring with children, corrects grown-ups politely with a little playful humor, never stern | 들어 보기 전 |
전체 연출 지시 (API 는 대본 앞머리에 자동으로 붙인다. AI Studio 에서 전체 지시 칸이 있으면 여기에):
Korean family YouTube video. Speak natural conversational Korean at a brisk, lively pace, like an upbeat YouTube video, never slow or drawn out. Leave a clear pause of about one second between every line, and no long pause inside a line. Never read the speaker labels aloud.
연기 구분 — 같은 Algenib 목소리로 세 가지를 낸다:
| 역할 | 지시 |
|---|---|
narr 나레이션 | Speaker 1 말투 지시 그대로 — 아빠가 아이 이야기를 들려주는 느낌 |
dad 아빠 대사 | is the dad speaking inside the scene, acted out, not narration |
docu 다큐 톤 | is read in a very deep, slow, mock-serious nature-documentary narrator voice |
AI Studio 에서 손으로 만드는 순서
qna/video에서npm run voice -- epNN studio→out/epNN/voice-studio.html을 연다. 컷마다 대사 복사 버튼과 그 컷에서 고를 목소리가 적혀 있다.- AI Studio 를 여러 화자(Multi-speaker) 모드로 두고 Speaker 1 = Algenib, Speaker 2 = Leda.
- 화면이 블록 방식이면 아빠 · 나레이션 블록의 Style 칸에 Speaker 1 말투 지시를 넣는다.
- 손님 · 엄마가 나오는 컷은 그 컷에서 비는 자리를 바꾼다. 예: 아빠 + 할머니 → Speaker 2 = Gacrux / 아이 + 엄마 → Speaker 1 = Kore.
- 생성 →
voice-studio/epNN/<컷id>.wav로 저장 →npm run voice -- epNN split으로 줄마다 자르고 타이밍 갱신.
npm run voice -- epNN jobs 가 검사).고른 과정: 아빠 Fola → Varo → Algenib("좀 더 굵게"), 아이 Rami → Leda("좀 더 어리게"). 안 써 본 후보: 아빠 Ludo · Bodi, 아이 Zephyr · Laomedeia · Achernar.
1-2. 그림 — 화풍
모든 그림 프롬프트는 이 화풍 문장으로 시작합니다 (prompts.mjs 의 STYLE):
Japanese gag-manga sticker illustration style. Grotesquely exaggerated comedic expressions, huge open mouths with detailed teeth and gums, bulging eyes, sweat drops, wrinkles. Semi-realistic airbrushed skin shading with glossy highlights. Big head, short stocky body (about 2.5 heads tall). Thin brown-black ink linework, saturated colors, clean edges. Korean setting, Korean people unless stated otherwise. No text, no letters, no numbers, no logos, no watermark, no signature.
그다음 첨부 그림에 맞추라는 문장이 붙습니다:
Match the art style of the first attached image exactly: same line weight, same skin shading, same color saturation, same level of exaggeration. The character must be exactly the same person as in attached image 2: same face, hairstyle, hair color, clothes, colors and body shape. Only the pose and expression change.
| 첨부 | 파일 | 왜 |
|---|---|---|
| ① | qna/art/anchor/style-cutin.png | 화풍 앵커. 모든 요청에 첫 번째로 첨부. 바꾸면 채널 전체 화풍이 바뀐다. |
| ② | 그 사람의 기본 그림 (예: art/common/dad/normal.png) | 같은 사람 유지용. 표정 · 자세만 바뀐다. |
가족 캐릭터 설정 (그대로 복사)
| 누구 | 설정 문장 |
|---|---|
| 아빠 | the dad: a Korean father in his late 30s, slightly chubby with a round face, short black hair that is clearly thinning on top, thick eyebrows, faint stubble, wearing a mustard-yellow knit cardigan over a white t-shirt, gray sweatpants and house slippers; a kind but easily flustered look |
| 아이 | the kid: an 8-year-old Korean child with a black bowl-cut, huge round curious eyes, one missing front tooth, wearing a red hoodie, navy shorts and white socks; small, fearless and very direct |
| 엄마 | the mom: a Korean mother in her late 30s, slim with a soft oval face and a fair complexion, a shoulder-length dark brown bob with a side part, one side tucked behind her ear and the ends curling slightly inward, thin silver round wire-frame glasses, calm almond-shaped eyes, wearing a sage-green crew-neck knit sweater, beige wide-leg pants and house slippers; calm, sharp and quietly amused, the one who usually already knows the answer |
그림 종류와 비율
종류 (kind) | 비율 | 배경 | 핵심 지시 |
|---|---|---|---|
캐릭터 char | 2:3 세로 | 초록 | 전신, 머리부터 발끝까지 여백. 팔과 들고 있는 물건은 몸에서 떨어지게(움직일 때 안 어색하게). |
리액션 컷인 cutin | 1:1 | 초록 | 가슴 위 클로즈업, 얼굴이 화면 대부분, 과장 최대. |
소품 prop | 1:1 | 초록 | 하나로 이어진 덩어리, 떨어진 조각 없이. |
배경 bg | 16:9 | 장면 | 사람 없음, 시트콤 세트처럼 정면. 아래 1/3 은 비워 둔다(인물 자리). |
무대 장면 stage | 16:9 | 장면 | 주인공 자리를 비워 둔 만화 한 칸. 왼쪽 위는 자막 자리라 조용하게. |
한 장짜리 장면 full | 16:9 | 장면 | 완성 그림. 주인공은 가운데, 왼쪽 위는 조용하게. |
앞쪽 레이어 layer | 16:9 | 초록 | 인물 앞을 가리는 넓은 물건(카운터 · 책상), 아래 절반에. |
말하는 그림 talk (-b) | 기준 그림과 같게 | 초록 | 두 번째 프레임. ②를 그대로 다시 그리고 입만 바꾼다. |
다시 뽑을 때 이어서 보내는 문장
| 문제 | 보낼 문장 |
|---|---|
| 배경이 단색 초록이 아님 | Redo it with a perfectly flat pure green #00FF00 background, no shadow, no floor. |
| 몸이 잘림 | Zoom out so the whole body fits with empty margin on every side. |
| 다른 사람처럼 나옴 | Keep the exact same face, hair and clothes as attached image 2. Only change the pose. |
| 글자가 들어감 | Remove all text and letters; leave signs blank. |
| 화풍이 순해짐 | More grotesque gag-manga exaggeration, like the first attached image: bigger mouth, bulging eyes, more sweat. |
| 배경에 사람이 있음 | Remove every person. Background only. |
| 말하는 그림의 몸이 달라짐 | Too different. Copy attached image 2 exactly and change only the mouth. |
- 한 사람은 한 대화창에서 끝내고, 다음 사람 · 배경은 새 대화창에서. 대화가 길어지면 화풍이 흐려진다.
- 배경 제거 · 자르기 · 크기 조절은 하지 않는다 —
npm run art -- epNN이 한다. - 몸 · 성 관련 소재는 몸을 그리지 않는다 (닫힌 문 · 거품 모자이크 · 단면도).
shortube2. 숫자로 보는 요즘
2-1. 그림 — 쓰지 않는다
화면은 1080×1920 에 글자 · 도형 · 코드로 직접 그린 차트만 씁니다. AI 그림, 사진, 로고, 캡처, 앨범아트는 쓰지 않습니다 (COMPLIANCE_GUIDE 1-1). 대신 쓰는 재료:
- 코드 생성: SVG 필터(아지랑이
feTurbulence, 노이즈), 입자(낙엽 · 비), 그라디언트, 도형 패턴, 카메라 팬 · 줌 - 라이선스가 분명한 외부 자료: Natural Earth 지도, Material Symbols · Tabler Icons, Noto Emoji, OFL 폰트 —
video/public/<종류>/LICENSE.md에 출처를 적는다 - 브랜드: 남색 바탕 + 노랑 선 + 분홍 점 (
video/src/Brand.tsx). 첫 1초 로고 띠나 마지막 띠로만 지키고, 본문 색은 주제에 맞춰 바꾼다.
2-2. 음성 — 지금은 없음, 넣을 때의 기준
내레이션에 AI 음성을 사용했습니다 한 줄을 넣습니다. 아래는 shortube/TTS_GUIDE.md 의 기준이며, 목소리는 아직 확정 전입니다.목소리 정체성: "데이터 좋아하는 친한 친구" — 뉴스 앵커도, 흥분한 예능 자막도 아닌 중간. 영상마다 목소리를 바꾸지 않고 하나로 고정, 카테고리별로는 Style 만 바꿉니다.
| 순위 | 목소리 | 공식 설명 | 맞는 이유 |
|---|---|---|---|
| 1 | Laomedeia | Upbeat | 밝지만 가볍지 않아 차트 · 상식 둘 다 무난 |
| 2 | Puck | Upbeat | 더 경쾌하고 젊은 느낌, 차트형에 강함 (funtube 후배 · 나레이터와 겹침) |
| 3 | Sadachbia | Lively | 활기 최대, 훅이 강하지만 피로할 수 있음 |
| 대안 | Achird · Charon | Friendly · Informative | 상식형을 차분하게 갈 때 (Charon 은 funtube 선배와 겹침) |
오디션: 훅 문장 하나를 후보 3개로 만들어 휴대폰 스피커로 듣고 정한 뒤 config/settings.yaml 의 tts.voice 에 고정.
카테고리별 Style 프리셋 (단일 화자)
| 카테고리 | Style 칸 | 훅 · 마무리 |
|---|---|---|
| chart 차트 | upbeat data storyteller, medium-fast, emphasize numbers | "OO 1위, 그래프로 보면…" → 다음 주 예측 질문 |
| trivia 상식 | curious friendly explainer, medium pace, a-ha moments | "OO 할 때, 왜 그럴까요?" → 한 문장 정리 |
| explain 신작 정보 | bright and informative, quick, no spoilers tone | "OO, 몇 부작인지 아세요?" → 공개 일정 |
장면별 예시 Style: 훅 energetic and curious, quick punchy delivery, a smile in the voice · 반전 playful discovery, lean in on the twist · 마무리 light teasing question, rising intonation at the end, friendly.
대본 쓰는 규칙 (자막과 발음 문장을 나눈다)
| 자막 | TTS 에 넣는 문장 |
|---|---|
1위, 12주째 | 일 위, 십이 주째 — 숫자는 한글로 풀어 쓴다 |
TOP 10, 시즌2 | 탑 텐, 시즌 투 |
9/28~10/4, 출처 · 기준일 | 말하지 않음 — 화면 글자로만 |
- 한 문장 15음절 안팎(최대 25), 초당 6.5~7.5음절, 장면 길이의 85% 안. 해요체 + 가끔 "~죠".
- 장면 단위로 한 번씩 생성. 너무 길면 문장을 줄이고, 재생 속도는 1.1배까지만.
- "역대급 · 충격" 같은 과장 금지. 사실 카드에 없는 말 금지.
funtube3. 웃긴 영상툰
설정 원본은 funtube/content/episodes.json(대사마다 voices · style)과 funtube/content/faces.json(표정 그림)입니다.
3-1. 목소리 — 한 줄씩 단일 화자
funtube 는 대사 한 줄마다 따로 생성합니다(node scripts/tts.mjs). AI Studio 에서 손으로 할 때는 단일 화자(Single-speaker) 모드로 두고, 아래 표의 목소리를 고른 뒤 Style 칸에 그 줄의 style 을 넣습니다.
| 목소리 | 맡는 인물 (편) | 자주 쓰는 Style |
|---|---|---|
| Charon | 선배 (carpool · invest · office), 아빠 (chat), 나레이션 (fight) | scolding loudly, annoyed older boss / smug, acting innocent / bossy, casual / documentary narrator, calm and slightly amused |
| Puck | 후배 (carpool · invest · office), 나 (chat), 나레이터 (facts), 민수 (fight) | flat deadpan, very tired / flat deadpan, exhausted whisper / energetic, fun fact narrator / low, trying to sound cool |
| Kore | 엄마 (chat · skit) | flat, uninterested / cold and suspicious / very calm but menacing / firm mom |
| Leda | 아이 (skit) | cute little child begging / cute little child, sly and innocent |
| Zephyr | 시스템 (chat), 나레이터 (balance), 구경꾼 (fight), 내비 (carpool) | deadpan announcer / playful game show host / whispering, excited kid / robotic car navigation voice, polite and flat |
| Fenrir | 철구 (fight), 신입 (office) | gruff, tough-guy middle schooler / bright, energetic young new employee, totally carefree |
| Orus | 선생님 (fight) | stern angry middle-aged teacher |
스크립트가 API 에 보내는 문장 모양 — AI Studio 에서도 같은 효과를 내려면 Style 칸에 톤을, 대사 칸에는 대사만:
Speak in Korean. Tone: {style}. Say only this line:
{대사 — 화면 글자와 다르게 읽혀야 하면 say 값}
- 화면 글자와 읽는 말이 다르면
say에 적는다. 예: 화면ㅋㅋㅋㅋ→ 읽기푸하하하하하, 화면?→ 읽기...뭐?. - 선배 = Charon, 후배 = Puck 은 3D 콩트 시리즈의 고정 짝이다. 새 직장 콩트도 같은 조합으로.
- 모델 기본값은
gemini-2.5-flash-preview-tts(환경변수GEMINI_TTS_MODEL로 바꿀 수 있음). 키가 없으면 음성 없이 글자 수로 길이만 추정한다. - 노래 「길이 막혔어」(ride)는 음성 없음 — 비트만
npm run beat로 코드 합성하고 가사는 화면 글자로.
3-2. 그림 — 얼굴 표정 6칸 시트
몸 · 무대는 코드(3D), 얼굴만 AI 가 그립니다. 인물마다 표정 6개를 한 장(3×2, 3:2 가로)에 받아 node scripts/facegen.mjs 가 초록을 지우고 public/faces/<이름>_1..6.png 로 자릅니다. 프롬프트만 보려면 --list(무료).
화풍 (faces.json 의 style):
Korean webtoon gag-comic style, 'grotesque-cute': deadpan, slightly unsettling and funny and adorable all at once. Thin, slightly wobbly hand-inked black outlines, completely flat colors with no shading or gradients, slightly asymmetrical naive hand-drawn features, huge round glossy eyes with tiny pupils, minimal nose, a small very expressive mouth, and exaggerated expressions that tip back and forth between cute and creepy. Imperfect scribbly charm, like a gag webtoon.
할 일 — 얼굴 윤곽 · 머리카락 없이 이목구비만 (3D 머리에 붙이기 때문):
Draw a reference sheet of 6 FACE DECALS of the SAME character, to be projected onto a smooth blank 3D head. Draw ONLY the facial features: eyes, eyebrows, nose, mouth, cheek blush, and small comic marks (sweat drops, anger veins, sparkles) right next to the face. DO NOT draw any head outline, face shape, skin color fill, hair, ears, neck, or body: the features float alone on the background.
| 번호 | 표정 | 지시 |
|---|---|---|
| 1 | 무표정 | NEUTRAL: deadpan, half-lidded eyes, tiny straight closed mouth. |
| 2 | 말함 | TALKING: mouth open mid-sentence as a wide rounded shape with a hint of teeth, eyebrows slightly raised. |
| 3 | 화남 | ANGRY: brows slammed down hard, gritted teeth, one throbbing anger-vein mark beside the eye. |
| 4 | 충격 | SHOCK: eyes gigantic with tiny pinpoint pupils, mouth gaping open, one big sweat drop, brows very high. |
| 5 | 귀여움 | CUTE: sweet closed-eye or sparkling-eye smile, rosy blush circles on both cheeks, adorable. |
| 6 | 섬뜩 | UNCANNY: an unnervingly wide fixed grin stretching almost from cheek to cheek, huge round unblinking eyes with pupils far too small, slightly asymmetrical, eerie but hilarious. |
대본의 "face": {"선배": 3} 이 이 번호입니다 (3 = 화남).
| 인물 | 설정 문장 |
|---|---|
| 선배 | CHARACTER: a smug, middle-aged Korean office senior. Round thin-rimmed glasses drawn as part of the face (draw the glasses in every expression), heavy sleepy eyelids, bags under the eyes, a thin self-satisfied mouth, thick bushy eyebrows. |
| 후배 | CHARACTER: a young, tired but earnest Korean junior office worker. Big round eyes, thick short eyebrows, faint dark circles under the eyes, a small mouth, no glasses. |
배치 지시 — 칸이 겹치면 자르기가 실패하니 그대로 씁니다:
Layout: a grid of exactly 3 columns by 2 rows on a SOLID PURE GREEN (#00FF00) background, landscape 3:2 image. Each expression sits alone in its own cell, centered, with very wide empty green margins around it and between cells (at least 15% of the cell width) so nothing ever touches or overlaps another cell. All six faces must use exactly the same scale, the same eye-line height and the same eye spacing so they line up on the same head. Faces look straight at the viewer. Use only black ink lines, white eyeballs with black pupils, pink blush, and warm accent colors; NEVER use green anywhere in the drawing. No text, no numbers, no labels, no arrows, no frames, no borders.
- Gemini 앱에서 손으로 뽑을 때: 위 다섯 덩어리(화풍 → 할 일 → 인물 → "The 6 expressions, in reading order:" + 표정 6줄 → 배치)를 이 순서로 붙여 한 번에 보낸다. 받은 그림은
funtube/art/faces/raw_<이름>.png로 저장하고node scripts/facegen.mjs <이름> --process-only. - 새 인물은
faces.json의characters에 한 줄 추가. 화풍 · 표정 · 배치 문장은 건드리지 않는다. - 2D 영상툰(fight) · 단톡(chat) · 상식(facts) · 밸런스(balance)는 그림 없이 코드와 이모지로 그린다.