HOW IT WORKS扩散式嘴部重绘
sync.so 的 lipsync-2 属于音频条件扩散模型:逐帧检测人脸 → 抠出嘴部区域 → 以音频特征为条件重新生成该区域 → 贴回原帧。因为只动嘴部,身份、肤质、光影全部原生保留——这是「看不出 AI」的基础。
fal-ai/sync-lipsync/v2 · model: lipsync-2拿一条已经跑出成绩的爆款,换成自家主播的脸和声音重新出片——观众看不出是 AI 做的,单条成本 $1.8、全程约 40 分钟。
// 面向团队同事的技术讲解 · 三大核心:音色克隆 / 唇形同步 / 表情保真
九段流水线:只有两段真正花钱(克隆 TTS 与唇形同步),其余全部本地零成本。LLM 只负责判断类工作(改稿、分镜),机械步骤全部脚本化。
_ROUTER_DATA 提取无水印直链下载(yt-dlp 会被风控拦,不用)
storyboard.json 驱动 ffmpeg 单 pass:真人段 + Pillow 真实条款插页 + 逐句字幕 + 分段标题
// 设计取向:确定性步骤交给代码,模糊判断才交给模型——下载、切片、擦除、合成全是脚本;只有改稿和分镜由 LLM 做。
第一版用微软 edge-tts 免费合成,用户一票否决——「声音不像真人,很生硬」。根因是通用 TTS 音色与真人主播完全对不上。解法:先把主播自己的声纹克隆下来,再用她的音色合成任何新台词。
fal-ai/minimax/voice-clone
喂 ≥10 秒主播真声(我们用两条底片合并的 62s),模型抽取声纹特征生成专属 voice_id。开 noise_reduction + 音量归一化,带 BGM 的素材也能克隆。
fal-ai/minimax/speech-02-hd
MiniMax 是中文语音赛道的第一梯队,韵律、停顿、儿化都自然。参数:speed 1.05 贴抖音口播节奏、language_boost: Chinese、32kHz 采样。
mlx-whisper · 双用途
TTS 产物回喂 whisper 再转写一遍:①逐字比对确认没吞字错读(本条 235 字零错);②拿到的逐句时间戳是后续字幕轴和分镜窗口的唯一事实源,长段内再按字数比例细分。
备选里 F5-TTS(开源)中文偏平、CosyVoice 需要 DashScope 账号、IndexTTS-2(B站开源)是自建首选——量大后可搬到 RunPod 把 TTS 成本归零。当前量级下 MiniMax 的自然度溢价完全值得。⚠️ voice_id 闲置 7 天会被回收,克隆前先查共享登记表 fal-voice-registry.md,别重复花 $1.5。
第一版「照片 + 配音」嘴完全不动,用户反馈「说话时声音跟嘴型对不上」。解法是唇形同步(lip-sync):模型听着新音频,只重绘画面中嘴部区域的每一帧——牙齿、舌位、唇形跟随音素变化,脸的其余部分和背景一个像素都不动。
sync.so 的 lipsync-2 属于音频条件扩散模型:逐帧检测人脸 → 抠出嘴部区域 → 以音频特征为条件重新生成该区域 → 贴回原帧。因为只动嘴部,身份、肤质、光影全部原生保留——这是「看不出 AI」的基础。
fal-ai/sync-lipsync/v2 · model: lipsync-2唇形按视频秒数计费($3/分钟)。插页(条款特写)时段观众根本看不到嘴——所以先按分镜把真人出镜窗口切出来,只驱动这些秒数。本条:出镜 35.5s vs 整条 52.3s,唇形费 $2.62 → $1.77,省 32%。
sync_mode: cut_off · 输出时长 = 音频切片时长| 方案 | 结论 | 价格 / 约束 |
|---|---|---|
| sync lipsync-2 ✅ | 嘴部细节最佳、无时长切块限制、720p 竖屏原生——采用 | $3/min |
| · lipsync-2-pro | 特写镜头嘴部细节升级档,标准档不够再上 | $5/min |
| Kling 官方对口型 | 质量好但 2–10s/次硬限制,60s 要切 6 块拼接,接缝风险 | ~$0.014/5s |
| LatentSync 1.6 | 字节开源(Apache-2.0),512px 嘴部精度、中文调优,自建质量上限 | RunPod 自跑 · 18GB VRAM |
| MuseTalk | 实时级速度,但嘴部内部分辨率低 → 720p 上牙齿发糊 | $0.04/次 · 草稿档 |
| Wav2Lip 系 | 老一代 GAN,嘴糊 + 原版权重不可商用——弃 | — |
每段 VO 切片必须 ≤ 对应底片段长(cut_off 模式下超长会被拦腰截断);合成时对每段做 tpad + trim 帧级对齐,防止毫秒级漂移逐段累积拖歪整条时间轴。
这是整套方案最反直觉的一点:我们不用任何模型去「生成」表情。表情、眼神、挑眉、点头、手势——全部来自主播真实拍摄的底片,唇形模型只接管嘴部一小块区域。真实的东西不需要以假乱真。
v1 用 FLUX 生成「相似的人」当画面——静态图没有微表情,Ken Burns 推拉也救不了,AI 感一眼穿。生成路线在「像真人」这件事上天花板太低。
照片驱动的数字人(如 Wan s2v)实测「照片开口」感强烈:眨眼频率机械、头部僵直、情绪与语义脱节——外部评测同样结论。表情是数字人的阿喀琉斯之踵。
底片里她的每一次微笑、每个手势都是真实表演。唇形模型只重绘嘴部 ~5% 的像素,其余 95% 原封不动——表情保真度天然 100%。
分镜时按台词情绪挑底片区间:钩子段选手势强调的部分、CTA 选笑容收尾的部分;两条底片(展厅黄裙 / 工厂黑西装)做双场景切换,讲「材料」时正好站在工厂里——场景为内容背书。
需要「照着新台词重新表演」时的下一代方案:OmniHuman-1.5(音频驱动全身表演 + 语义情绪,火山引擎)与 Seedance 1.5 Pro(原生毫秒级对口型)。工法要点:3–5s 短镜多切、prompt 加乱发丝等「不完美」词防塑料感、禁露齿笑。
本方案是 4 轮真人审片逼出来的:v1 声音生硬+嘴不动被否 → v2 换克隆+唇形但字幕带太重 → v3 裁切去字幕但构图变形被否 → v4/v5 逐帧擦除+原构图通过。审片人的眼睛是最终的损失函数。
底片自带烧录字幕(旧广告词),和新口播完全对不上——是最大穿帮点。四代方案迭代后的结论:遮不如擦。
黑色字幕带盖住 → 被否「黑色区域过大」;重度模糊+压暗 → 大号高对比字幕的残影仍可读;裁切放大把字幕裁出画面 → 人物变低变近、构图被否。通用视频 inpainting 模型(ProPainter 等)对「全程被盖的静态区域」无源可借,只会生成一团糊——调研后放弃。
不遮整条区域,只擦字本身:条带内检测白色字芯(RGB>185 且近灰白)∪ 贴边黑描边(暗像素 ∩ 字芯 13px 邻域),膨胀 5px 成掩膜,cv2.inpaint(TELEA) 用周围像素插值填充。字幕落在纯色衣物上时基本无痕。
ffmpeg rawvideo 管道解码 → NumPy 逐帧处理 → 管道回编码,1569 帧约 1 分钟跑完,零 GPU 零 API 费。新字幕恰好压在擦除区上方,进一步掩盖手部经过时的轻微涂抹感。
concat 分支内 overlay 无限循环图片流必须 shortest=1,否则其它分支整段消失而总时长正常——极难察觉;JPEG 是全范围色域,进视频链路必须 in_range=pc:out_range=tv;静态 PNG overlay 必须 -loop 1 否则跨拼接边界后 enable 窗口失效。
| 环节 | 说明 | 成本 |
|---|---|---|
| 音色克隆 | 每位主播一次性,voice_id 登记复用 | $1.50(摊销后 ≈ 0) |
| TTS 合成 | 235 字 × $0.10/千字 | $0.03 |
| 唇形同步 | 先剪后驱动:只驱动出镜 35.5s × $0.05/s | $1.77 |
| 取片 / 转写 / 擦字幕 / 合成 | 全部本地脚本 | $0 |
| 单条合计 | 同主播稳态成本 | ≈ $1.80 / 条 |
95% 的钱花在唇形按秒计费上:30s 短版 ≈ $1.2,60s ≈ $2.4。压成本的杠杆是多用插页、少驱动出镜秒数,而不是压质量档位。
LatentSync 1.6 + IndexTTS-2 部署到自有 RunPod(4090/A6000 Pod),单条 GPU 成本 $0.3–0.7、无限重跑挑最好一版;搭建验证约一天,产量 >15 条/月才回本——试投阶段不值得。
整条产线已沉淀为 Workflow 仓库的共享 skill .claude/skills/douyin-replica(PR #28 已合并),文档经过「新人代理干跑测试」修订,照着走不会踩坑。
fal-voice-registry.md 登记表