孩子看繪本時,常常會盯著一幅畫看很久。樹葉是不是在動?小狐狸手裡的罐子裝著什麼?那隻螢火蟲後來找到家了嗎?

如果讓畫裡的耳朵輕輕抖一下,讓月光慢慢落進罐子,再配上一句溫柔的旁白,故事就多了一種講法。

這樣的動畫畫報,可以用來做睡前故事、課堂裡的短篇故事展示,也適合拿來試做兒童動畫的分鏡。它不一定要有複雜的動作。畫面舒服,角色前後對得上,孩子能跟著看懂,就已經是一個不錯的開始。

這次,我們用 Ace Data Cloud Studio 和 GPT Image 2.6,來做一個小故事——《小狐狸借月光》。先畫出故事,再讓畫面動起來,最後配上聲音,做成一段可以播放的影片。

《小狐狸借月光》故事插圖

故事不用長,先把它講清楚

一個有月光的晚上,小狐狸遇見了一隻迷路的小螢火蟲。森林太暗,小螢火蟲找不到回家的路。小狐狸抬起玻璃罐,向月亮借了一點光,陪牠穿過樹林,回到夥伴身邊。臨走前,小狐狸揮揮手,也沒忘記抬頭向月亮道謝。

這個故事短,但有相遇、有幫忙,也有告別。拿來做四格畫報,剛好能把事情講完整。

我們打開 Ace Data Cloud Studio,在對話裡寫下想做的內容。除了故事本身,也把畫風、角色和道具說清楚。

在 Ace Data Cloud Studio 中輸入故事創作需求

可以這樣描述:

請用 GPT Image 2.6 創作《小狐狸借月光》的四格故事畫報,閱讀順序為左上、右上、左下、右下,分別表現相遇、借光、同行、回家。採用溫柔的手繪水彩風格,保留紙張紋理。小狐狸的外形、圍巾顏色和玻璃罐在四幅畫裡保持一致。森林以柔和的深藍和灰綠色為主,月光與罐子裡的光用暖金色表現,不要刺眼。畫面不出現文字、對白框和浮水印。

這裡有個很實用的小習慣:先把角色和畫風定下來,再安排每一格發生什麼。否則,單張看著都不錯,放在一起卻像四個不同的故事。

先做四格,看一遍故事是否順暢

這次是示範,我們先用簡單的四宮格。畫面不多,比較容易檢查:小狐狸是不是同一個樣子,圍巾有沒有變色,玻璃罐有沒有忽大忽小,四格連起來能不能看懂。

在 Studio 中安排四格故事內容

如果要做更長的故事,可以把「同行」拆開。例如先走過小溪,再經過樹根,最後看見樹洞裡的點點亮光。每幅畫只講一個動作,後面做動畫和配音時也更好安排。

下面是為本文新製作的四格畫報。留出一點紙白,讓森林裡的顏色和月光透出來,不必把每個角落都畫滿。

《小狐狸借月光》四格故事畫報:相遇、借光、同行、回家

下面這張是原示範使用的四格畫報。本文後面的 GIF 和合成腳本沿用這組示範素材,方便直接重現;上面的新配圖用於展示故事,不要把兩組素材混著當成同一套動畫原畫。

原示範使用的四格畫報

讓畫面動一點,就夠了

原畫準備好後,我們繼續讓 Studio 為四個片段寫動態 Prompt。

畫報的動作不用太多。耳朵微動、草葉輕晃、罐子裡的光慢慢起伏,這些小變化就能讓畫面活起來。反而是大幅跑動、頻繁切換鏡頭,容易打亂原本安靜的感覺。

下面這版提示詞補全了「回家」片段,也把每幅原畫與對應動畫的關係寫清楚了:

四段 GIF 的動態提示詞

通用約束:沿用對應原畫的人物、圍巾、玻璃罐和水彩紙紋;固定鏡頭,只做小幅動作,不新增角色,不出現文字,首尾盡量銜接。每段只使用指定的一格原畫,並擴展為單幅畫面,不要把整張四宮格一起做成動畫。

相遇
選取左上格並擴展為單幅畫面。狐狸輕輕低頭,耳朵微動;葉片上的螢火蟲緩慢明滅,周圍草葉輕晃。保持狐狸身體比例與背景構圖穩定。

借光
選取右上格並擴展為單幅畫面。狐狸保持舉罐姿勢,細柔月光緩緩流入玻璃罐,罐內金光輕柔起伏。玻璃罐的形狀保持不變,光線柔和,不出現強烈閃爍。

同行
選取左下格並擴展為單幅畫面。狐狸小步行走,圍巾與尾巴輕擺,提罐略微晃動;螢火蟲在罐旁漂浮,背景保持穩定。動作幅度小,盡量形成自然循環。

回家
選取右下格並擴展為單幅畫面。狐狸緩緩揮手,樹洞旁已有的螢火蟲小範圍盤旋,地面的月光輕柔起伏,草葉微微搖動。保持樹洞、玻璃罐和狐狸的位置基本穩定,結尾自然回到接近開頭的姿態。

接下來,在 Studio 中明確提出:使用 GPT Image 2.6 的 GIF 動畫功能,分別生成這四個片段,並返回各自的 GIF 檔案。

這裡做的是短小的循環動畫,不是直接生成一段完整的長影片。等任務完成後,我們拿到四張會動的圖片,再把它們與旁白一起拼成影片。

下面是原演示生成的四段 GIF。

相遇

相遇:小狐狸發現迷路的小螢火蟲

借光

借光:小狐狸舉起玻璃罐接住月光

同行

同行:小狐狸提著月光陪螢火蟲穿過森林

回家

回家:螢火蟲回到夥伴身邊,小狐狸揮手告別

如果某一段的圍巾、罐子或角色外形變了,先改這一段,不用把整套素材推倒重來。等畫面確認好了,再往下做配音。

配音像講睡前故事,不用念得太滿

畫面動起來之後,我們繼續在 Studio 中輸入配音需求。把四段旁白分開生成,後面更容易和各自的畫面對應。

在 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。把這兩部分分開,哪一頁不滿意,就改哪一頁。

從故事構思、四格原畫、GIF 動畫、旁白配音到本機合成的製作流程

一點月光,就能講完一個故事

《小狐狸借月光》沒有很多角色,也沒有熱鬧的大場面。它只是讓一隻小狐狸,陪一隻迷路的螢火蟲走了一段路。

做這樣的故事畫報,值得花時間的地方,往往也是這些小細節:四幅畫裡的狐狸是不是同一個樣子,罐子裡的光是不是足夠柔和,旁白能不能讓人安心地聽下去。

如果你也想試試,可以先從一個四格小故事開始。在 Ace Data Cloud Studio 裡把畫風和角色說清楚,檢查好原畫,再慢慢加上動作和聲音。先把短故事做好,比一開始就鋪開很長的篇幅,更容易找到自己喜歡的感覺。

等畫面和聲音都合適了,再多翻幾頁。一本會動的小畫報,就這樣慢慢做出來了。