아이들은 그림책을 볼 때, 한 장의 그림을 한참 동안 바라보곤 합니다. 나뭇잎이 움직이고 있는 걸까? 아기 여우 손에 든 병에는 무엇이 들어 있을까? 그 반딧불이는 나중에 집을 찾았을까?
그림 속 귀가 살짝 흔들리고, 달빛이 천천히 병 안으로 들어가며, 다정한 내레이션 한마디가 더해진다면 이야기를 들려주는 방식이 하나 더 생깁니다.
이런 애니메이션 화보는 잠자리 이야기로도, 교실 속 짧은 이야기 발표로도 활용할 수 있고, 어린이 애니메이션의 스토리보드를 시험 제작하는 데에도 적합합니다. 반드시 복잡한 동작이 있을 필요는 없습니다. 화면이 편안하고, 캐릭터가 앞뒤로 일관되며, 아이가 따라가며 이해할 수 있다면, 그것만으로도 이미 좋은 시작입니다.
이번에는 Ace Data Cloud Studio와 GPT Image 2.6을 사용해 작은 이야기 하나를 만들어 보겠습니다——《아기 여우가 달빛을 빌리다》. 먼저 이야기를 그리고, 그다음 화면을 움직이게 한 뒤, 마지막으로 소리를 더해 재생할 수 있는 영상으로 만들어 보겠습니다.

¶ 이야기는 길 필요 없어요, 먼저 명확하게 들려주세요
달빛이 있는 어느 밤, 아기 여우는 길을 잃은 작은 반딧불이 한 마리를 만났습니다. 숲이 너무 어두워 작은 반딧불이는 집으로 돌아가는 길을 찾지 못했습니다. 아기 여우는 유리병을 들어 달에게 빛을 조금 빌리고, 작은 반딧불이와 함께 숲을 지나 친구들이 있는 곳으로 돌아갔습니다. 떠나기 전, 아기 여우는 손을 흔들며 달을 올려다보고 감사 인사하는 것도 잊지 않았습니다.
이 이야기는 짧지만 만남도 있고, 도움도 있으며, 작별도 있습니다. 네 컷 화보로 만들기에 딱 알맞게 이야기를 완성할 수 있습니다.
Ace Data Cloud Studio를 열고, 대화창에 만들고 싶은 내용을 적습니다. 이야기 자체뿐 아니라 화풍, 캐릭터, 소품도 명확하게 설명합니다.

이렇게 설명할 수 있습니다:
GPT Image 2.6을 사용해 《아기 여우가 달빛을 빌리다》의 네 컷 이야기 화보를 제작해 주세요. 읽는 순서는 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래이며, 각각 만남, 빛을 빌림, 동행, 귀가를 표현합니다. 부드러운 손그림 수채화 스타일을 사용하고, 종이 질감을 남겨 주세요. 아기 여우의 외형, 목도리 색상, 유리병은 네 장의 그림에서 일관되게 유지해 주세요. 숲은 부드러운 짙은 파란색과 회녹색을 주로 사용하고, 달빛과 병 속의 빛은 따뜻한 금색으로 표현하되 눈부시지 않게 해 주세요. 화면에는 글자, 대화 상자, 워터마크가 나타나지 않게 해 주세요.
여기에는 아주 실용적인 작은 습관이 있습니다: 먼저 캐릭터와 화풍을 정한 다음, 각 컷에서 어떤 일이 일어나는지 배치하는 것입니다. 그렇지 않으면 한 장씩 볼 때는 모두 좋아 보여도, 함께 놓으면 서로 다른 네 개의 이야기처럼 보입니다.
¶ 먼저 네 컷을 만들고, 이야기가 자연스러운지 한번 살펴보세요
이번에는 시연이므로, 먼저 간단한 네 칸 구성을 사용합니다. 화면이 많지 않아 확인하기가 비교적 쉽습니다: 아기 여우가 같은 모습인지, 목도리 색이 바뀌지는 않았는지, 유리병 크기가 들쭉날쭉하지는 않은지, 네 컷을 이어 보면 이해할 수 있는지 말입니다.

더 긴 이야기를 만들고 싶다면 “동행”을 나눌 수 있습니다. 예를 들어 먼저 개울을 지나고, 다음에는 나무뿌리를 지나며, 마지막으로 나무 구멍 안의 점점이 빛나는 불빛을 발견하게 할 수 있습니다. 그림마다 하나의 동작만 이야기하면, 이후 애니메이션과 더빙을 만들 때도 배치하기가 더 좋습니다.
아래는 이 글을 위해 새로 제작한 네 컷 화보입니다. 종이의 흰 여백을 조금 남겨 숲의 색과 달빛이 비치도록 하고, 모든 구석을 꼭 가득 채울 필요는 없습니다.

