AI 工具 18 min read

寫實 AI 萌寵影片怎麼做?codex CLI 生 3 張角色一致的圖,ffmpeg 合成 18 秒下班 Shorts

看到 IG 上 15K 讚的「小斗下班啦」,我做了一支原創版:打領帶的橘貓阿橘下班等超商便當十點打折,用 codex CLI 生 3 張寫實關鍵格、edge-tts 配 4 句音、ffmpeg 合成 18 秒 1080×1920 Shorts。帶 -i 參考圖的那張,臉、毛色和店內場景都跟第 1 鏡接得上,只用文字描述的只鎖得住領帶和識別證——但畫面是靜圖推軌,貓還不會動。

寫實 AI 萌寵影片怎麼做?codex CLI 生 3 張角色一致的圖,ffmpeg 合成 18 秒下班 Shorts
本文目錄 · 10
懶人包
  • IG 帳號「小斗下班啦」2026-11-01 發的 AI 萌寵短片:寫實小狗抱著超商便當問店員「這個一會兒也打折嗎」,拿到 15K 讚、88 則留言。
  • 我照同樣的題材做了一支原創版:打領帶的橘貓「阿橘」下班等超商十點打折,三鏡、四句配音、18 秒、1080×1920。
  • 畫面用 codex CLI 0.163.0 的內建生圖一次出一張,每張約 2–3 分鐘;第 2、3 張用 -i 帶第 1 張當參考圖,三鏡的毛色、領帶、識別證都對得上。
  • 配音用 edge-tts 7.3.1,合成用 ffmpeg 8.0 一支濾鏡腳本完成推軌、字幕和混音,重跑一次 4.5 秒出片。
  • 限制很清楚:這是靜圖加推軌,貓不會動。要做到原片那種會走會轉頭的畫面,下一步是把關鍵格丟進圖生影片模型。

尊上在 LINE 丟來一支 IG Reel,問「這個好可愛,可以做這種影片嗎」。答案是可以,這篇是我實際做出來的流程:從拆題材、生三張角色一致的寫實關鍵格、配音,到 ffmpeg 合成 Shorts,每一步都附可以直接貼的指令。

「小斗下班啦」這支在演什麼?

原片是 IG 帳號 rai.lai.ton.35831(顯示名「小斗下班啦」)在 2026-11-01 發的 Reel,文案是「小斗的新饭搭子 #AI萌宠 #打工人的日常」。我在 2026-11-05 讀到的數字是 15K likes、88 comments。

沒登入的 yt-dlp 被 IG 擋下來,所以我只看得到預覽圖:一隻蓬毛小狗斜背小包,用後腳站著、雙手抱便當,在超商櫃台前抬頭問店員「这个一会儿也打折吗?」。字幕是簡體字,帳號是不是原作者我查不到能確認的資料。

它好笑的地方在題材:下班、省錢、等即期品打折、找人一起吃晚餐,都是上班族自己的生活,換成毛孩來演就有反差。這類內容的量體也有數字可查:

資料數字來源
抖音 #AI萌宠 話題累計 26.4 億次播放、超過 12.4 萬創作者人人都是產品經理,2026-10-10
小紅書 AI 貓博主 @川岛小猪爆款最高 8.7 萬讚,接到肯德基、海底撈、全家便利店等 8 筆商單同上,引用新榜
寫實化趨勢2026 年國產 AI 影片工具寫實度大幅進步,寫實 AI 萌寵影片成為新趨勢36Kr,2026-07-10
前兩次做萌寵打工劇,我用的是程式手繪畫面(見 AI 萌寵短劇分鏡產生器)。這支原片是寫實風,所以這次的重點是:本機能不能生出寫實、而且三鏡長得一樣的萌寵畫面。

做一支寫實 AI 萌寵短片要準備什麼?

我這次用到的工具和版本:

工具版本負責
Codex CLI(codex exec)0.163.0生寫實關鍵格,內建 image generation
edge-tts7.3.1中文配音(微軟 Edge 線上 TTS)
FFmpeg8.0(gyan.dev full build)推軌鏡頭、燒字幕、混音、輸出 1080×1920
微軟正黑體粗體 msjhbd.ttcWindows 內建字幕字型
Codex CLI 要先跑 codex login,可以用 ChatGPT 帳號或 --with-api-key 讀 API key;我這台是 ChatGPT 帳號登入。edge-tts 是 pip install edge-tts,會連微軟的線上服務,離線不能用。

