最新嘴型融合模型SadTalker

Posted 迷途小书童的Note

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最新嘴型融合模型SadTalker相关的知识,希望对你有一定的参考价值。

环境

  • windows 10 64bit

  • SadTalker

  • torch 1.12.1+cu113

安装配置

创建一个全新的 python 虚拟环境

conda create -n sadtalker python=3.8
conda activate sadtalker

然后,拉取源代码,并且安装对应的依赖

git clone https://github.com/Winfredy/SadTalker.git
cd SadTalker

# 安装gpu版的torch
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113

# 安装dlib-bin,它比dlib更快
pip install dlib-bin

# 安装其它依赖
pip install -r requirements.txt 

# 安装gfpgan,如果不使用gfpgan增强,可以不安装
git clone https://github.com/TencentARC/GFPGAN.git gfpgan_src
cd gfpgan_src
python setup.py install

测试

找一段音频 test.mp3 和视频 test.mp4,进行测试

python.exe .\\inference.py --driven_audio test.mp3 --source_image test.mp4 --result_dir outputs --enhancer RestoreFormer

其中,--source_image 参数可以是视频,也可以是图片, --result_dir 参数指定最后合成后的视频存放位置,--enhancer 指定视频增强的方法,可以是 gpfgan 或是 RestoreFormer

如果你的显卡够好,可以调整 --batch_size 参数,默认值是2,值越大,处理的越快。

还有部分参数,可以根据自己的实际情况添加。

FAQ