아래 그림은 원래 시연에서 사용한 네 컷 화보입니다. 이 글 뒤의 GIF와 합성 스크립트는 이 시연 소재 묶음을 그대로 사용하므로, 바로 재현하기에 편리합니다. 위의 새 삽화는 이야기를 보여 주기 위한 것이므로, 두 소재 묶음을 같은 애니메이션 원화 세트로 섞어 사용하지 마세요.

¶ 화면을 조금만 움직여도 충분해요
원화를 준비한 뒤, Studio가 네 개 장면의 동적 Prompt를 작성하도록 계속 진행합니다.
화보의 동작은 너무 많을 필요가 없습니다. 귀가 살짝 움직이고, 풀잎이 가볍게 흔들리며, 병 속의 빛이 천천히 오르내리는 이런 작은 변화만으로도 화면에 생동감을 줄 수 있습니다. 오히려 크게 뛰어다니거나 카메라 전환을 자주 하면, 원래의 고요한 느낌을 흐트러뜨리기 쉽습니다.
아래 버전의 프롬프트는 “귀가” 장면을 보완했으며, 각 원화와 해당 애니메이션의 관계도 명확하게 적었습니다:
네 장면 GIF의 동적 Prompt
공통 제약: 해당 원화의 인물, 목도리, 유리병과 수채화 종이 질감을 이어서 사용한다; 고정 카메라로, 작은 동작만 하며, 새 캐릭터를 추가하지 않고, 글자가 나타나지 않게 하며, 처음과 끝이 최대한 이어지게 한다. 각 장면은 지정된 한 칸의 원화만 사용하고, 단일 화면으로 확장하며, 전체 네 칸짜리 그림을 한꺼번에 애니메이션으로 만들지 않는다.
만남
왼쪽 위 칸을 선택하여 단일 화면으로 확장한다. 여우가 가볍게 고개를 숙이고, 귀가 살짝 움직인다; 잎 위의 반딧불이는 천천히 밝아졌다 어두워지고, 주변 풀잎은 가볍게 흔들린다. 여우의 몸 비율과 배경 구도를 안정적으로 유지한다.
빛을 빌리다
오른쪽 위 칸을 선택하여 단일 화면으로 확장한다. 여우는 병을 들어 올린 자세를 유지하고, 가늘고 부드러운 달빛이 천천히 유리병 안으로 흘러 들어가며, 병 안의 금빛은 부드럽게 일렁인다. 유리병의 형태는 변하지 않게 유지하고, 빛은 부드럽게 하며, 강한 깜빡임이 나타나지 않게 한다.
함께 가다
왼쪽 아래 칸을 선택하여 단일 화면으로 확장한다. 여우가 작은 걸음으로 걷고, 목도리와 꼬리가 가볍게 흔들리며, 들고 있는 병이 살짝 흔들린다; 반딧불이는 병 곁에 떠 있고, 배경은 안정적으로 유지한다. 동작의 폭은 작게 하고, 최대한 자연스러운 루프를 만든다.
집으로
오른쪽 아래 칸을 선택하여 단일 화면으로 확장한다. 여우가 천천히 손을 흔들고, 나무 구멍 곁에 이미 있는 반딧불이들이 작은 범위에서 빙빙 돌며, 바닥의 달빛은 부드럽게 일렁이고, 풀잎은 살짝 흔들린다. 나무 구멍, 유리병과 여우의 위치를 기본적으로 안정적으로 유지하고, 끝은 자연스럽게 시작에 가까운 자세로 돌아오게 한다.
이어서 Studio에서 명확히 요청한다: GPT Image 2.6의 GIF 애니메이션 기능을 사용하여 이 네 개의 장면을 각각 생성하고, 각자의 GIF 파일을 반환한다.
여기서 만드는 것은 짧은 루프 애니메이션이지, 완성된 긴 동영상을 직접 생성하는 것이 아니다. 작업이 끝난 뒤, 움직이는 네 장의 이미지를 얻고 나서 그것들을 내레이션과 함께 이어 붙여 영상으로 만든다.
아래는 원래 데모에서 생성한 네 개의 GIF이다.
만남

빛을 빌리다

함께 가다

집으로

