声音驱动虚拟形象嘴型变化

举报
NZY小叶子 发表于 2020/02/11 22:08:10 2020/02/11
【摘要】 我们以Oculus的OVRLipSync为例介绍如何用实时声音驱动虚拟形象的嘴型变化。

我们以OculusOVRLipSync为例介绍如何用实时声音驱动虚拟形象的嘴型变化。

1. 新建一个Unity工程

1581429934759709.png

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赋值,驱动嘴型变化。不过需要注意的是该插件是根据英文语音识别的,对中文语音支持稍差。

1581429948747966.png

2 demo运行示意图

4. 让你的虚拟形象嘴型动起来

4.1 虚拟形象面部BlendShapes

所选的虚拟形象面部最好有与该15个英文发音对应的BlendShapes,如果BlendShapes比较少,也可以使用,但效果较差,BlendShapes一般由美术人员提供,其命名最好与英文发音对应。该15个英文发音对应的BlendShapes可参考https://developer.oculus.com/documentation/unity/audio-ovrlipsync-viseme-reference/

1581429962878694.png

3 虚拟形象面部BlendShapes

4.2 绑定相关脚本

新建一个Scene,将所选的虚拟形象加入到Hierarchy,给该虚拟形象添加三个脚本:麦克风输入OVRLipSyncMicInput、语音内容分析OVRLipSyncContext、根据分析内容对对应BlendShapes进行赋值OVRLipSyncContextMorphTarget

1581430009650203.png

4 新建一个Scene,并给虚拟形象绑定相关脚本

再将带有面部BlendShapesSkinned Mesh Renderer拖到OVRLipSyncContextMorphTarget脚本下的Skinned Mesh Renderer,并将Viseme To Blend Targets部分选上和英文语音对应的BlendShape即可。注意:如果BlendShapes不足,可将其选为空,但不可不选,且不可重复选。

1581430025111681.png

5 VisemeBlendShape对应图

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);

            }

        }

}

其中:i0是静默值(在本案例中对应的BlendShapesil),i1-14依次表示是PPFF...ou,visemeToBlendTargets[i]i对应的BlendShape的索引值,frame.Visemes[i] * 100.0f为要给BlendShape赋的值。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。