笔记之SINGING VOICE CONVERSION WITH DISENTANGLED REPRESENTATIONS OF SINGER AND VOCAL TECHNIQUE USING V

论文笔记之SINGING VOICE CONVERSION WITH DISENTANGLED REPRESENTATIONS OF SINGER AND VOCAL TECHNIQUE USING V ARIATIONAL AUTOENCODERS

**

1.名词解释

**
语料库(corpus):指经科学取样和加工的大规模电子文本库。
平行语料库指库中的两种或多种文本互相是对方的译文。
数据驱动:以数据为中心依据进行决策和行动。
数据不平衡:训练数据集中的数据类型分布不平衡,可能4:6分布(轻微不平衡);或者存在1:100(严重不平衡)。
数字签名:是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
先验概率与后验概率(参考文章)
贝叶斯推理
高斯分布
协方差:度量各个维度偏离其均值的程度。协方差的值如果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),结果为负值就说明负相关的,如果为0,也是就是统计上说的“相互独立”

摘要:
我们提出了一个既能处理歌手转换又能处理歌手声乐技术转换的灵活框架。该模型以非并行语料库为训练对象,适应多对多转换,并利用了变分自编码器的最新进展。*它采用独立的编码器分别学习分离的歌手身份和声乐技巧的潜在表征,并使用联合解码器进行重建。*用简单的矢量算法在已知的潜空间中进行变换。定量分析和转换谱图的可视化都表明,我们的模型能够分离歌手身份和声乐技巧,并成功地执行这些属性的转换。据我们所知,这是第一个基于深度学习方法共同解决歌手身份和声乐技巧转换的工作。

Introduction:
歌声转换(SVC)是对歌唱的一种属性进行转换的任务。在不影响语言内容的情况下,将一个歌手的声音转换为另一个歌手的声音一直是SVC研究的重点[1,2,3,4,5]。然而,不同发声技巧之间的转换是一个值得研究的方向,但一直缺乏关注。这种方法可以使一个人把唱歌的声音转换成不同的音色或音高,而这种音色或音高原本是由于身体限制或缺乏歌唱技巧而无法实现的,从而促进了在娱乐和教学方面的应用。
发声技巧,如“呼吸”和“颤音”,丰富了声音,是歌唱不可或缺的一部分。歌手在不同的时间点表演不同的技巧,以创造情感的起伏。通过数据驱动模型建模语音技术是具有挑战性的,因为缺乏标记平衡*的数据,以及内在的模糊性,仅举几个例子。
我们提出了一个处理歌手身份和声乐技巧转换的框架。我们从带潜变量的[6]扩展了基于深度双向长短时记忆(DBLSTM)的模型,这样它就可以通过高斯混合变分自编码器(GMVAEs)学习歌手和声乐技术的解纠缠表示[7,8]。与典型的SVC模型不同,我们的模型是在较短的时间尺度上以歌手/技术的时间依赖变量为条件,适应了声乐技术随时间变化的情况。该模型可以在非并行(即非成对)语料库上进行训练,并允许歌手身份和声乐技巧的多对多转换。

我们在第2节中描述了我们对GMVAE模型的改进实现[10,11]以及我们的歌手/声乐技术转换策略。接下来,我们将在第3节中详细介绍使用VocalSet12的实验设置。最后,我们在第4节报道和讨论了实验结果。

2.METHOD
2.1. Variational Autoencoders
我们提出的基于VAE的歌唱声音生成过程(z→X)包括由潜变量z∈RD生成的一组谱图X∈RT ×F。这种简单的依赖结构允许我们应用变分推理,优化了p(X)的证据下界(ELBO):
在这里插入图片描述
其中p(z) = N (0, I), p(X|z) = N (μ X, I), q(z|X) = N (μ z, diag(σz))
,其中μ z和σz由编码器从X推导而来,μ X由解码器预测。用变分方法从X本身推导出的z重构X,从而得到一个VAE。

2.2. Increasing Expressivity using a GMM Prior
上面所做的假设p(z) = N (0, I)反映了对数据简单分布的偏好,这反过来又牺牲了模型的表达性。用高斯混合模型(GMM)替换p(z),即GMV AEs,已被证明可以有效地提高表达性和可控制性[7,8,10,11]。它还有一个额外的依赖层:y→z,这使我们能够利用数据中可能存在的分类属性y。GMVAE的ELBO为:
在这里插入图片描述
其中先前的p(z)现在是多模态(GMM),更有可能建模具有更高多样性的数据。此外,引入y使模型具有对属性的直接可控性和生成的灵活性,这将在下面详细说明。