第一步:怎麼把故事壓成三鏡?

原片的節拍我拆成四段:想省錢、等、店員心軟、找到飯搭子。18 秒裝不下四個場景,所以把「等」和「店員心軟」放進同一鏡:

鏡時間畫面對白
10–8 秒阿橘抱著便當抬頭問店員阿橘:這個……等一下也會打折嗎?/店員:十點就打七折喔,你要等嗎?
28–12.5 秒坐凳子盯著時鐘,店員的手在貼黃色打折貼紙店員:好啦,先幫你貼。
312.5–18 秒雨夜窗邊,跟白色薩摩耶並肩吃便當阿橘:今天的飯搭子,是你。
角色換成原創的橘貓「阿橘」,不沿用原片的小狗「小斗」。場景改成台灣超商的「十點即期品打七折」,店員制服在提示詞裡明寫不要 logo、不要品牌名。

第二步:用 codex CLI 生圖,三鏡怎麼長同一隻貓?

codex exec 是 Codex 的非互動模式,提示詞從 stdin 讀。第 1 鏡只給文字:

codex exec --sandbox workspace-write --skip-git-repo-check -C . - < src/p1.txt

p1.txt 的角色描述是這段(節錄):

Use your built-in image generation tool to create ONE photorealistic vertical 9:16 image. Do not write any code.
Character: a tiny fluffy orange tabby kitten (original character named A-Ju), standing upright on two hind legs
like a tired office worker after work, wearing a tiny loose navy necktie and a small office ID badge on a lanyard,
holding a plastic bento box with both front paws, looking up hopefully.
Photorealistic, like a phone video frame, shallow depth of field, no text, no watermark, no brand logos.

第 2、3 鏡多加 -i,把第 1 鏡當角色參考圖附上,提示詞第一句寫明要保留哪些特徵:

codex exec --sandbox workspace-write --skip-git-repo-check -C . -i img/k1.png - < src/p2.txt
The attached image is the character reference: keep the SAME orange tabby kitten
(same face, fur pattern, navy necktie, blank white ID badge on blue lanyard) and the same convenience store look.

兩個操作細節:

  • 圖不會出現在 -C 指定的資料夾。它落在 ~/.codex/generated_images/<session id>/exec-*.png,session id 印在 log 開頭,要自己搬出來。
  • 開頭那句「Do not write any code」是給 agent 的:codex exec 本質是 coding agent,不講清楚它可能會去寫一支畫圖程式。
三張圖都是 941×1672。第 1 張從 22:58:30 開始跑到 23:01:29 出圖,約 3 分鐘;第 2、3 張各約 2 分鐘。 codex CLI 生成的三張寫實關鍵格:橘貓阿橘打著藏青色領帶、掛白色識別證,依序在超商抱便當、坐凳子等打折、雨夜窗邊和白色薩摩耶一起吃便當

三鏡的毛色、藏青領帶、藍色掛繩和空白識別證都一致,場景的冷藏櫃、店員綠色 polo 衫也接得上。

不帶參考圖會差多少?

為了確認 -i 到底貢獻了什麼,我把第 2 鏡重生一次:拿掉 -i,改成把第 1 鏡的角色描述(橘色虎斑、藏青領帶、藍掛繩、空白識別證)整段寫進提示詞,其他場景描述不變。

左到右:第 1 鏡、帶參考圖的第 2 鏡、只用文字描述的第 2 鏡。三隻都是打藏青領帶掛白色識別證的橘貓,但只用文字那隻毛色偏淡、臉型不同,背景換成另一間店的配置

結果比我預期的接近:

項目帶 -i 參考圖只用文字描述
領帶、掛繩、識別證一致一致
毛色深淺、臉型跟第 1 鏡同一隻毛色偏淡、臉比較圓,看得出是另一隻貓
場景同一間店:窗外街燈、收銀台、天花板監視器位置都接得上換了一間店,冷藏櫃和窗戶的配置不同
便當同一款雞腿便當換了菜色,改成直立抱著
服裝這種可以用名詞講清楚的特徵,文字就鎖得住。臉、毛色深淺和整個場景的佈置很難用文字描述到同一個程度,這部分要靠參考圖。剪成短片時,觀眾最先注意到的是臉和背景會不會跳,所以我會固定帶 -i。

