讓照片開口說話,最難的部分從來不是嘴巴。

這句話跟直覺相反。畢竟整個「影片配音」技術的歷史,就是一部對嘴型的歷史:找到嘴唇區域,把嘴型換成新音訊對應的形狀,對得越準越好。準確率變成唯一的 KPI,大家拼命把嘴唇的誤差壓到一毫米以內。

然後你看到成品,還是一眼假。

問題出在哪?你回想一下自己上次跟人講話的樣子。你的眉毛在動,頭在點,肩膀偶爾聳一下,講到重點身體會往前傾。說話是全身的事,嘴巴只是其中聲音出來的那個洞。傳統配音技術把嘴型換得再準,其他部位僵在那裡不動,看起來就像一個人在嚼口香糖,而不是在說話。換句話說,觀眾的大腦抓到的破綻,從來不在嘴唇的誤差,在嘴唇以外那一整片「死掉的區域」。

InfiniteTalk 是阿里巴巴 MeiGen-AI 團隊開源的框架,它值得寫一篇的原因,就是它把這個題目整個翻面了。

不對嘴,反而更像在說話

InfiniteTalk 提出的範式叫 Sparse-Frame Video Dubbing。聽起來很學術,拆開來其實是一個很乾脆的取捨:不要逐幀去對齊嘴型,只給模型幾個關鍵幀當參考,剩下的動作讓它自由生成。

差別在哪?逐幀對齊是「控制」——你規定每一幀的嘴巴長什麼樣,模型照做。關鍵幀參考是「引導」——你給模型錨點,它自己長出頭部擺動、表情變化、身體微動,而且這些動作會跟語音的節奏與語氣連動。講到激動處頭會晃,語尾下沉時眼神會跟著鬆。

原始筆記裡有個類比我很喜歡:傳統方法像是幫照片換嘴,InfiniteTalk 像是給照片安裝靈魂。

放掉控制換來自然,這個交易方向值得記住。大部分生成式工具的演進都長這樣——不是把既有指標推得更準,是發現那個指標本身就在錯的位置上。

「無限長度」是怎麼接出來的

第二個賣點是名字裡的 Infinite:它不像多數影片生成模型只能吐幾秒就停,理論上可以一直生下去。機制說穿了是接力跑:

  1. 每次生成一個 clip,81 幀,大約 3.2 秒
  2. 每個 clip 的最後 9 幀(motion frames)拿去當下一個 clip 的起始條件
  3. 音訊用滑動窗口切割,對齊每一段 clip
  4. 全部生完用 FFmpeg 拼接、混入音訊

寫過 LLM 應用的人看到這個設計應該會心一笑——這跟 Transformer 的 KV Cache 是同一個思路,用前一段的輸出當下一段的輸入,就能一直接下去。棒子交得夠順,跑多遠都行。

底層是 Wan2.1-I2V-14B,一個 14B 參數的 Diffusion Transformer,配上 CLIP 抽圖片特徵、wav2vec2 抽音訊特徵、UMT5-XXL 編碼文字 prompt。每一層 DiT 的 forward 順序是 Self-Attention → 文字 Cross-Attention → 音訊 Cross-Attention → FFN。

其中音訊注入的設計最聰明:模型先在 self-attention 裡算出「當前幀的每個位置跟參考圖片有多像」,再用這個相似度決定音訊條件要灌多強。靠近參考圖的區域——通常就是那張臉——拿到最強的音訊驅動,背景幾乎不受影響。聲音只推得動該動的地方,這件事不是用遮罩硬切出來的,是讓模型自己看出來的。

你能拿它做什麼

具體場景比想像中多。影片翻譯配音是最直接的:V2V 模式把現有影片配上新語音,嘴型和表情自動跟上,教學影片要出多語言版本不用重拍。虛擬主播次之:I2V 模式從一張照片加一段語音直接生出說話影片,配內建的 Kokoro TTS,從文字稿到成片可以一條龍。再來是 podcast 視覺化——純音訊節目轉成有表情有動作的影片,多人模式還能用 bounding box 指定兩個人各自的位置,讓雙人對談各說各的。

跑起來的門檻倒是不低,這個等一下講。先看安裝有多直白:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下載三個必備模型
huggingface-cli download Wan-AI/Wan2.1-I2V-14B-480P --local-dir ./weights/Wan2.1-I2V-14B-480P
huggingface-cli download TencentGameMate/chinese-wav2vec2-base --local-dir ./weights/chinese-wav2vec2-base
huggingface-cli download MeiGen-AI/InfiniteTalk --local-dir ./weights/InfiniteTalk

# 單人模式:一張圖 + 一段音訊 → 說話影片
python generate_infinitetalk.py \
--ckpt_dir weights/Wan2.1-I2V-14B-480P \
--wav2vec_dir weights/chinese-wav2vec2-base \
--infinitetalk_dir weights/InfiniteTalk/single/infinitetalk.safetensors \
--input_json examples/single_example_image.json \
--size infinitetalk-480 \
--mode streaming \
--save_file result

也有 Gradio Web UI,不想碰命令列的人可以直接開瀏覽器操作。

它自己承認的弱點

開源專案的誠實度,看它的 README 願不願意寫缺點。這份寫得算坦白,值得照列:

  • 硬體需求很硬:14B DiT 加 11B 文字編碼器,標準推理要 40 到 80 GB VRAM。有 CPU offload 和 int8/fp8 量化可以降,但速度跟著掉,而且量化模式只支援單 GPU
  • 色偏:I2V 模式生超過一分鐘,色彩會慢慢漂移。有補償參數,但官方自己說並不完美
  • 身份漂移:生得越長,人的長相越會慢慢變掉——diffusion model 的老毛病,它也沒躲過
  • 音訊編碼器偏中文:用的是 chinese-wav2vec2-base,中文語音效果最好,其他語言不保證
  • 解析度只有 480P 和 720P,固定 25 FPS,想要 1080P 目前沒有

40 到 80 GB VRAM 是什麼概念?一張 RTX 5090 裝不下,你需要資料中心等級的卡,或者租雲端 GPU。所以它現在的定位很清楚:給有算力的團隊做產品的基礎建設,不是給個人玩家週末玩的玩具。要追進度的話,團隊的後繼專案 LongCat-Video-Avatar 已經發布,支援更多任務類型。

看這類模型,先看嘴巴以外的地方

回到開頭那句話。這個領域的競爭,已經從「嘴型對得準不準」移到「嘴巴以外的部分自然不自然」。前者是個收斂的題目,誤差只會越來越小;後者才是分出高下的地方,因為它考的不是對齊能力,是模型對「人怎麼說話」這件事的理解。

所以下次你要評估任何 talking head 模型,跳過官方 demo 裡的嘴部特寫,直接看三個地方:眉毛有沒有跟著語氣動、頭部擺動跟語音節奏有沒有連動、生成兩分鐘之後那張臉還是不是同一個人。嘴型大家都會對了,靈魂裝不裝得進去,看的是這些。

相關連結

本文改寫自個人 Notion 知識庫的研究筆記,原始素材來自 MeiGen-AI 官方 GitHub 與論文。