From d62af0c2af5e73f6b0e7bfa9e0f3c12c59cc3f31 Mon Sep 17 00:00:00 2001 From: penghuailiang Date: Thu, 14 May 2020 19:41:58 +0800 Subject: [PATCH] update readme --- .github/im10.png | Bin 21092 -> 0 bytes .github/im4.png | Bin 10926 -> 0 bytes README.md | 43 +++++++++++++++++-------------------------- 3 files changed, 17 insertions(+), 26 deletions(-) delete mode 100644 .github/im10.png delete mode 100644 .github/im4.png diff --git a/.github/im10.png b/.github/im10.png deleted file mode 100644 index f9f1b276a6802ea8aace3578e3d073a9b606392f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21092 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 diff --git a/.github/im4.png b/.github/im4.png deleted file mode 100644 index f4ad09b7c3aca74fb39fe9fbe2597151c804bfbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10926 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 z
-至此,你的LipSync组件应该变得像如图所示。

@@ -56,7 +50,6 @@ AmplitudeThreshold的含义是能量阈值,它决定一个数据帧中所有 MoveTowardsSpeed的含义是平滑过渡的速度。语音帧与语音帧之间的识别结果,并不是直接就赋予到BlendShape属性值上的,而是经过了平滑过渡操作,实际赋予的属性值是经过插值的。从效果上看,这个速度越低,角色的嘴巴就动得越慢,给人的感觉是不太灵活;反之则越快,给人感觉移动非常夸张。一般来说,这个值可以取在6到10之间。 完成了这些设置值之后,尝试运行一下,你应该就可以看到UnityChan随着语音的播放动起了她的嘴巴。 -以上,则是使用LipSync最简单的方法。 在这个例子中,所识别的语音是日语,正如RecognizerLanguage所示的Japanese。如果你需要识别汉语,可以把RecognizerLanguage项切换成Chinese,此时VowelPropertyNames中会多出一个“v”的元音。除此之外没有其他变化。 @@ -71,11 +64,7 @@ MoveTowardsSpeed的含义是平滑过渡的速度。语音帧与语音帧之间

在这里,你可以导入一个文件夹里的语音文件,并把它们的口型匹配数据烘焙到本地文件上。这里利用了Unity的动画系统,输出的文件就是AnimationClip与AnimatorController。 -先从AudioClipInputFolderPath开始,这里点击“Browse...”按钮可以选择一个路径。当然,你只能选择位于Assets文件夹内的路径。之后,LipSync会搜索该文件夹内所有的音频文件,并记录到AudioClipList中。 - -