第三步:配音和字幕怎麼做?

對白寫成一個 TSV,一行一句:

a1	zh-TW-HsiaoYuNeural	+25Hz	+0%	這個……等一下也會打折嗎?
c1	zh-TW-HsiaoChenNeural	+0Hz	+5%	十點就打七折喔,你要等嗎?
c2	zh-TW-HsiaoChenNeural	+0Hz	+5%	好啦,先幫你貼。
a2	zh-TW-HsiaoYuNeural	+25Hz	+0%	今天的飯搭子,是你。

阿橘用 HsiaoYu 再把音高拉高 25Hz,聽起來比較小隻;店員用 HsiaoChen 加快 5%。用 bash 迴圈逐行產生:

mkdir -p tts
while IFS=$'\t' read id voice pitch rate text; do
  edge-tts -v "$voice" --pitch="$pitch" --rate="$rate" -t "$text" --write-media "tts/$id.mp3"
done < src/lines.tsv

四句長度是 4.03、3.41、2.52、3.14 秒,接下來 ffmpeg 的時間軸就照這四個數字排。字幕直接用同一份稿子,每句存成一個 txt 給 drawtext 讀,所以不用再跑語音辨識對時間。

第四步:ffmpeg 怎麼把三張圖變成 18 秒 Shorts?

整支片是一個 filter_complex 腳本。指令本身很短:

cp /c/Windows/Fonts/msjhbd.ttc src/font.ttc
ffmpeg -y -i img/k1.png -i img/k2.png -i img/k3.png \
  -i tts/a1.mp3 -i tts/c1.mp3 -i tts/c2.mp3 -i tts/a2.mp3 -i music/ambient.mp3 \
  -filter_complex_script src/fc.txt -map "[v]" -map "[a]" \
  -c:v libx264 -crf 20 -preset medium -c:a aac -b:a 160k -t 18 out.mp4

字型先複製到專案裡,是因為 Windows 路徑的 C: 冒號在 filter 語法裡要跳脫,放相對路徑最省事。

fc.txt 分成三塊。畫面用 zoompan 做慢推,d 是這一鏡的格數(24fps 下 192 格 = 8 秒):

[0:v]scale=1080:1920,zoompan=z='1+0.0006*on':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=192:s=1080x1920:fps=24,setsar=1[v1];
[1:v]scale=1080:1920,zoompan=z='1.12-0.0008*on':x='iw/2-(iw/zoom/2)':y='ih*0.25-(ih/zoom/4)':d=108:s=1080x1920:fps=24,setsar=1[v2];
[2:v]scale=1080:1920,zoompan=z='1+0.0005*on':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=132:s=1080x1920:fps=24,setsar=1[v3];
[v1][v2][v3]concat=n=3:v=1:a=0,format=yuv420p,

第 2 鏡反過來從 1.12 倍往外拉、焦點放在上方 1/4,觀眾會先看到時鐘。字幕是一串 drawtext,用 enable='between(t,開始,結束)' 控制出現時間:

drawtext=fontfile=src/font.ttc:textfile=sub/s1.txt:fontsize=56:fontcolor=white:borderw=5:bordercolor=black:x=(w-tw)/2:y=1560:enable='between(t,0.4,4.5)',

聲音是四句對白各自 adelay 到出場時間,配樂壓到 0.18 倍音量、最後 2 秒淡出,再整體 loudnorm:

[3:a]adelay=400|400[a1];[4:a]adelay=4600|4600[a2];[5:a]adelay=8400|8400[a3];[6:a]adelay=13400|13400[a4];
[7:a]volume=0.18,afade=t=out:st=16:d=2[m];
[a1][a2][a3][a4][m]amix=inputs=5:normalize=0:duration=longest,atrim=0:18,loudnorm=I=-16[a]

amix 一定要加 normalize=0。預設會把每一路除以輸入數,五路混下去對白會變得很小聲。

圖片輸入不要加 -loop 1。我第一次渲染加了,zoompan 會把每一個輸入格都展開成 d 格,結果三鏡全部變成第 1 張。這種錯成片長度照樣對、ffprobe 也看不出來,我是抽格拼成格狀圖才發現的。

做出來長什麼樣?

阿橘下班啦成片在第 1、5.4、9.6、15 秒的四格:依序是問打折、店員回答十點打七折、21:55 再等五分鐘與店員貼打折貼紙、窗邊和薩摩耶飯搭子吃便當,字幕都燒在畫面下方

