快速跑通文字转数字人实时推流的完整指南
【免费下载链接】metahuman-streamReal time interactive streaming digital human项目地址: https://gitcode.com/GitHub_Trending/me/metahuman-stream
如果你需要"输入一句话,屏幕上立刻出现一个对口型说话的虚拟人视频流",这套开源系统就是干这个的:文字经 TTS(Text to Speech,语音合成)变成声音,音频特征驱动口型模型生成画面,再通过实时流媒体推出去。全链路已接好,你只需要装环境、放模型文件、跑一条启动命令。
一句话到一路视频流:中间发生了什么
理解整条链路比记模块名更有用。数据是这样流动的:
1. 文本进门
服务启动后提供 HTTP 接口,你用 API 文档里的/human接口发一段文字,并告诉它是echo(照着念)还是chat(交给大模型生成回答)。每个连接会分配一个 sessionid,多个用户可以同时挂在一个服务上。
2. 声音合成(TTS)
文本被送进 TTS 引擎变成语音。默认用免费的 edge-tts,换个REF_FILE参数就能切换不同音色;填一段参考音频还能做声音克隆。这一环的意义在于:后面所有环节只认音频,不认文字,所以声音在这里一次成型。
3. 特征提取
语音被切成 80 毫秒一段,转成 mel 频谱特征。口型模型看不懂波形,但看得懂这种压缩后的"音频指纹",这一步就是翻译。
4. 口型生成
数字人模型(wav2lip / musetalk / ultralight 三选一)拿着特征逐帧生成嘴部画面,再贴回你准备的原始视频帧。你只需提前给一个数字人形象的素材包,系统按帧循环取用,所以形象可以不是实时采集的真人。
5. 推流出门
生成的音视频走三种通道之一:WebRTC(基于 UDP 的实时通信协议,延迟最低,浏览器直接播)、RTMP(传统直播推流协议,接 B 站、抖音这类平台)、虚拟摄像头(把画面伪装成一块摄像头,给 OBS、视频会议软件用)。
第一次跑通的完整步骤
以下按"看到画面"为目标排序,每步末尾有验证点。
第 1 步:装环境。克隆仓库并创建 Python 3.12 环境:
git clone https://gitcode.com/GitHub_Trending/me/metahuman-stream conda create -n livetalking python=3.12 && conda activate livetalking按 README 里的命令安装与你 CUDA 版本对应的 PyTorch,然后pip install -r requirements.txt。验证点:两条 pip 命令都跑完无报错。
第 2 步:放模型文件。从 README 给出的网盘地址下载 wav2lip 权重和配套形象包:权重改名为wav2lip.pth放进 models/ 目录,形象包解压后整个文件夹放进data/avatars/下。验证点:models/wav2lip.pth和data/avatars/wav2lip256_avatar1/都能列出内容。
第 3 步:启动服务。
python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1验证点:日志出现start http server; http://<serverip>:8010,且 GPU 利用率在预热推理时出现一波尖峰。注意服务端要开放 TCP 8010 和 UDP 端口。
第 4 步:打开浏览器。访问http://服务器IP:8010/index.html,点"开始连接",在文本框里输入一句话提交。验证点:页面出现数字人视频,人声开始播报且嘴型随台词动——到这里,整条链路就跑通了。
调哪些参数,画面和速度会怎么变
参数分两类:改"长什么样"的和改"跑多快"的。
影响输出效果的
--model(数字人模型):wav2lip 速度快、显存要求低,口型够用;musetalk 表情和细节更自然,但对显卡要求高;ultralight 更轻量,适合弱配置。换模型等于换"演员",形象包也要对应换。--avatar_id:决定用哪个形象,取值必须是data/avatars/下实际存在的文件夹名。--tts与--REF_FILE:--tts选引擎(edge-tts、azure、doubao 等),--REF_FILE选音色或传参考音频做克隆。调"换音色"只动这两个参数。--fps:视频帧率,固定 25 即可,调低画面会变卡,调高模型跟不上。
影响运行性能的
--batch_size:推理批大小。调大推理吞吐更高、多路说话时更稳,但显存占用同步上涨;显存吃紧就调小。--max_session:最大并发会话数。调大能接更多观众,但每路都在抢同一块 GPU;不说话时主要吃 CPU,说话时主要吃 GPU。--transport与--push_url:选 WebRTC 最省配置;选 RTMP 时把--push_url填成你的直播推流地址。--listenport:Web 服务端口,和浏览器访问地址要一致。
所有启动参数都可以写进 config.yaml,命令行参数会覆盖文件里的值,适合做长期固定配置。
按需扩展:语音输入、大模型对话、多端接入
这些能力默认不启用,用到哪个开哪个:
- 语音识别(ASR):仓库内置本地 ASR 服务(SenseVoice/FunASR),把观众说的语音转成文字再喂给数字人。适用场景:需要"数字人两问两答"的客服或直播互动。
- 大模型对话:
--llm_provider接 dashscope 等兼容网关后,/human接口切到chat模式,数字人回答内容由 LLM 生成而非照念原文。适用场景:数字人客服、自动带货话术。 - 打断与状态事件:
/interrupt_talk可随时掐断当前播报,/sse事件流把"开始说/说完了"推给前端。适用场景:真人插播、抢话式互动。 - 动作编排:
--customvideo_config让数字人不说话时播放你指定的视频,避免"呆站"。适用场景:直播间长时间冷场时段。
两个值得直接抄的落地场景
场景一:24 小时无人直播。组合 LLM 对话 + edge-tts + RTMP 推流 + 动作编排:观众弹幕转文字进来,数字人自动回复并持续开播,冷场时播放预设视频。预期效果是无人值守但看起来"有人在",GPU 一台 30 系显卡即可支撑 wav2lip 多路并发。
场景二:会议里的数字分身。用--transport virtualcam启动,数字人画面变成系统里的虚拟摄像头,Zoom、腾讯会议里直接"开摄像头"就是你的分身。预期效果是不用真人出镜,但会议里实时讲话对口型。
常见问题速查
- 浏览器连不上、一直转圈→ 多半是端口没放通。WebRTC 需要 TCP 8010 + UDP 1-65535,查防火墙和云安全组。
- RTMP 推流失败、画面没出→ 检查 ffmpeg 是否带 libx264(
ffmpeg -version输出里要有--enable-libx264),以及push_url是否填错。 - 口型乱动或画面花屏→ 模型文件与形象包不匹配。确认
--avatar_id和--model是同一套素材,权重文件名改成了wav2lip.pth。 - 说话卡、追不上语速→ 看日志里的
inferfps和finalfps,两者都要 ≥25 才是实时。低于则换更快的模型(如 musetalk 换 wav2lip)、降并发或升显卡。 - 首次开播前几秒不同步→ 模型预热和首包缓冲的正常现象,持续不同步再回查网络和 STUN 配置(
--stun)。
下一步:找一台带显卡的机器,把模型文件放好,跑一遍第 3 步的启动命令——画面出不来,就先查日志里那两个帧率数字。
【免费下载链接】metahuman-streamReal time interactive streaming digital human项目地址: https://gitcode.com/GitHub_Trending/me/metahuman-stream
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考