2.3. 控制歌手身份和声乐技巧
使用所提出的GMVAE,歌喉的生成过程如下:给定歌手ys和演唱技巧yt(统称为属性),该模型首先推断每个属性的潜在表征(zs和zt),然后将这两个属性结合起来生成歌喉的谱图。数学上,给定属性的联合概率可以因式分解如下:
在这里插入图片描述
其中条件分布p(zs|ys)和p(zt|yt)均假设为具有可学习均值和对角协方差的高斯分布。该GMV AE模型考虑了演唱者和发声技术,可以在转换阶段直接对演唱者和发声技术进行控制。

2.4. 学习一个属性判别空间
我们合并了两个分类器,一个用于声乐技巧,另一个用于歌手,以鼓励学习的空间zt和zs具有鉴别性。每个分类器学习从z * = {z * 1, z * 2,…, z * N},其中N为录音的块数,* *表示歌手或声乐技巧。分类器接收到的序列级表示可以用简化的注意机制进行总结[13,14]:

在这里插入图片描述
其中f(·)是一个可学习函数,c *表示输入序列x的摘要(因此是表示)。α * n在没有注意模块的情况下是均匀分布的。因此,将使p(y * |X)最大化的辅助目标添加到总目标中。

2.5. Weighting KLDs
歌手可能无法在整个录音过程中保持同一水平的表现力。同样,即使歌手被要求使用相同的声乐技巧,音色和音高在录音中也会有所不同。基于这些观察结果,我们可以利用从第2.4节获得的α * n对(2)的KLD项进行加权。
完善我们的培训目标,我们有:
在这里插入图片描述
其中β和γ为判别目标的权值。

2.6. 转换策略
我们通过在较短的时间尺度上学习潜变量来适应有表现力的唱腔中的时变唱腔属性。因此,我们采用模型来推断属性,而不是在转换阶段直接分配属性。通常,转换是通过在块级添加一个转换向量d * * n到z * n来完成的。我们定义dµ* n =µ靶* * -µ源* * n,其中µ* 表示高斯混合分量的均值。µ源 * n可以由高斯似然p(y * n|z * n)或辅助序列级分类器p(y * |X)来确定,分别称为Cchunk和c sequence。请注意,后者在所有n个块上计算公共源* n(因此也就是dµ* n)。

我们在下面报告两种方法的结果。

3.实验设置
3.1. 数据集
我们使用VocalSet[12]来评估我们的框架。我们选择了一个音频文件的子集,其中有20名歌手,6种最容易区分的声乐技术,(直音、呼吸、颤音、带音、唇颤音和炸音)和5个元音。每段录音都被唱成音阶或琶音。该子集被分为1,065个记录的训练集和118个记录的测试集(20 × 6 × 2 × 5 = 1200个组合中缺少17个)。录音时长从3.5秒到23秒不等。这个子集近似于歌手、技巧和元音的类的均衡数量的实例。

我们将录音重新采样到2250hz,将波形w.r.t.归一化到最大幅值,计算F = 96滤波器组的对数幅值MEL谱图(MEL),然后将其缩放到[- 1,1]。我们进一步将MEL分割为T = 43帧的块(X∈R43×96)。256帧移动用于计算MELs,因此43帧总计为0.5秒。

3.2. 体系结构
我们的SVC框架包含七个组件:一个特征提取网络(FEN)、两个编码器、一个解码器、一个后处理器和两个序列级分类器。FEN由两层一维卷积神经网络(CNN)组成,每层有512个滤波器(3 × 1),然后是两个全连接(FC)层,分别有512和256个单元。对每一层使用ReLu之后的批处理归一化。FEN为给定的输入MEL块产生256维的瓶颈特征,并被随后的两种编码器共享和使用。

这两种编码器都被参数化为两层循环神经网络(RNNs):一个具有256个隐藏单元的BLSTM,然后是跨时间共享的两个FC层,用于预测µ*和log σ *。然后使用[15]的重新参数化技巧对Z *进行采样。联合解码器具有与编码器相似的体系结构,但顺序相反。在输出序列的每个时间步中,采用与FEN对称的结构的CNN重构MEL块。最后,利用细分网络(3×1),即具有512个滤波器的三层一维CNN,对重构的MELs进行细化。
3.3. Hyperparameters
p的均值向量(z * |y *)都是随机初始化的,而方差向量则固定为e−2。

歌手的混音数量设置为20,声乐技巧设置为6。两者都等于它们对应的类的数量。我们将批大小设置为128,并使用Xavier初始化初始化模型参数。使用Adam优化器,学习率为10−4。

