把 AI 数字人拆开看,其实是一条四段流水线:口播文案、配音(TTS)、形象驱动(唇形与表情对齐)、音视频合成与抽查。多数人的卡点不在模型本身,而在第二段和第三段的衔接:音频采样率、分句时间戳、视频帧率三者对不上,导出的 mp4 就会出现口型漂移。可以先用手边的素材跑一次 ffprobe,把规格确认下来,再决定用现成工具还是自己搭管线。
适用场景:单主播口播类产品广告、讲解视频,30-90 秒、文案 150-300 字、正面半身素材。操作动作:先固定音轨采样率与视频帧率,再让 TTS 和唇形驱动共用同一份音频文件,不要各生成一份。验证方式:用 ffprobe 看音轨采样率、视频帧率和总时长,再抽首帧、中段、末尾三处剪影核对口型。风险边界:肖像与声音授权必须先落实;侧脸、遮挡、快语速和方言素材的口型质量通常会明显下降,需提前试一小段。
AI数字人怎么做产品广告
这一步在整条链路里对应“输入准备”:把商品卖点改写成句级口播稿,并让每句话都带上时间戳。判断你卡的是不是它,看两个文件是否成对出现:脚本文件和与它一一对应的时间戳文件。可核对的位置是目录本身,不用翻日志。
wc -l script/ad_script.txt # 每行一句,建议 12-20 字
ls -l audio/ # 应有整段 wav 与逐句时间戳 json/srt
head -n 3 audio/words.json # 字段通常为 word / start / end
如果 words.json 里只有整段一条记录,说明 TTS 没有开字级或句级时间戳,后面的唇形驱动只能靠整段音频自己对齐,误差会积累到句尾。这一步要重做,不是调参数能救的。
AI数字人怎么做成视频
这一步对应链路最后一段“合成与封装”,产物是一个带音轨的 mp4。确认是不是卡在这里,只看 ffprobe 的流信息:有没有 video 和 audio 两条流、帧率是否等于配置值、时长与配音差多少。
ffprobe -v error -show_entries stream=index,codec_type,sample_rate,r_frame_rate,duration -of default=nw=1 out/ad_demo.mp4
常见现象是只有 video 流没有 audio 流,说明合流时把音频参数写错了;另一种是两条流都在但 duration 相差超过 0.3 秒,说明驱动阶段把音频裁过或补过静音,需要回到驱动那一步重跑,而不是在封装阶段用 -shortest 硬切。
AI数字人之前先确认这三件事
版本、权限、入口位置,缺一个都会卡在半路,而且报错信息通常看不出根因。

| 前提 | 在哪看 | 看什么 |
|---|---|---|
| 版本 | 命令行 | python --version、ffmpeg -version、pip show 你的tts或驱动包;重点确认 ffmpeg 是否带 libx264 与 aac 编码器 |
| 权限 | 环境变量与设备 | env | grep -i key 确认密钥已注入;nvidia-smi 看显存占用与驱动版本;ls -ld audio out 确认写入权限 |
| 入口位置 | 面板或配置文件 | 命令行工具看 --help 列出的子命令;配置文件看 project、script_file、out_dir 这几个字段是否存在且路径可解析 |
这三项里最容易漏的是 ffmpeg 的编码器,编译版常常缺 aac,导致合流报 unknown encoder,看起来像驱动出错。
AI数字人:最短可用路径
按顺序执行五步,每步都有可观察的结果,不要跳步。
- 建目录并放素材:
mkdir -p dh/{script,audio,face,out},把口播稿存为script/ad_script.txt,正面半身照存为face/host.png。做完应能看到四个子目录和两份文件。 - 配音:
python -m tts_cli --input script/ad_script.txt --voice female_cn_01 --sr 16000 --out audio/(命令名按你实际安装的 TTS 工具替换)。做完ls audio/应看到整段 wav 和时间戳文件。 - 驱动唇形:
python -m lipsync_cli --image face/host.png --audio audio/full.wav --fps 25 --out face/。做完应看到一段无声 mp4,帧率 25。 - 合流封装:
ffmpeg -y -i face/silent.mp4 -i audio/full.wav -c:v copy -c:a aac -ar 16000 -shortest out/ad_demo.mp4。做完ls -lh out/应有一个 mp4。 - 抽查:用上面的 ffprobe 命令核对两条流与时长,再抽 0 秒、中段、末尾三处画面看口型。
这里有个容易踩的坑:把长文案拆成多段分别配音、再拼接,每段的时间戳都会从 0 重新开始,驱动出来的口型从第二句起整体错位,而且越往后越明显。稳妥做法是整段一次性配音,只做一次对齐;字幕另走 srt 校对,不让字幕参与驱动。
AI数字人:一个真实场景的完整做法
场景定死:一条 60 秒竖版产品广告,单主播正面半身照 1 张,口播稿 180 字左右,输出 1080x1920。配置统一放项目根目录的 config.yaml,各工具从同一份配置读参数,避免三处各写一套。
project: ad_demo
script_file: script/ad_script.txt # 每行一句,约 180 字,对应 60 秒
tts:
voice: female_cn_01
sample_rate: 16000 # 与驱动阶段保持一致
out_dir: audio
avatar:
source_image: face/host.png # 正面、无遮挡,边长不小于 512
fps: 25
out_dir: face
render:
width: 1080
height: 1920
video_codec: libx264
audio_codec: aac
out_file: out/ad_demo.mp4
字段位置与核对方式:sample_rate 和驱动阶段传入的采样率必须相同,用 ffprobe 在 audio 目录的 wav 上确认;fps 与 ffprobe 读出的 r_frame_rate 必须一致;width/height 不对会在封装后出现黑边,抽首帧即可看出。跑完后 ffprobe 的 duration 落在 59 到 61 秒之间属正常,明显偏离说明配音或裁剪出了问题,回到第 2 步重跑,而不是在最后一步改参数硬凑。