找回密码
 立即注册
查看: 547|回复: 0

Python模拟LiveLinkFace在Unreal中控制metahuman表情

[复制链接]
发表于 2022-4-23 07:51 | 显示全部楼层 |阅读模式
初衷

metahuman的呈现效果非常好,但是查了很多教程,对它的表情驱动基本都是用iphone的livelinkface来实时的面捕驱动。
但是我们的场景是希望能够通过程序来驱动metahuman的表情动作,所以就需要自建一个数据源。Python并不是唯一的选择,不过平时用的最多,实现也比较快。
1. 本方案适用范围:


  • 需要通过自己的数据源向Unreal发送实时数据的场景;
  • 不限于Python,实际上任何语音都可以,只要支持socket通信即可。
2. LiveLinkFace解析

在B站上面查LiveLinkFace会查到非常多的metahuman的驱动视频,就不赘述了。关键在于我们希望能够模拟LiveLinkFace做一个数据源,这样就可以直接使用Unreal的官方插件,不用自己手工搭建一个livelink的数据源了。
iphone上面的界面如下,可以看到一共有61个表情控制参数。


LiveLinkFace的数据发送使用的未加密的Socket数据传输,故在PC上面做一个Socket数据的接收器就可以获取到帧:
import socket
cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)   
cli.bind(("127.0.0.1", 11111))   # 这里对应的是本机IP和端口,这里要和LiveLinkFace对应
data = cli.recv(4096)

with open('save.txt', 'wb') as fo:
    fo.write(data)2.1 有表情数据时的数据格式

打开保存文件可以看到一帧数据如下,共:


格式解析:

  • 06 00 00 00 : 帧头
  • 接着的37个字节:应该是设备号,每帧都是一样的
  • 00 00 00 06:分隔符
  • 接着的6个字节:设备名称,这个长度应该是可变的
  • 00:考虑到设备名称可变,那么在后面肯定需要有分隔符,通过序列分析,分隔符为1个字节
  • 接下来3个字节:应该是帧的ID,每帧+1
  • 接下来4个字节:从0~1循环的32位浮点数,物理含义看起来是按照每10秒进行循环
  • 00 00 00 3c 00: 分隔符
  • 00 00 01 3d:常量
  • 剩下的就是实际数据, 共244字节,float32
2.2 无表情数据时的数据格式

如果未检测到人脸的话,同样也有socket包,但其中没有表情数据:


3. 模拟数据源

模拟数据源需要注意以下几点:
1) 可以同时模拟多个设备同时发送,但是设备名称和设备号不能一样,不然会导致数据传输冲突;
2) 每两帧之间的发送间隔尽可能短(一般不超过50ms),否则会导致连接中断。
生成数据分为2个部分,分别是命令字head,和表情数据content,按照上面的规则合成一帧数据后,则可进行发送。
cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ipaddress = (dst_ipaddr, dst_port)

while True:
    head = ...       # head的大部分内容都是不变的,只有4个字节的时间计数需要随时间变化
    content = ...    # 使用自己的数据
    cli.sendto(head+content, ipaddress)4. 最终效果



https://www.zhihu.com/video/1496059958277529600

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-1-22 20:50 , Processed in 0.090005 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表