어느 한 장면에서 목도리, 병 또는 캐릭터 외형이 바뀌었다면, 먼저 그 장면을 수정하고 전체 소재를 처음부터 다시 만들 필요는 없다. 화면이 확인된 뒤에 다시 아래 단계로 진행해 더빙을 한다.
¶ 더빙은 잠자리 이야기를 들려주듯이, 너무 빽빽하게 읽을 필요 없다
화면이 움직이기 시작한 뒤, 계속해서 Studio에 더빙 요구 사항을 입력한다. 네 구간의 내레이션을 따로 생성하면, 이후 각각의 화면과 대응시키기가 더 쉽다.

이렇게 말할 수 있다:
《아기 여우가 달빛을 빌리다》를 위한 서로 독립된 네 구간의 중국어 내레이션을 생성하고, 각각 오디오 링크를 반환해 주세요. 아이에게 잠자리 이야기를 들려주듯 부드럽고 자연스러운 여성 목소리를 사용하고, 아나운서 말투도 과도하게 귀엽게 꾸미는 말투도 사용하지 마세요. 네 구간은 같은 음색을 유지하고, 말하는 속도는 여유롭게 하며, 문장 끝에는 약간의 쉼을 남겨 주세요. 먼저 순수 내레이션만 생성하고, 배경 음악은 추가하지 마세요. 만남: 달빛 아래, 아기 여우는 길을 잃은 작은 반딧불이를 만났어요. 빛을 빌리다: 아기 여우는 달에게서 부드러운 빛 한 줄기를 빌려 왔어요. 함께 가다: 그는 달빛을 들고, 작은 반딧불이와 함께 숲을 지나갔어요. 집으로: 반딧불이는 친구들 곁으로 돌아갔고, 아기 여우도 달에게 고맙다고 인사했어요.
네 문장이면 이야기를 다 말할 수 있으니, 굳이 긴 설명을 더할 필요는 없다. 화면도 조금은 말하게 두면, 들을 때 더 편안하다.
더빙이 생성된 뒤에는, 가장 좋은 것은 구간별로 한 번씩 들어 보는 것이다. 글자를 잘못 읽은 부분은 없는지, 쉼이 자연스러운지, 각 구간이 남겨 둔 시간 안에 다 말할 수 있는지는 모두 여기서 확인한다. 아래의 데모 스크립트는 기존의 네 개 오디오 링크를 사용한다; 더빙을 다시 생성했다면, 자신의 링크로 교체하는 것을 기억한다.
¶ 마지막으로, 로컬에서 화보를 영상으로 합성한다
소재가 모두 준비되면, Studio가 FFmpeg 합성 스크립트를 정리하도록 한 뒤, 로컬 컴퓨터에서 실행한다.
이 스크립트는 가로형 양면 화보를 만든다: 왼쪽에는 장 제목과 이야기 글이 있고, 오른쪽에는 GIF가 재생된다. 네 페이지를 이야기 순서에 따라 이어 붙이고, 각각의 내레이션을 더한다.
실행하기 전에 FFmpeg를 설치하고, FONT를 컴퓨터에 실제로 존재하는 중국어 글꼴 경로로 바꿔야 한다. FFmpeg는 또한 스크립트에서 사용하는 drawtext 필터, H.264 인코딩과 AAC 인코딩을 지원해야 한다. 스크립트는 Linux, macOS 또는 Windows의 WSL 환경에서 Bash로 실행하기에 적합하므로, PowerShell에 직접 붙여넣지 않는다.
아래에는 데모 소재 링크를 유지했으며, 출력 파일명과 책 페이지 제목을 모두 《아기 여우가 달빛을 빌리다》로 통일했다. 이것은 로컬 실행을 위한 스크립트이며, 이 글은 독자를 대신해 로컬에서 실행하지 않았다.
bash <<'BASH'
set -euo pipefail
# ===== 여기만 수정하면 됩니다 =====
GIF1="https://cdn.acedata2.cloud/gpt-image/d8d0bdffeb50f57fa700e3b0e973541e62361c1bce243f795c66b12c27a79ada.gif"
GIF2="https://cdn.acedata2.cloud/gpt-image/2361e32502087a5d14a1030ec26c94bade43ad7abddff7f51294ae70cffabd03.gif"
GIF3="https://cdn.acedata2.cloud/gpt-image/c9091c98a64df06baecc7be2e5bb4b7521deff9caa3a0f67bca46c5409b92133.gif"
GIF4="https://cdn.acedata2.cloud/gpt-image/e6f322e1dea87af933a00e6053166cd5ce2f9a7ab59358c37f7b79d3b0126885.gif"
# 중국어 글꼴 경로이며, 실제 상황에 맞게 수정하세요:
# Linux 예시:/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc
# macOS 예시:/System/Library/Fonts/PingFang.ttc
FONT="/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc"
OUTPUT="작은여우가달빛을빌리다.mp4"
# ===== 이미 준비된 네 구간의 내레이션 =====
AUDIO1="https://platform2.cdn.acedata.cloud/fish/bb9140fc-c0c5-4397-995c-5a4eba813ef6.mp3"
AUDIO2="https://platform2.cdn.acedata.cloud/fish/ffe157ea-7fc4-422c-b153-e3bdb7db59ad.mp3"
AUDIO3="https://platform2.cdn.acedata.cloud/fish/2eb05b03-e833-48b9-9373-38b4c6a6456c.mp3"
AUDIO4="https://platform2.cdn.acedata.cloud/fish/429392ee-4012-4775-b1d9-fec7b88ddf1f.mp3"
command -v ffmpeg >/dev/null || {
echo "먼저 FFmpeg를 설치하세요"
exit 1
}
[[ -f "$FONT" ]] || {
echo "중국어 글꼴을 찾을 수 없습니다. FONT를 수정하세요:$FONT"
exit 1
}
gifs=("$GIF1" "$GIF2" "$GIF3" "$GIF4")
audios=("$AUDIO1" "$AUDIO2" "$AUDIO3" "$AUDIO4")
titles=("만남" "빛을 빌리다" "동행" "집으로")
lines1=(
"달빛 아래, 작은 여우는 만났습니다"
"작은 여우는 달에게서 빌려왔습니다"
"그는 달빛을 들고, 작은 반딧불이를"
"반딧불이는 친구들 곁으로 돌아갔습니다"
)
lines2=(
"길을 잃은 작은 반딧불이 한 마리를."
"부드러운 빛 한 줄기를."
"함께 숲을 지나갔습니다."
"작은 여우도 달에게 감사했습니다."
)
# 각 장의 고정 길이; 내레이션이 끝난 뒤 남은 부분은 조용하게 유지됩니다.
# 총 길이:19초. 장 길이를 초과하는 내레이션은 잘립니다.
durations=("5" "4.5" "4.5" "5")
inputs=()
filters=""
for i in 0 1 2 3; do
vi=$((i * 2))
ai=$((vi + 1))
page=$((i + 1))
d="${durations[$i]}"
# GIF 내부 반복 표시를 비활성화하고, stream_loop로 무한 반복을 통일합니다.
inputs+=(
-stream_loop -1 -ignore_loop 1 -i "${gifs[$i]}"
-i "${audios[$i]}"
)
# 책 배경: 따뜻한 색의 책상, 양쪽 페이지, 책등과 왼쪽 텍스트.
filters+="
color=c=0xD6C7B3:s=1920x1080:r=30:d=${d},
drawbox=x=72:y=64:w=1788:h=972:color=0xB6A38C:t=fill,
drawbox=x=60:y=50:w=900:h=970:color=0xFFF9EE:t=fill,
drawbox=x=960:y=50:w=900:h=970:color=0xFFF9EE:t=fill,
drawbox=x=940:y=50:w=20:h=970:color=0xE2D6C3:t=fill,
drawbox=x=960:y=50:w=12:h=970:color=0xEFE5D5:t=fill,
drawbox=x=150:y=320:w=110:h=4:color=0xB28A60:t=fill,
drawtext=fontfile='${FONT}':text='작은 여우가 달빛을 빌리다':x=150:y=155:fontsize=28:fontcolor=0x927A60,
drawtext=fontfile='${FONT}':text='${titles[$i]}':x=150:y=235:fontsize=64:fontcolor=0x493A2C,
drawtext=fontfile='${FONT}':text='${lines1[$i]}':x=150:y=400:fontsize=36:fontcolor=0x685846,
drawtext=fontfile='${FONT}':text='${lines2[$i]}':x=150:y=465:fontsize=36:fontcolor=0x685846,
drawtext=fontfile='${FONT}':text='${page} / 4':x=150:y=910:fontsize=24:fontcolor=0xA28D76
[book${i}];
[${vi}:v]
setpts=PTS-STARTPTS,
fps=30,
scale=780:800:force_original_aspect_ratio=decrease:force_divisible_by=2,
setsar=1,
format=rgba
[gif${i}];
[book${i}][gif${i}]
overlay=x='1020+(780-overlay_w)/2':y='130+(800-overlay_h)/2':shortest=1,
trim=duration=${d},
setpts=PTS-STARTPTS,
format=yuv420p
[v${i}];
[${ai}:a]
asetpts=PTS-STARTPTS,
aresample=48000,
aformat=sample_fmts=fltp:channel_layouts=stereo,
apad,
atrim=duration=${d},
asetpts=PTS-STARTPTS
[a${i}];
"
done
filters+="
[v0][a0][v1][a1][v2][a2][v3][a3]
concat=n=4:v=1:a=1[vout][aout]
"
# 한 번에 실행: 모든 책 페이지, 애니메이션과 내레이션을 합성합니다.
ffmpeg -hide_banner -y \
"${inputs[@]}" \
-filter_complex "$filters" \
-map "[vout]" \
-map "[aout]" \
-c:v libx264 \
-preset medium \
-crf 18 \
-pix_fmt yuv420p \
-c:a aac \
-b:a 192k \
-ar 48000 \
-movflags +faststart \
"$OUTPUT"
printf '\n생성 완료:%s\n' "$OUTPUT"
BASH
이 스크립트는 네 페이지의 길이를 5초, 4.5초, 4.5초, 5초로 설정하여 총 19초입니다. GIF는 이 페이지가 끝날 때까지 반복되고, 내레이션이 짧을 경우 뒤의 남은 부분은 조용하게 유지됩니다.
특히 주의하세요: 내레이션이 이 페이지보다 길면, 스크립트는 초과한 부분을 잘라냅니다. 내레이션을 다시 생성할 때는 먼저 끝까지 들어 본 뒤 durations를 늘릴지 결정하세요. 19초를 맞추려고 이야기가 채 끝나기도 전에 페이지를 넘기지 마세요.
실행 시 소재를 읽기 위해 인터넷 연결이 필요합니다. 링크에 접근할 수 없는 경우, 먼저 GIF와 MP3를 로컬에 다운로드한 다음 해당 변수를 파일 경로로 바꿀 수 있습니다. 스크립트의 -y는 같은 이름의 출력 파일을 덮어쓰므로, 이미 완성된 영상이 있다면 먼저 다른 파일 이름으로 바꾸세요.
데모에서 제공된 기록에 따르면, 이 샘플의 소재 생성 크레딧은 약 1점 정도입니다. 이 수치는 이번 데모 참고용일 뿐이며, 고정된 요금제가 아니고 모든 19초 동영상이 1점만 필요하다는 의미도 아닙니다. 모델 버전, 화면 크기, 품질, 더빙 길이 및 재시도 횟수 모두 실제 소모량에 영향을 미치며, Studio에 표시되는 차감 내역을 기준으로 합니다. 마지막 단계는 로컬에서 FFmpeg를 사용해 합성하는 것으로, 클라우드 동영상 생성 서비스를 다시 호출하는 것이 아닙니다.
¶ 전체 과정을 한 장의 그림에 담기
돌이켜 보면, 일은 그리 복잡하지 않습니다. 먼저 이야기를 구상하고, 네 컷을 그린 뒤, 각 컷을 조금씩 움직이게 하고, 내레이션을 더한 다음, 마지막으로 로컬에서 합성합니다.
Studio는 이야기, 원화, GIF 및 더빙 소재를 준비하는 일을 맡고, FFmpeg는 소재를 책 페이지처럼 배열하고 소리를 이어 MP4로 출력하는 일을 맡습니다. 이 두 부분을 나누면, 마음에 들지 않는 페이지가 있을 때 그 페이지만 수정하면 됩니다.

