AI 영상 생성(Seedance 등)에서 캐릭터 목소리를 컷과 씬을 넘어 일관되게 유지하는 프롬프트 작성 규칙. 캐릭터 레퍼런스가 얼굴을 고정하듯, 이 문서의 프로필 공식이 목소리를 고정한다.
영상 생성 모델은 이전 컷에서 어떤 목소리를 냈는지 기억하지 못한다. 지난 씬에서 완벽한 목소리가 나왔어도, 이번 프롬프트에 그 목소리의 설명이 없으면 모델에게 그 목소리는 존재한 적이 없다.
그래서 목소리 일관성의 방법은 하나뿐이다. 목소리를 텍스트 에셋으로 만들어서 모든 씬 프롬프트에 통째로 싣는 것. 캐릭터 이미지 태그(@char_NAME_v1)를 매 씬 첨부하듯, 보이스 프로필 문단도 매 씬 첨부한다.
프로필에도 버전을 붙여 관리하면 좋다 — 예: @voice_KANG_v1. 목소리가 마음에 안 들어 문구를 수정하면 v2로 올리고, 이후 모든 씬은 v2 문구만 쓴다.
프로필은 2~3문장이면 충분하다. 대신 그 안에 아래 7가지가 전부 들어가야 한다. 하나라도 비면 모델이 그 자리를 멋대로 채운다.
7요소를 한 틀에 부으면 이런 문장이 된다:
A [①나이]-year-old [③국적] [②성별] with a [④음역대], [⑤질감] voice.
[⑥속도·리듬] [③언어·억양] in [⑦말투 캐릭터].
Definitely [양성 잠금]; never [네거티브 잠금].
실전에서 목소리가 무너지는 방향은 정해져 있다. 영어 대사는 미국 억양으로, 한국어 대사는 외국인 억양이나 TTS 내레이터 톤으로 흘러간다. 이 기본 드리프트를 막는 문장이 프로필의 마지막 줄, 네거티브 잠금이다.
영국 캐릭터의 "Definitely British, never American."이 교과서다. 한국인 캐릭터라면 이 네 가지가 실전 네거티브다:
never a foreign, dubbed or textbook-learner accent. AI 한국어의 최대 실패 유형.never an AI-narrator or text-to-speech tone. 대사가 낭독처럼 나오는 것을 차단.no regional dialect, 사투리 캐릭터는 never drifts into standard Seoul Korean. 사투리는 특히 컷마다 옅어지는 경향이 있어서 "매 대사에서 동일하게 유지"까지 못박는다.never a young voice. 생성 한국어는 실제보다 젊게 나오는 경향이 있다.프로필(고정층)에는 감정을 넣지 않는다. "화난 목소리"를 프로필에 박으면 모든 씬에서 화를 낸다. 감정과 상황은 씬 프롬프트 쪽에서 매번 새로 지시하는 변동층이다.
프로필과 분리해서, 이 씬에서 그 목소리가 어떤 상태인지 쓴다.
The line is low, urgent and practically minded. He is frightened and guarded, not hostile. His bravado has thinned, but he is trying to sound composed.
캐릭터가 걷거나, 뛰거나, 무거운 걸 들며 말하는 씬이라면 그 동작이 목소리에 어떻게 반영될지 명시한다. 안 쓰면 대사가 뭉개지거나 끊긴다.
Physical strain compresses his voice without causing stuttering. The words remain clear and continuous.
누구에게 하는 말인지가 바뀌면 모델은 톤(외침↔속삭임)을 멋대로 바꾼다. 대사마다 대상을 잠근다.
Every word is addressed directly to the hostage. He does not speak to the room, the other men, or the camera. He does not deliver the line as an aside.
화면에 있는 사람 수와 말하는 사람 수를 분리해서 명시한다. 그리고 말 못 하는(안 하는) 캐릭터가 내는 소리는 종류·원인까지 규격화한다 — 안 그러면 모델이 그 캐릭터에게 대사를 지어준다.
Two speakers only. Exact lines, no ad-libs, no extra voices.
The hostage produces muffled grunts and heavy gagged breathing,
but no intelligible dialogue. The breathing comes from terror,
pain and exhaustion.조용한 앰비언스("quiet room tone only")만 지시하면 대사까지 조용하게 구워진다 — 실측으로 피크 -16dB(사실상 안 들림)까지 떨어진 사례가 있다. 오디오 섹션에 대사 볼륨을 한 줄 못박는다.
Dialogue at clear, natural speech volume, well above the room tone.
비슷한 목소리 둘을 한 씬에 넣으면 모델이 섞어버린다. 캐릭터를 만들 때부터 음역대 × 속도 × 질감 × 억양, 네 축에서 서로 멀리 떨어뜨려 캐스팅한다. 깊은 바리톤 옆에는 콧소리 테너를, 빠른 서울말 옆에는 느린 사투리를 놓는 식이다.
아래 제6장의 예시 5인은 이 대비 설계가 적용된 앙상블이다:
| 캐릭터 | 음역대 | 속도 | 질감 | 억양 |
|---|---|---|---|---|
| 준호 (24) | 가벼운 테너 | 빠름 | 맑음·약한 콧소리 | 서울 표준 |
| 강 형사 (47) | 깊은 베이스-바리톤 | 느림 | 자갈 긁는 소리 | 부산 |
| 순 할머니 (70대) | 낮은 허스키 | 아주 느림 | 닳고 갈라짐 | 전라 |
| 윤 앵커 (34) | 중저음 알토 | 고른 페이스 | 또렷·절제 | 서울 방송체 |
| 하은 (17) | 밝은 고음 | 빠름 | 숨섞임 | 서울 구어 |
준호와 하은은 둘 다 "빠른 서울말"이라 가장 가까운 쌍이다 — 대신 음역대(테너↔고음)와 성별로 갈라놨다. 이렇게 최소 두 축 이상 벌어지게 만든다.
외모와 목소리는 별개 채널이라, 각각 따로 잠그면 일부러 어긋낼 수도 있다. 겉모습은 10살 소녀인데 목소리는 80살 노파인 캐릭터가 대표 사례. 모델은 아이 얼굴을 보면 아이 목소리를 주려는 시각 편향이 있어서, 프로필에 어긋남을 명시적으로 선언하고("her voice is the OPPOSITE of her appearance") 네거티브로 편향 방향을 막아야 한다("never a cute high-pitched child voice"). 실제 3컷 테스트에서 이 이중 잠금으로 아이 얼굴 위에 노파 목소리가 끝까지 유지됐다 — 아래 실증 장의 사례 2 영상으로 직접 확인할 수 있다.
프롬프트 본문이 영어라면 프로필도 영어로 쓴다. 아래는 그대로 VOICES 섹션에 붙여 쓸 수 있는 완성 프로필이다. 대사 자체는 한국어로 별도 표기하면 된다.
JUN-HO: A 24-year-old South Korean man with a light, clear tenor.
Rapid, casual Seoul-standard Korean in an online-streamer cadence —
quick bursts, playful, slightly nasal on emphasis.
Definitely a native South Korean speaker; never a foreign, dubbed
or AI-narrator accent; no regional dialect.DETECTIVE KANG: A 47-year-old South Korean man with a deep,
gravelly bass-baritone. Slow, blunt Busan (Gyeongsang) dialect
with hard, clipped sentence endings and a heavy rhythm.
The dialect stays identical in every line; never drifts into
standard Seoul Korean; never a foreign accent.GRANDMA SOON: A South Korean woman in her late 70s with a low,
husky, worn voice that cracks softly on long vowels. Slow, warm
Jeolla-dialect Korean with drawn-out, sing-song endings.
Definitely an elderly native Korean speaker; never a young voice;
never a newsreader tone.ANCHOR YOON: A 34-year-old South Korean woman with a poised,
mid-low alto. Precise standard Seoul Korean in a broadcast-anchor
cadence — even pacing, crisp consonants, controlled breath.
Definitely native Korean; never a casual vlogger tone; never a
foreign or dubbed accent.HA-EUN: A 17-year-old South Korean girl with a bright, high,
slightly breathy voice. Fast, casual Seoul Korean with rising
sentence-end intonation and quick, giggly bursts.
Definitely a native teenage Korean speaker; never an adult
voice-actor tone; never dubbed.NAME: A [나이]-year-old South Korean [man/woman] with a [음역대],
[질감] voice. [속도·리듬] [표준어/○○ 사투리] Korean in a
[말투 캐릭터] cadence.
Definitely a native South Korean speaker; never a foreign, dubbed
or AI-narrator accent; [사투리/표준어 잠금]; [나이 잠금(필요시)].민준: 차가운 목소리로 말한다.MIN-JUN: A 29-year-old South Korean man with a dry, mid-low baritone. Unhurried standard Seoul Korean, flat and measured. Definitely native Korean; never a foreign or narrator accent.In this scene his delivery is cold and clipped; he is suppressing anger, not raising his voice.
"차가움"이 고정층에서 빠져나와 변동층으로 갔다는 점이 핵심이다. 다음 씬에서 민준이 웃어야 한다면 프로필은 그대로 두고 딜리버리 문장만 바꾸면 된다.
프롬프트를 내보내기 전에 이 여섯 개만 훑는다.
"voice per locked profile"이라고만 쓰고 프로필 원문을 프롬프트에 안 실었다. 모델은 그 프로필을 본 적이 없다.
잠금 프로필 원문을 VOICES 섹션에 통째로 붙여넣는다. 참조만 하는 목소리는 존재하지 않는 목소리다.
"런던 억양" "서울말"까지만 쓰고 금지 방향을 안 적었다. 기본 드리프트(미국 억양·외국인 한국어·TTS톤)가 그대로 들어온다.
프로필 마지막 줄에 반드시 never 문장을 붙인다. 제3장의 한국어 네거티브 4종 참조.
프로필에 "화난" "슬픈" 같은 감정어를 박았다. 캐릭터가 모든 씬에서 같은 감정으로 말한다.
프로필에는 물리적 성질(나이·음역·질감·속도·억양)만. 감정은 씬 프롬프트의 딜리버리 문장으로.
한 씬의 두 화자가 음역대·속도·질감이 비슷하다. 모델이 두 목소리를 섞거나 바꿔치기한다.
네 축(음역·속도·질감·억양) 중 최소 두 축 이상 벌어지게 프로필을 수정한다.
화면에 있지만 말하면 안 되는 캐릭터(재갈·기절·군중)의 소리를 지정하지 않았다. 모델이 대사를 지어준다.
발화자 수를 명시하고("Two speakers only"), 침묵 캐릭터의 비언어 사운드를 종류·원인까지 규격화한다("muffled grunts, no intelligible dialogue").
같은 캐릭터의 프로필 문구가 씬마다 조금씩 다르다. 문구가 흔들리면 목소리도 흔들린다.
확정 프로필은 버전 태그를 붙여 원본 문서에 보관하고, 모든 씬에 토씨까지 동일하게 복붙한다. 수정하면 버전을 올린다.
이 바이블의 규칙이 실제로 작동하는지 Seedance 2.0으로 검증했다. 캐릭터마다 고정층(외모 묘사 + VOICE 프로필)을 3컷에 토씨까지 동일하게 복붙하고, 변동층(대사·감정·동작)만 컷마다 갈았다. 생성 후에는 STT(음성→텍스트) 전사로 대사 리터럴을 대조하고 볼륨 레벨을 계측했다. 모든 영상은 아래에서 바로 재생된다.
2D 애니 · 16세 츤데레 여고생 · 과장된 애니 더빙톤 고음. 같은 목소리가 새침→당황→수줍 세 감정을 오가는지 — 고정층/변동층 분리의 검증.
MIRU: A 16-year-old girl voiced in exaggerated anime-dubbing
style — very high, bright, slightly squeaky voice with big pitch
swings and drawn-out sentence endings. Fast, bouncy Korean with
theatrical voice-actress energy.
Definitely a stylized anime-dubbing tone; never a natural
live-action voice; never an AI-narrator or TTS tone; never a
foreign accent.
| 컷 | 대본 | STT 전사 결과 | 판정 |
|---|---|---|---|
| 1 | 흥, 딱히 널 기다린 건 아니거든?! | "딱시 널 덜 기다린 건" — 빠른 발화로 일부 뭉개짐 | 준일치 |
| 2 | 뭐?! 아, 아니야! 그런 거 아니라고! | "왜? 어? 아니야. 그런 거 아니라고!" | 준일치 |
| 3 | 그... 그래도, 와줘서 고마워. 진짜로. | 토씨까지 일치 | 일치 |
2D 애니 · 겉모습은 10살 은발 소녀, 목소리는 80살 노파. 외모 나이와 목소리 나이를 일부러 어긋낸 실험 — 모델은 아이 얼굴을 보면 아이 목소리를 주려는 편향이 있어서, 네거티브 잠금이 그 편향을 이기는지가 승부처였다.
ELDER RYU: An ancient dragon elder in the body of a 10-year-old
girl. Her voice is the OPPOSITE of her appearance — a low, raspy,
smoky old-woman's voice, slow and commanding, like an 80-year-old
master. Archaic, haughty Korean with drawn-out sage-like endings.
The voice never matches her childlike look: never a cute
high-pitched child voice; never a young woman's voice; never an
AI-narrator or TTS tone.
| 컷 | 대본 | STT 전사 결과 | 판정 |
|---|---|---|---|
| 1 | 네 이놈, 감히 내 잠을 깨우느냐. | 토씨까지 일치 | 일치 |
| 2 | 허허... 삼백 년 만에 손님이로구나. | 일치 + STT가 웃음을 [웃음]으로 별도 검출 | 일치 |
| 3 | 가까이 오너라. 물지 않느니라. | 토씨까지 일치 | 일치 |
실험에서 나온 규칙 보강 두 가지는 본문에 이미 반영돼 있다: 대사 볼륨 명시(제4장 변동층 5번 — 볼륨 미지정 시 피크 -16dB까지 떨어진 실측 사례), 외모-목소리 어긋내기(제5장 고급 기법).