[{"data":1,"prerenderedAt":299},["ShallowReactive",2],{"\u002F2023-10-19-ue5-ovrlipsync-fix":3},{"id":4,"title":5,"body":6,"date":285,"description":12,"extension":286,"meta":287,"navigation":98,"path":293,"seo":294,"stem":295,"tags":296,"__hash__":298},"blogs\u002F_legacy\u002F2023\u002F2023-10-19-ue5-ovrlipsync-fix.md","UE5.2中OvrLipSync无法使用的问题",{"type":7,"value":8,"toc":282},"minimark",[9,13,16,19,25,28,32,35,38,41,247,250,265,272,275,278],[10,11,12],"p",{},"OvrLipSync插件之前在UE4中使用还是比较正常的，但是在UE5.2上引入的时候发现生成的数据始终无法驱动动画。",[10,14,15],{},"当前使用的UE版本为UE5.2.0。",[10,17,18],{},"先直接上结论，输入指令：",[20,21,22],"blockquote",{},[10,23,24],{},"au.editor.ForceAudioNonStreaming 1",[10,26,27],{},"后再转化就可以了。",[29,30,31],"h2",{"id":31},"原因排查",[10,33,34],{},"这个插件之前用的时候是直接可以用的，所以没有怎么关注过细节。",[10,36,37],{},"这次稍微看了下实现，发现其原理还是比较简单的。尤其是针对离线数据使用的情况，其实就是针对语音文件生成了一个Visemes的数组。之后在语音播放时，根据当前播放的时间取到对应需要的MorphTarget值，然后设置到动画上。",[10,39,40],{},"由于这个过程在调试的时候不是很好判定，所以直接修改了插件的代码来观察生成的数据：",[42,43,48],"pre",{"className":44,"code":45,"language":46,"meta":47,"style":47},"language-cpp shiki shiki-themes github-light-high-contrast github-dark monokai","USTRUCT()\nstruct OVRLIPSYNC_API FOVRLipSyncFrame\n{\n    GENERATED_BODY()\n\n    UPROPERTY(EditDefaultsOnly)\n    TArray\u003Cfloat> VisemeScores;\n\n    UPROPERTY(EditDefaultsOnly)\n    float LaughterScore;\n\n    FOVRLipSyncFrame(const TArray\u003Cfloat> &visemes = {}, float laughterScore = 0.0f)\n        : VisemeScores(visemes), LaughterScore(laughterScore)\n    {\n    }\n};\n","cpp","",[49,50,51,64,79,85,93,100,109,128,133,147,156,161,211,229,235,241],"code",{"__ignoreMap":47},[52,53,56,60],"span",{"class":54,"line":55},"line",1,[52,57,59],{"class":58},"scAT4","USTRUCT",[52,61,63],{"class":62},"s0idv","()\n",[52,65,67,71,75],{"class":54,"line":66},2,[52,68,70],{"class":69},"sGZGq","struct",[52,72,74],{"class":73},"spBst"," OVRLIPSYNC_API",[52,76,78],{"class":77},"sfUV7"," FOVRLipSyncFrame\n",[52,80,82],{"class":54,"line":81},3,[52,83,84],{"class":62},"{\n",[52,86,88,91],{"class":54,"line":87},4,[52,89,90],{"class":58},"    GENERATED_BODY",[52,92,63],{"class":62},[52,94,96],{"class":54,"line":95},5,[52,97,99],{"emptyLinePlaceholder":98},true,"\n",[52,101,103,106],{"class":54,"line":102},6,[52,104,105],{"class":58},"    UPROPERTY",[52,107,108],{"class":62},"(EditDefaultsOnly)\n",[52,110,112,115,119,122,125],{"class":54,"line":111},7,[52,113,114],{"class":62},"    TArray",[52,116,118],{"class":117},"sLXdl","\u003C",[52,120,121],{"class":69},"float",[52,123,124],{"class":117},">",[52,126,127],{"class":62}," VisemeScores;\n",[52,129,131],{"class":54,"line":130},8,[52,132,99],{"emptyLinePlaceholder":98},[52,134,136,138,141,144],{"class":54,"line":135},9,[52,137,105],{"class":58},[52,139,140],{"class":62},"(",[52,142,143],{"class":77},"EditDefaultsOnly",[52,145,146],{"class":62},")\n",[52,148,150,153],{"class":54,"line":149},10,[52,151,152],{"class":69},"    float",[52,154,155],{"class":62}," LaughterScore;\n",[52,157,159],{"class":54,"line":158},11,[52,160,99],{"emptyLinePlaceholder":98},[52,162,164,167,169,172,175,177,179,182,185,189,192,195,197,200,202,206,209],{"class":54,"line":163},12,[52,165,166],{"class":58},"    FOVRLipSyncFrame",[52,168,140],{"class":62},[52,170,171],{"class":117},"const",[52,173,174],{"class":77}," TArray",[52,176,118],{"class":62},[52,178,121],{"class":69},[52,180,181],{"class":62},"> ",[52,183,184],{"class":117},"&",[52,186,188],{"class":187},"sbfHu","visemes",[52,190,191],{"class":117}," =",[52,193,194],{"class":62}," {}, ",[52,196,121],{"class":69},[52,198,199],{"class":187}," laughterScore",[52,201,191],{"class":117},[52,203,205],{"class":204},"stP0Q"," 0.0",[52,207,208],{"class":117},"f",[52,210,146],{"class":62},[52,212,214,217,220,223,226],{"class":54,"line":213},13,[52,215,216],{"class":62},"        : ",[52,218,219],{"class":58},"VisemeScores",[52,221,222],{"class":62},"(visemes), ",[52,224,225],{"class":58},"LaughterScore",[52,227,228],{"class":62},"(laughterScore)\n",[52,230,232],{"class":54,"line":231},14,[52,233,234],{"class":62},"    {\n",[52,236,238],{"class":54,"line":237},15,[52,239,240],{"class":62},"    }\n",[52,242,244],{"class":54,"line":243},16,[52,245,246],{"class":62},"};\n",[10,248,249],{},"这样就可以在资产文件中观察生成的数据了，可以看到生成的数据全部都是0。",[10,251,252,253,256,257,260,261,264],{},"于是转到生成逻辑，发现在",[49,254,255],{},"DecompressSoundWave","内部调用",[49,258,259],{},"InitAudioResource","时，在检查",[49,262,263],{},"IsStreaming","的地方没通过，导致实际没有返回插件预期的数据。",[10,266,267,268,271],{},"虽然要比较正式的修改的话需要进一步的跟进流程来确定怎么调整，但是这部分代码是",[49,269,270],{},"OvrLipSync","官方维护的，要动起来也得花时间去看它的结构。发现有一个开关可以在编辑器内关闭这个行为后就没有跟进了。",[10,273,274],{},"这样可能只能在编辑器内起作用，但是由于实际使用的时候是直接调用生成的离线数据的。打包后离线数据的使用没有影响。",[10,276,277],{},"由于没有使用实时数据动态生成的需求，就没有继续跟进了。",[279,280,281],"style",{},"html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sGZGq, html code.shiki .sGZGq{--shiki-default:#A0111F;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .spBst, html code.shiki .spBst{--shiki-default:#702C00;--shiki-dark:#B392F0;--shiki-sepia:#F8F8F2}html pre.shiki code .sfUV7, html code.shiki .sfUV7{--shiki-default:#702C00;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .sLXdl, html code.shiki .sLXdl{--shiki-default:#A0111F;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sbfHu, html code.shiki .sbfHu{--shiki-default:#702C00;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .stP0Q, html code.shiki .stP0Q{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":47,"searchDepth":66,"depth":81,"links":283},[284],{"id":31,"depth":66,"text":31},"2023-10-19","md",{"layout":288,"excerpt":289},"post",{"type":7,"value":290},[291],[10,292,12],{},"\u002F2023-10-19-ue5-ovrlipsync-fix",{"title":5,"description":12},"_legacy\u002F2023\u002F2023-10-19-ue5-ovrlipsync-fix",[297],"ue5","uPQYbRzu9JEhV4bvlVrSX2SFbF-KJaj9ohYCNjlTHLc",1788763176997]