ffprobe 驗出來的規格:

stream|codec_name=h264|width=1080|height=1920|nb_frames=432
stream|codec_name=aac|nb_frames=1689
format|duration=18.000000

432 格 ÷ 24fps = 18 秒,三鏡依序出現,字幕時間也對得上。整合響度量出來是 −17.7 LUFS。

這個做法的限制和踩坑在哪?

  • 貓不會動。 三張靜圖加推軌,比較像有聲繪本。原片的小狗會站、會轉頭,那要靠圖生影片模型(例如 Kling、Veo),本機目前沒有這一段。
  • 道具連戲要寫進提示詞。 第 1 張我要求「冷藏櫃的便當貼著黃色打折貼紙」,模型連阿橘手上那盒也貼了。結果第 2 鏡店員才在貼貼紙,阿橘手上的便當早就有一張。要避免,就在第 1 鏡明寫「the bento box it holds has no sticker」。
  • 一張一張生、要自己搬檔。 每張 2–3 分鐘,圖落在 generated_images 而不是工作目錄,三鏡還好,十幾鏡就該寫腳本批次跑。
  • 題材可以借,角色和台詞不要照搬。 原片的小狗、名字和字幕都是別人的,我只保留「打工人等打折」這個題材,角色、場景、台詞全部重寫。

下一步可以怎麼做?

這支 18 秒是驗證「寫實萌寵角色能不能在本機穩定生出來」,答案是能,而且 -i 參考圖就夠用。接下來兩件事:

  1. 把三張關鍵格丟進圖生影片模型,讓阿橘真的抱著便當走動。這一步才是寫實版和原片的差距。
  2. 把節拍表換成「下班日常」系列:想省錢、等、小確幸、飯搭子,換角色、換場景(雨夜、末班車、自助洗衣店),用同一套指令批次產生。
想看結構面的拆法,可以接著讀 AI 萌寵短劇怎麼做?拆解 14 萬讚〈小粉耳送外賣〉;用程式碼做動畫片頭的另一條路線在 HyperFrames 實測。

延伸資源

author
陳
陳彥彤

AI 工程師 · AI 顧問。Java 後端 8 年、AI 工程師 2 年。AI 內訓 · AI 導入顧問 · 前後端與雲端培訓。

support

覺得文章有用可以到 GitHub 給個 star,或是透過信箱聊聊 AI 內訓、AI 導入顧問或前後端 / 雲端培訓。

related

相關文章

[AI 工具] · 12min
AI 萌寵短劇怎麼做?拆解 14 萬讚〈小粉耳送外賣〉:73 秒剪 37 鏡,做成 12 鏡分鏡產生器
pinkear.dada 這支羊毛氈兔子送外賣的 AI 短片一週拿到 14.2 萬讚,我用 ffmpeg 切出 37 鏡、中位數 1.83 秒一鏡,主角兔子全片沒有一句台詞。我把七段節拍做成可換角色與職業的 12 鏡分鏡產生器,輸出提示詞、SRT 和 animatic——真的 AI 畫面這次還沒生成,角色一致性要等實際丟進生成工具才驗得到。
[AI 工具] · 11min
AI 手繪動畫怎麼做?拆解 3,583 萬觀看《Englishman in New York》:同一個主角、同一把傘、13 鏡
antrofrog_ 在 2026-10-30 發到 X 的 47 秒 AI 手繪動畫《Englishman in New York》,不到四天累積 3,583 萬觀看,全片就是同一個黑衣主角用一把傘做 13 件小善舉。我用 ffmpeg 拆片,13 鏡裡有 7 鏡約 4 秒、切點不對齊音樂——剪輯跟著生成長度走,固定造型只換場景是它穩住角色的方法,我也把這套結構做成免費的分鏡規劃器。
[AI 工具] · 14min
AI 角色設定表提示詞實測:服裝靠文字就鎖得住,臉要附設定表才不跑
角色設定表是把四視圖、八種表情、六種姿勢、服裝特寫和色票放在同一張的參考圖,傑森所長在 IG 推薦先做一張再生圖。我自己寫提示詞用 Codex 實測 A/B——服裝靠詳細文字就全對,臉只有附設定表那張沒換人,提示詞已做成免登入產生器。