论文:Real-time Neural Radiance Talking Portrait Synthesis via Audio-spatial Decomposition
代码:https://github.com/ashawkey/RAD-NeRF
项目:https://me.kiui.moe/radnerf/
贡献:
Audio-driven 的说话人合成任务有很多应用场景,所以近年来的研究也比较多
有很多方法是基于 landmark 和 meshs 来作为面部结构的先验信息,也就是会借助中间表达特征,很依赖中间特征的效果。
NeRF 能够重建逼真的 3D 场景,NeRFace[19] 首次将 3DMM 引入 NeRF 来控制 head,还有一些方法 [22,32,46] 直接使用声音特征来控制 NeRF,不使用中间特征。但这些方法有一个通病就是很慢,例如 AD-NeRF 在 3090 GPU 上合成一个 450x450 大小的图像帧需要耗时 12s,远远低于实时 25FPS 的要求,且训练一个人需要大概一天的时间,限制了其实际使用。
为了提升效率,一个很直观的方法就是借鉴最近 NeRF 提效的解决方法 [9,10,31,37,45,49,62]。总的来说,就是降低 MLP 大小的同时在一个显示的可训练的网格结构中来保存 3D 场景特征。
之前很耗费资源的 MLP 前向传播就被一个线性插值取代了,同样能得到每个 3D 位置点的信息,但这种静态场景的方法不能直接用于动态说话人的合成。
从静态扩展到动态主要的问题:
本文如何做的:
Grid-based NeRF:
总结一下主要区别:
1、NeRF
NeRF 是使用 5D coordinates 来表达 3D 场景,也就是一个函数 F : x,d → σ , c F: \text{x,d} \to \sigma,\text{c} F:x,d→σ,c,假设一个 ray 从 o 出发,沿着方向 d 行进,则在沿着射线顺序采样的点 x i = o + t i d \text{x}_i=\text{o}+t_i \text{d} xi=o+tid 处来查询 F F F 来计算密度和颜色。
颜色:
2、Dynamic NeRF:
动态场景相比静态场景而言,会增加一些额外的条件,如当前时间 t。
之前的方法主要有两种解决方式:
3、Audio-driven Neural Radiance Talking Portrait
合成说话人的一般通用格式如下,一般使用 3-5 分钟有连续音频和固定机位拍摄的特定场景的视频
对每帧图片进行预处理:
对声音处理:
4、Grid-based NeRF
近期的 Grid-based NeRF 就是使用 3D feature grid encoder 将将静态场景的 3D 空间信息进行编码。
3D feature grid encoder:
这种处理能加速训练和推理,为实时处理 3D 场景带来了可能
1、Audio-spatial Decomposition
之前的隐式 NeRF 方法 [22,32] 通常将 audio 信号会直接编码到高维特征,然后和空间高维特征 concat
但是这样对于 grid-based NeRF 来说,很昂贵,所以本文作者提出了解耦的方式
首先,将高维语音特征压缩到低维语音坐标 x a ∈ R D \text{x}_a \in R^D xa∈RD,且 D ∈ [ 1 , 2 , 3 ] D \in [1,2,3] D∈[1,2,3],很小。实现方式是使用 x a = MLP(a, f) \text{x}_a = \text{MLP(a, f)} xa=MLP(a, f)
然后,将 audio-spatial grid encoder 解耦成 两个 grid encoder 来分别对 audio 和 spatial 进行编码,然后 concat 起来即可:
2、控制眨眼
眨眼对真实的数字人合成也很重要
但是由于眨眼和声音没有很大的关系,很多之前的方法都忽略了眨眼,本文提出了一个方法来控制眨眼,如图 2。
3、整体 head 表达
当得到了下面几个特征时,就可以使用一个 small MLP 来预测 density 和 color 了:
然后就可以使用公式 1 的方式来进行体渲染来得到每个位置的颜色,并合成 head
1、最大占用网络的修剪
在提高 NeRF效率的过程中,常见的一种技术是维护一个占用网格来修剪射线采样空间。这在静态场景下非常直接,因为占用网格也是静态的,我们可以使用一个三维网格来存储它。但对于动态场景,占用值还取决于动态条件,这就需要额外的维度。然而,更高维度的占用网格更难以存储和管理,并且会导致模型大小和训练时间大幅增加。
作者发现,在处理说话头部模型时(即人物头部根据音频进行相应动作的模型),由音频变化引起的占有率变化通常很小并且可以忽略不计。因此,他们提出了一种新方法:不是为每个音频条件都单独设置一个占有率网格,而是设定一个最大占有率网格来覆盖所有可能出现的音频条件。
具体实施过程中,在训练阶段从数据集中随机抽取各种音频条件,并记录下最大值作为最大占有率。这样做只需要使用三维网格就能存储所有可能出现情况下的最大值,并且能够成功地修剪不同音频条件下射线采样空间。
2、Loss 函数
颜色 loss 为 MSE loss:
使用 cross entropy loss 来优化 pixel transparency(像素透明度 α \alpha α)为 0 或 1,权重为 0.001
对于 audio 特征,理想情况下其应该只对面部区域起作用,在非面部区域的值应该为 0,所以作者使用 L1 正则化来约束,优化的目标是让其在非面部区域的值为 0(如 hair 和 ear),即不会闪烁,面部区域是使用 2D 关键点来定位的。
3、fine-tuning lips
高质量的唇部运动对于说话人的合成很重要,作者发现,只使用 pixel-wise MSE loss 很难对唇部进行很好的建模
所以,作者提出使用 patch-wise structural loss(如 LIPIS loss[63]),也就是基于面部关键点,在 lips 区域选择 patch,对唇部进行进一步 finetune,finetune 的整体 loss 如下。
权重为 0.01