一張靜態照片怎麼變成 6 秒循環影片:實作細節與踩過的坑
這篇講的是實作,不是原理科普。從一張照片進來到一段影片出去,中間每一步在做什麼,以及哪些「看起來合理」的做法實測是錯的。
2026-08-20 作者 William Hsu
整條流程
- 接收與檢查:確認格式、尺寸,跑一次內容安全檢查。人像動作還會偵測畫面裡有沒有臉。 照片裡是一隻鳥卻選了人像動作,模型會憑空生一個人出來。
- 編碼:把照片與動作指令一起編碼。這是最花時間的一步,將近 20 秒。
- 取樣:只有 4 步,靠的是 turbo LoRA。
- 解碼:把結果還原成畫面,得到 73 個影格。
- 後製:24 fps 的 73 影格是 3.04 秒,再做一次正放加倒放,成品 6.08 秒無縫循環。
為什麼是 73 影格?這個模型的影格數必須是 17n+5,73 是在 3 秒附近唯一合用的數字。 論文裡沒寫,實作時撞到才知道。
乒乓循環
一段 3 秒的生成影片,頭尾通常對不起來,直接循環會看到明顯的跳接。 把影片正放一次再倒放一次接起來,頭尾自然相同,接縫就看不出來。
代價是動作會有來回的感覺,所以動作設計上要避開有明確方向性的動作。 「揮手」可以,手本來就會回來;「轉頭看過來」就得設計成轉過來之後停住, 否則倒放時會變成把頭轉回去。
三個實測才知道是錯的做法
一、叫模型「不要移動鏡頭」,畫面反而推得更兇
直覺會想在指令裡加上「camera does not move」。實測結果相反,加了之後畫面位移量從 6.6 惡化到 39.2。大概是這類描述反而讓模型把注意力放到「鏡頭」這個概念上。 最後的做法是完全不提鏡頭,改成描述人物本身的動作。
二、讓模型畫相框,畫出來的框是歪的
本來想讓成品直接帶復古相框。模型畫得出來,但每一次的框都不一樣,而且不對稱。 改成用網頁 CSS 疊上去,框永遠正確,使用者可以隨時換樣式或不要框,下載的檔案也乾淨。
三、低解析度照片不一定會壞
我原本以為太小的照片會做不出東西,還寫進了說明頁。後來實際拿 96 像素的照片測, 它照樣動得起來,只是細節糊。這條後來被我自己推翻,說明頁也改掉了。
失敗的處理比較花工
讓模型跑起來只花了一小部分時間,其餘都在處理真實世界的意外:
- 使用者的手機把分頁凍結,前端以為斷線就放棄,其實後端一路跑完了。 現在工作狀態同時寫在瀏覽器與伺服器兩邊,回來會自動接上
- 使用者按了取消,但生成還在顯示卡上跑。取消要真的送到生成端把工作中斷, 否則卡繼續空轉,後面排隊的人一起等
- 成品也要過一次內容安全檢查。上傳擋得住的東西,生成出來一樣要擋
這幾項都不是模型的問題,但每一項都會讓使用者覺得這個網站壞了。