- -右边部分的设置,与实时模式下的设置基本相同,就是多出了两项AnimatorName和TargetRelativePath。AnimatorName是烘焙完毕后,生成的Animator的名称。你可以自行进行指定。TargetRelativePath是为了应对特殊情况,一般来说生成的Animator会被挂载在目标对象上,但是可能会因为某些原因,导致只能挂载在它的某一个父级GameObject。这个TargetRelativePath就是用来指定相对路径用的。通常情况下不会用到它,这里我们选择不填写。 +先从AudioClipInputFolderPath开始,这里点击“Browse...”按钮可以选择一个路径。当然,你只能选择位于Assets文件夹内的路径。之后,LipSync会搜索该文件夹内所有的音频文件,并记录到AudioClipList中。AnimatorName是烘焙完毕后,生成的Animator的名称。你可以自行进行指定。TargetRelativePath是为了应对特殊情况,一般来说生成的Animator会被挂载在目标对象上,但是可能会因为某些原因,导致只能挂载在它的某一个父级GameObject。这个TargetRelativePath就是用来指定相对路径用的。通常情况下不会用到它,这里我们选择不填写。 另外,AdvancedOptions里也多出了一项ShiftStepSize,这决定了采样时数据帧与数据帧之间的间隔。在实时匹配时,由于LipSync可以直接采样当前帧(渲染意义上)正在播放的声音片段,所以不需要这一个属性,而烘焙时声音并没有被真正播放,所以需要指定这个值。一般来说,取窗口长度的一半可以得到非常精确的结果,小于这个值的意义不大,烘焙时间却会增长。 全部设置完毕后,你可以点击“Bake”按钮。选择一个Assets文件夹内的路径,即可开始烘焙工作。烘焙工作需要的时间比较长,限于目前采用的计算方法,可能会长于语音文件本身的时间长度,请耐心等待一下。经过漫长的等待后,你可以在刚才指定的路径中找到烘焙结果。 @@ -91,26 +80,24 @@ MoveTowardsSpeed的含义是平滑过渡的速度。语音帧与语音帧之间 LipSync主要涉及到的是信号处理与语音识别领域的理论知识。这一部分将进行简单的解说,如果想深入了解,可以自行查阅相关概念。 它的基本工作流程如下: -1、从AudioSource或者AudioClip处获取语音数据。 +#### 1、从AudioSource或者AudioClip处获取语音数据 从AudioSource处获取是实时匹配时采用的方法。AudioSource本身提供了一个GetOutputData函数,可以获取当前正在播放的语音数据段。 从AudioClip处获取是烘焙是采用的方法。AudioClip本身其实是对语音文件的一个封装,可以使用GetData函数直接获得语音数据。 这过程中也包含了分帧与窗口化的步骤。 -2、剔除无声帧。 +#### 2、剔除无声帧 从信号处理的角度上说,这一步是一种时域分析方法。对数据帧中的所有值进行求和,如果结果大于用户预设的一个阈值(也就是AmplitudeThreshold),那么就认为这一帧是没有声音的,不对它进行后续处理。这可以节省不必要的分析过程。如果适当调高阈值,一定程度上可以降噪。 -3、获取语音数据的频域信息。 +#### 3、获取语音数据的频域信息 你在使用一些音乐播放器时,有时候会看到一根根跳动的长条,这就是“频谱”的一种表现方式,频域信息指的就是频谱。这对于语音识别来说是非常重要的信息。 实时匹配时,AudioSource的GetSpecturmData函数带来了极大的帮助,这个函数本身可以高效地获取当前播放的语音数据频谱。 然而在烘焙时,并没有这样便利的函数可以用。所以,LipSync借助了一个数学工具——离散余弦变换(DCT),它可以用来获取一个时域信息段的频域信息。它与另一个著名的数学工具——傅里叶变换是等价的,所不同的是余弦变换只获取频率信息,而舍弃了相位信息。实际上这就够了,我们并不需要相位信息。这个数学工具的实现可以在MathToolBox.DiscreteCosineTransform中找到。 -4、提取共振峰。 - -这里先简单介绍一下人类发声的原理。 +#### 4、提取共振峰 人在发声时,肺部收缩送出一股直流空气,经器官流至喉头声门处(即声带),使声带产生振动,并且具有一定的振动周期,从而带动原先的空气发生振动,这可以称为气流的激励过程。之后,空气经过声带以上的主声道部分(包括咽喉、口腔)以及鼻道(包括小舌、鼻腔),不同的发音会使声道的肌肉处在不同的部位,这形成了各种语音的不同音色,这可以称为气流在声道的冲激响应过程。 @@ -119,27 +106,31 @@ LipSync主要涉及到的是信号处理与语音识别领域的理论知识。 LipSync的核心步骤正是如此。提取共振峰的方法是,在前一步骤中获取的频谱上求出局部最大值的最大值,具体实现在MathToolBox.FindLocalLargestPeaks中可以找到。 -5、把共振峰映射为元音特征值,进行平滑过渡处理,再赋予到目标对象上 +#### 5、把共振峰映射为元音特征值,进行平滑过渡处理,再赋予到目标对象上 后续步骤则比较容易理解,无非是一些映射操作与平滑过渡处理。平滑过渡的方法直接使用了Mathf.MoveTowards。 ## 我想要改进LipSync,可以做些什么? 目前,有以下几个可以改进的方向: -1、更优化的DCT算法 +#### 1、更优化的DCT算法 目前采用的DCT算法,是单线程直接计算了所有需要计算的值,时间复杂度为O(n^2)。这也是为什么烘焙的速度非常慢。一方面,可以考虑借鉴快速傅里叶变换所采用的算法(比如蝶形变换),把时间复杂度降到O(nlogn);另一方面,可以考虑利用多线程计算。还可以考虑对余弦计算结果进行缓存。 -2、整体数学运算优化 +#### 2、整体数学运算优化 这可以说是上一个问题的泛化版本。笔者在撰写数学函数时,几乎没有考虑步骤上的优化,所有步骤都很耿直地写上去了,所以应该有许多可以优化的地方。 另外,由于存在着各种浮点运算,对GPU的利用也是一个考虑方向。 -3、元音项的数据化,或者是更好的管理方法 +#### 3、元音项的数据化,或者是更好的管理方法 如果你阅读过语音识别部分的代码,你可以看到所支持的两种语言的元音项都是写死的,显然这不太“优雅”。笔者的打算是把它们数据化,写到本地文件中,使用时动态进行读取,这既有利于管理,也有利于对更多的语言进行支持。 当然这不一定是最好的管理方法,如果你有什么高见,希望能够提出来。 -4、更加精确的语音识别方法 +#### 4、更加精确的语音识别方法 如果你对语音识别有一些研究,你应该知道,目前的语音识别方法中并没有去除基频的影响。如果基频的能量很高,会明显影响共振峰的识别。 + + +[i1]: https://www.bilibili.com/video/BV1BK411578P +[i2]: http://unity-chan.com/ \ No newline at end of file