Traceback (most recent call last):
  File ".\\inference.py", line 110, in <module>
    main(args)
  File ".\\inference.py", line 71, in main
    batch = get_data(first_coeff_path, audio_path, device)
  File "D:\\BaiduNetdiskDownload\\SadTalker\\SadTalker\\generate_batch.py", line 68, in get_data
    orig_mel = audio.melspectrogram(wav).T
  File "D:\\BaiduNetdiskDownload\\SadTalker\\SadTalker\\utils\\audio.py", line 47, in melspectrogram
    S = _amp_to_db(_linear_to_mel(np.abs(D))) - hp.ref_level_db
  File "D:\\BaiduNetdiskDownload\\SadTalker\\SadTalker\\utils\\audio.py", line 95, in _linear_to_mel
    _mel_basis = _build_mel_basis()
  File "D:\\BaiduNetdiskDownload\\SadTalker\\SadTalker\\utils\\audio.py", line 100, in _build_mel_basis
    return librosa.filters.mel(hp.sample_rate, hp.n_fft, n_mels=hp.num_mels,
TypeError: mel() takes 0 positional arguments but 2 positional arguments (and 3 keyword-only arguments) were given

这是由于 librosa 的版本高了,按照 requirements.txt,安装 0.6.0 版本即可

参考资料

  • https://github.com/Winfredy/SadTalker

Scala型变

参考技术A 「型变(Variance)」是一个令人费解的概念,但它却是理解类型系统的重要基石。本文首先讨论型变的基本概念,深入理解型变的基本形态。然后以 List, Option 为例讲解型变在 Scala 中的应用;最后通过 ScalaHamcrest 的实战,加深对此概念的理解和运用。

其中, Mutable 常常意味着 Nonvariant ,但是 Noncovariant 与 Mutable 分别表示两个不同的范畴。

「型变(Variance)」拥有三种基本形态:协变(Covariant), 逆变(Contravariant), 不变(Nonconviant),可以形式化地描述为:

Scala 的类型参数使用 + 标识「协变」, - 标识「逆变」,而不带任何标识的表示「不变」(Nonvariable)。

事实上,判定一个类型是否拥有型变能力的准则非常简单。

Supplier 是一个生成者,它生产 T 类型的实例。

Consumer 是一个消费者,它消费 T 类型的实例。

Function1 是一个一元函数,它既是一个生产者,又是一个消费者,但它是不可变的(Immutable)。其中,入参类型为 -T ,返回值类型为 +R ;对于参数类型,函数是逆变的,而对于返回值类型,函数则是协变的。

与 Function1 不同,虽然数组类型既是一个生产者,又是一个消费者。但是,它是一个可变的(Mutable)类型,因此它是不变的(Nonvariant)。

综上述,可以得到 2 个简单的结论。

幸运的是, Scala 编译器能够完成这个约束的检查。例如,

编译器将检测到编译错误。

例如,给定两个函数 F1, F2 。

则 F1 <: F2 成立。

Option 是一个递归的数据结构,它要么是 Some ,要么是 None 。其中, None 表示为空,是递归结束的标识。

使用 Scala ,可以很直观地完成 Option 的递归定义。

因为 Option 是不可变的(Immutable),因此 Option 应该设计为协变的,即 Option[+A] 。也就是说,对于任意的类型 A , Option[Nothing] <: Option[A] ,即 None <: Option[A] 都成立。

与 Option 类似, List 也是一个递归的数据结构,它由头部和尾部组成。其中, Nil 表示为空,是递归结束的标识。

使用 Scala ,可以很直观地完成 List 的递归定义。

因为 List 是不可变的(Immutable),因此 List 应该设计为协变的,即 List[+A] 。也就是说,对于任意的类型 A , List[Nothing] <: List[A] ,即 Nil <: List[A] 都成立。

可以在 List 中定义了 cons 算子,用于在 List 头部追求元素。

此时,编译器将报告协变类型 A 出现在逆变的位置上的错误。因此,在遵循「里氏替换」的基本原则,使用「下界(Lower Bound)」对 A 进行界定,转变为「不变的(Nonvariable)」的类型参数 A1 。

至此,又可以得到一个重要的结论。

List 的 cons 算子就是通过使用「下界」界定协变类型参数 A ,将其转变为不变的(Nonvariable)类型参数 A1 的。而对于「上界」,通过实现 ScalaHamcrest 的基本功能进行讲述,并完成整个型变理论知识的回顾和应用。

对于任意的类型 A , A => Boolean 常常称为「谓词」;如果该谓词用于匹配类型 A 的某个值,也常常称该谓词为「匹配器」。

ScalaHamcrest 首先定义一个 Matcher ,并添加了 &&, ||, ! 的基本操作,用于模拟谓词的基本功能。

对于函数 A => Boolean ,类型参数 A 是逆变的。因此,为了得到支持型变能力的 Matcher ,应该将类型参数 A 声明为逆变。

但是,此时 &&, || 将报告逆变类型 A 出现在协变的位置上。为此,可以使用「上界」对 A 进行界定,转变为不变的(Nonvariant)类型 A1 。

基于 Matcher ,可以定义特定的原子匹配器。例如:

也可以定义 EqualTo 的原子匹配器,用于比较对象间的相等性。

与 EqualTo 类似,可以定义原子匹配器 Same ,用于比较对象间的一致性。

其中, A <: AnyRef类型 对 A 进行界定,排除 AnyVal 的子类误操作 Same 。类似于类型上界,也可以使用其他的类型界定形式;例如,可以定义 InstanceOf ,对类型 A 进行上下文界定,用于匹配某个实例的类型。

有时候,基于既有的原子可以很方便地构造出新的原子。

也可以将各个原子或者组合器进行组装,形成威力更为强大的组合器。

特殊地,基于 AnyOf/AllOf ,可以构造很多特定的匹配器。

修饰也是一种特殊的组合行为,用于完成既有功能的增强和补充。

其中, Not, Is 是两个普遍的修饰器,可以修饰任意的匹配器;也可以定义针对特定类型的修饰器。例如,可以定义针对字符串操作的原子匹配器和修饰匹配器。

如果要忽略大小写,则可以通过定义 IgnoringCase ,修饰既有的字符串的原子匹配器。

有时候,可以通过定义语法糖,提升用户感受。例如,可以使用 Not 替换 Not(EqualTo) , Is 替代 Is(EqualTo) ,不仅减轻用户的负担,而且还能提高表达力。

至此,还不知道 ScalaHamcrest 如何使用呢?可以定义一个实用方法 assertThat 。

其中, assert 定义于 Predef 之中。例如存在如下一个测试用例。

也可以使用 && 直接连接多个匹配器形成调用链,替代 AllOf 匹配器。

此处为了演示「型变」的作用, ScalaHamcrest 采用了 OO 与 FP 相结合的设计手法,在下一章讲解「Scala函数论」时, ScalaHamcrest 将采用纯函数式的设计手法实现,敬请关注。

以上是关于最新嘴型融合模型SadTalker的主要内容,如果未能解决你的问题,请参考以下文章

语音驱动嘴型与面部动画生成的现状和趋势

语音驱动嘴型与面部动画生成的现状和趋势

语音驱动嘴型与面部动画生成的现状和趋势

Unity人物动画SALSA With RandomEyes (语音生成嘴型/人物说话) 使用

推荐系统[五]:重排算法详解相关概念整体框架常用模型;涉及用户体验[打散多样性],算法效率[多任务融合上下文感知]等

怎么做出猫咪的嘴型特效?就像电影里那种,但不需要动作。要详细,啥软件,啥插件,啥步骤?高分!