当前位置: 首页 > news >正文

山东大学项目实训个人纪实(6)——降低唇形同步延迟及性能需求

上期博客已经实现了流式输出,纯语音对话的延迟已经达到了实时对话的标准,主要影响体验的还是唇形同步,当前项目使用Audio2Face插件,但插件使用深度学习算法计算口型,需要用上GPU跑模型,就导致对电脑性能要求极高(天选4笔记本带不动)本博客将记录我对基于Oculus Lipsync插件的音频驱动唇形方案,实现纯CPU和低性能需求的唇形同步

Oculus Lipsync插件下载及安装

为什么下载和安装要单拎出来讲?因为Oculus Lipsync插件官方已停止对插件的维护。我在第四篇博客已经有了初步调研,原配插件不支持UE5.6,且不支持实时唇形同步。原插件主要是烘培动画使用。

但为什么现在又重新启用该方案了呢?首先就是我变牛逼了,当前对UE C++了解更加深入,可以尝试动手改插件。其次,我们“请循其本”,该插件的核心原理是“实时分析音频的波形,计算出‘音素(Visemes)’的权重,并驱动面部表情”,也就是说,计算音素这一步可以做到实时,我只需讲音素拿过来实时驱动面部表情就够了。理论成立,实践开始。

插件下载,我使用的是Github上大佬开源的UE5增强版。将项目改为C++,重新编译启动即可。

实现音频转音素

主要通过插件FeedAudio()函数实现。

首先注意到最后一行ProcessFrameAsync()函数,FeedAudio()调用是逐帧调用,然而音频是好几秒,所以我需要一个将音频切片的辅助函数。

已知我的运行帧率是30fps,音频采样率为 24000 Hz,单声道,16-bit,所以应该给函数传递的数据量为( 24000*2 ) / ( 1/30 ) = 1600B。

实现音素驱动嘴型

首先第一大难题:找到Metahuman控制面部表情的地方在哪。由于UE迭代速度过快,原先Face_BP这些蓝图都没有了,一大波教程都被淘汰了,UE官方说是升级了,但也没写好文档,导致我只能一点点摸索。

最终摸索出来两个方案:通过Control Rig控制和通过姿势资产控制。

  1. Control Rig:在Metahumans/Common/Face/CR_MetaHuman_HeadMovement_IK_Proc,那是个控制绑定蓝图,导入Metahuman预览网格体后出现如下UI界面,就可以手动调整面部表情了。关于该UI界面,UE文档中有详细教程

这样做有个致命缺陷:代码调用难度极高。Metahuman面部有51个控制点,每个点代表着一条曲线,虽说动画蓝图可以通过ControlRig接口驱动控制点变化,但是只通过一个音素去驱动多个Control Rig太过于复杂,且没有直接操作、所见即所得,不利于美术调试。

2. 姿势资产。在Metahumans/Common/Face/ARKit/PA_MetaHuman_ARKit_Mapping,这里烘培了许多姿势,可以通过调整权重来控制角色面部表情。这个方案较Control Rig最好的点就是交互直观且易懂,最重要的一点,它支持姿势混合后生成新姿势,这意味着我们可以为16种音素设立一一对应的唇形。

(Viseme Reference)

通过Modify Curve接口即可实现动画的调用

最终效果及未来计划

在我自己的笔记本上已经能够流畅实时运行。

本周将每一个音素的对应口型设计出来,以更好地唇形同步

http://www.jsqmd.com/news/939903/

相关文章:

  • 现在不整合AI与开发工具,半年后将丧失交付竞争力:2024Q2 DevOps Survey揭示的3个临界阈值与紧急应对清单
  • [智能体-225]:智能体大模型体系 VS 冯诺依曼计算机硬件类比详解
  • 茄子快传与 WeTransfer 差距在哪?Bending Spoons 收购后 WeTransfer 月流水涨至 400 万+美元
  • 【Tilelang入门】Tilelang Puzzles 08
  • Translumo:如何在3分钟内掌握Windows实时屏幕翻译的终极技巧
  • 告别拥堵!用Python+SUMO+TraCI手把手教你打造一个会‘自学’的智能交通体(附完整代码)
  • 保姆级教程:在Windows/Linux上为YOLOv8s模型生成GradCAM热力图(避坑CUDA/CPU环境配置)
  • 【AI监控融合实战指南】:20年运维专家亲授5大落地陷阱与避坑清单
  • 导师骂你PPT逻辑乱?这个网站,自动帮你把论文变答辩神器
  • 告别旧版!Vitis Unified IDE 2023.2 保姆级配置指南:从OpenCV到Vision库,手把手搞定HLS开发环境
  • 从日常运维到脚本编写:详解Windows批处理中find与findstr的10个经典使用场景
  • 告别GPIO模拟时序:用STM32的FSMC外设高效驱动TFTLCD,性能提升实测
  • CW32量产效率翻倍秘籍:CW-Programmer自动编号与工程文件实战
  • 跨镜无缝轨迹续联高密度多目标透明化人防监测预警及AI预案
  • 粒球计算与骨架聚类技术在大数据中的应用
  • 零信任架构下AI视频分析平台落地全链路(2024最新NIST SP 800-207+ISO/IEC 27001双标验证)
  • openEuler磁盘空间告急?别慌,这份LVM扩容避坑指南帮你一次搞定
  • 智慧电网电力设施目标检测数据集|输电线天线风机烟囱识别YOLO深度学习数据集10148期
  • 避开CANoe以太网诊断的‘大坑’:TCP/IP Stack选错,你的数据可能就‘丢’了
  • 开源 AI 绘图神器,一键生成可编辑架构图
  • 在Tina5.0系统里,如何一步步验证RTL8188FU USB WiFi驱动是否正常工作?
  • 告别“狗牙”圆:Bresenham画圆算法在嵌入式屏幕(如STM32+LCD)上的C语言实战
  • QMT数据获取避坑指南:你的`get_market_data`和`get_local_data`用对了吗?
  • 室友问我为什么答辩前还在睡大觉?因为我PPT是自动生成的
  • JetBrains IDE试用期终极重置指南:3步快速恢复30天完整功能
  • [智能体-226]:大模型 ↔ 计算机硬件全套类比详解(冯・诺依曼架构对齐),智能体完整复刻冯诺依曼计算机运行范式
  • 手把手用Python复现Robbins-Monro算法:从求根到在线均值估计的完整代码示例
  • 解放双手,随叫随到:一文读懂智能驾驶“智能召唤”技术
  • 别再被坑了!Vue3 + Element Plus里el-tabs切换导致ECharts图表变形,这几种修复方案实测有效
  • 从Fluent面板到理论公式:一文讲透ANSYS Help文档的四种正确打开方式