声音驱动虚拟形象嘴型变化
我们以Oculus的OVRLipSync为例介绍如何用实时声音驱动虚拟形象的嘴型变化。
1. 新建一个Unity工程
图1 新建Unity 工程
2. 导入OVRLipSync unitypackage
从https://developer.oculus.com/downloads/package/oculus-lipsync-unity/1.39.0/下载ovr_lipsync_unity_1.39.0.zip,并在Unity中导入OculusLipSync.unitypackage。
Assets->Import Package->Custom Package
3. 运行Demo
导入Package后,打开Oculus->LipSync->Scenes->LipSync_Demo,直接运行,对着电脑的麦克(可以直接插耳机)说话,人物的嘴型会根据实时语音动起来。
原理:LipSync会根据实时语音内容识别出15个英文发音(sil,PP,FF,TH,DD,kk,CH,SS,nn,RR,aa,E,ih,oh,ou),并对其对应的面部BlendShape赋值,驱动嘴型变化。不过需要注意的是该插件是根据英文语音识别的,对中文语音支持稍差。
图2 demo运行示意图
4. 让你的虚拟形象嘴型动起来
4.1 虚拟形象面部BlendShapes
所选的虚拟形象面部最好有与该15个英文发音对应的BlendShapes,如果BlendShapes比较少,也可以使用,但效果较差,BlendShapes一般由美术人员提供,其命名最好与英文发音对应。该15个英文发音对应的BlendShapes可参考https://developer.oculus.com/documentation/unity/audio-ovrlipsync-viseme-reference/
图3 虚拟形象面部BlendShapes
4.2 绑定相关脚本
新建一个Scene,将所选的虚拟形象加入到Hierarchy,给该虚拟形象添加三个脚本:麦克风输入OVRLipSyncMicInput、语音内容分析OVRLipSyncContext、根据分析内容对对应BlendShapes进行赋值OVRLipSyncContextMorphTarget。
图4 新建一个Scene,并给虚拟形象绑定相关脚本
再将带有面部BlendShapes的Skinned Mesh Renderer拖到OVRLipSyncContextMorphTarget脚本下的Skinned Mesh Renderer,并将Viseme To Blend Targets部分选上和英文语音对应的BlendShape即可。注意:如果BlendShapes不足,可将其选为空,但不可不选,且不可重复选。
图5 Viseme和BlendShape对应图
4.3 脚本解析
OVRLipSyncContextMorphTarget脚本中对目标BlendShape进行赋值:
void SetVisemeToMorphTarget(OVRLipSync.Frame frame)
{
for (int i = 0; i < visemeToBlendTargets.Length; i++)
{
if (visemeToBlendTargets[i] != -1)
{
// Viseme blend weights are in range of 0->1.0, we need to make range 100
skinnedMeshRenderer.SetBlendShapeWeight(
visemeToBlendTargets[i],
frame.Visemes[i] * 100.0f);
}
}
}
其中:i为0是静默值(在本案例中对应的BlendShape是sil),i为1-14依次表示是PP、FF...ou,visemeToBlendTargets[i]为i对应的BlendShape的索引值,frame.Visemes[i] * 100.0f为要给BlendShape赋的值。
- 点赞
- 收藏
- 关注作者
评论(0)