3.4. 评价指标
我们通过分类器正确识别转换后的MELs中的属性的程度来评估我们的模型。其主要思想是,应该将转换后的MELs准确地分类为目标类,并且应该预测不打算被转换的属性。分类结果揭示了转换对输出MELs的影响。测试集中的每个录音首先被转换为所有可能的目标属性,然后由识别歌手、演唱技巧或元音的三个分类器进行评估。

这些分类器具有与FEN、rnn和注意模块组合相同的体系结构,并独立于未转换的MELs进行训练。

  1. RESULTS
    4.1. 从转换的MELs识别属性
    我们比较了提出的模型的三种变体:M1表示既没有注意模块也没有辨别目标训练的模型(β = γ = 0)。M2与M1相似,但β = γ = 1。最后M3是装有注意模块的模型。使用未转换的MELs作为输入,将M0服务器的性能作为分类结果的上限。结果如表1所示。

对于所有情况,数值越大表示性能越好。

结果表明:M2对MELs中的属性的识别精度均高于M1;这支持了我们的信念,包括鉴别目标有助于模型从输入中分离某些属性。第二,M2和M3的结果相似,但M2在歌手转换方面表现更好,而M3在声乐技巧转换方面略好。

第三,C-chunk和C-sequence两种转换策略在性能上没有显著差异。

第四,声乐技巧的转换比歌手身份的转换更具挑战性,转换后的准确率从90.68%下降到67.94%以下,尽管技巧的数量较少。
4.2. 可视化
我们在图2中可视化了一些转换的MELs的例子。
在这里插入图片描述

在上面的面板(a)中,可以清楚地看到整体音高水平的改变当在进行跨性别转换时。对于技术转换(b),我们可以看到,将唇颤音转换为,例如直音,使谱图不那么平坦。另一方面,我们可以装饰一个直音,把它转换成一个明亮和充满活力的发声,就像在直带转换中看到的那样,或转换成一个具有周期频率调制的直振音转换。当目标是唇颤音和喉音时,也可以观察到明显的效果。

尽管谱分布发生了变化,但所有源目标对的基音轮廓都保持不变。这暗示了模型执行多对多歌手身份识别和声乐技术转换的能力。

块级的转换使我们能够通过逐渐增加转换向量从0到dµ* n从源到目标进行变换。因此,我们可以,例如,转换一个直的音调,随着时间的推移逐渐表达另一种技巧。这在其他现有的SVC框架中还没有发现,我们将进一步的研究留给未来的研究。

  1. 相关工作
    最近深度学习的进展给VC带来了巨大的成功[18,19,20];另一方面,SVC直到最近才从中受益。提出了一种基于深度生成模型的SVC框架SINGAN[9],将源歌手的听觉特征映射到目标歌手的听觉特征;然而,该模型仅限于临时对齐的歌唱记录。相比之下,[5]提出了将可从非平行语料库中训练的SVC自动语音识别结合起来。然而,该模型只允许将少数源歌唱家转换为单个目标。最近,提出了一种包含域混淆网络[21]的编码器解码器模型来学习歌手不可知的特征[4]。

我们用一个原则性的概率生成模型来联合建模歌手和技术,并根据上述属性的时变潜变量来调节歌喉的生成,从而区分出自己的特点。

据我们所知,这是第一个用单一深度学习模型联合建模/转换歌手身份和声乐技巧的研究。

  1. 结论与未来工作
    我们提出了一个基于GMVAEs的灵活框架来解决歌手身份识别和声乐技术的非并行多对多SVC问题。音频样本可从https://reurl.cc/oD5vjQ获得。分析潜在变量的时间动态,以及适应歌手身份与声乐技术变量之间的依赖性,将是我们未来工作的重点。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sure, here is an example implementation in Java: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; public class Student { private String name; private ArrayList<String> hobbies; public Student(String name, ArrayList<String> hobbies) { this.name = name; this.hobbies = hobbies; } public String getName() { return name; } public ArrayList<String> getHobbies() { return hobbies; } public static void main(String[] args) { ArrayList<Student> students = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader("students.txt"))) { String line; while ((line = br.readLine()) != null) { String[] parts = line.split(","); String name = parts[0]; ArrayList<String> hobbies = new ArrayList<>(); for (int i = 1; i < parts.length; i++) { hobbies.add(parts[i]); } students.add(new Student(name, hobbies)); } } catch (IOException e) { System.err.format("IOException: %s%n", e); } Collections.sort(students, (s1, s2) -> s1.getName().compareTo(s2.getName())); for (Student student : students) { System.out.println(student.getName() + ": " + student.getHobbies()); } } } ``` This code reads the student data from a file called "students.txt" (in the same directory as the Java file), creates a `Student` object for each line, and stores them in an `ArrayList`. It then sorts the list by student name using a lambda expression, and finally prints out each student's name and hobbies using a `for` loop.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值