¶ 달빛 조금이면, 이야기 하나를 끝낼 수 있습니다
《아기 여우의 달빛 빌리기》에는 많은 등장인물도, 떠들썩한 큰 장면도 없습니다. 그저 아기 여우 한 마리가 길을 잃은 반딧불이 한 마리와 잠시 길을 함께 걸었을 뿐입니다.
이런 이야기 화보를 만들 때 시간을 들일 만한 곳은 대개 이런 작은 디테일입니다. 네 장의 그림 속 여우가 같은 모습인지, 병 속의 빛이 충분히 부드러운지, 내레이션을 사람들이 편안하게 끝까지 들을 수 있는지 말입니다.
여러분도 해보고 싶다면, 먼저 네 컷짜리 작은 이야기부터 시작해 보세요. Ace Data Cloud Studio에서 화풍과 캐릭터를 명확히 설명하고, 원화를 잘 확인한 뒤, 천천히 동작과 소리를 더하세요. 처음부터 아주 긴 분량을 펼쳐 놓는 것보다, 짧은 이야기를 먼저 잘 만드는 편이 자신이 좋아하는 느낌을 찾기 더 쉽습니다.
화면과 소리가 모두 알맞아지면, 몇 페이지 더 넘겨 보세요. 움직이는 작은 화보 한 권이, 그렇게 천천히 만들어집니다.

