最近打开B站,首页会推荐很多以【AI 孙燕姿】开头的视频,内容是用孙燕姿的音色去唱其他歌手的歌。出于好(ceng)奇(re)心(du),作者去了解下歌声转换(Singing Voice Conversion,SVC)这个任务。不看不知道,一看吓一跳,SVC这个任务居然还有专门的比赛[2],并且已经举办了好几届,但是前面几届赛道都是声音转换(Voice Conversion,VC),今年是第一届歌声转换。SVCC2023的比赛分为两个赛道,分别是域内的歌声转换和跨域的歌声转换,但遗憾的是目前已经结束提交了,将在6月份公布结果,并在7月份提交workshop论文,举办方也在积极推进workshop的举办,计划在8~9月份举行。

当然今天的重点并不是聊这个比赛,我们看下SVC这个任务的技术原理。首先说明本文只是简单的介绍,并不会深入地去解析算法原理,感兴趣的同学可以根据本文的参考文献自行学习。SVC是VC的子任务,因此我们先从VC开始介绍。

VITS

语音转换,也被称为声音转换或语音变换,是一种用于改变人的语音特征的技术,同时保留语言内容和说话者的身份。它涉及修改源说话者的声音特性,使其听起来像目标说话者的声音。语音转换的目标是将源说话者的声音的各个方面进行转换,如基频(音高)、频谱包络(声道特征)和韵律特征(节奏、语调和重音),以使其与目标说话者的特征相匹配。这样,源说话者的声音就能够采用目标说话者的特征,而不改变语言内容。

最开始人们通过信号处理的方式进行语音转换,主要是通过基音和速度对语音信息进行建模,然后通过PSOLA对语音基音或者速度进行修改从而达到变声的效果,详细内容可以参考本公众号的这篇文章。但是这种修改只能简单地调高/调低音调,并不能达到生成指定说话人音色的目的。随着深度学习的兴起,许多人开始尝试使用神经网络强大的特征提取能力对语音信息进行建模。早期的语音转换分为三个部分,分别是语音分析、特征映射和语音重建。随着韩国科学院在ICML 2021发布VITS(VITS: Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech)论文和代码,语音转换进入了端到端的时代。VITS本身是用于语音合成任务,但语音合成和语音转换具有相似的结构,或者可以说语音转换网络是利用了语言信息的语音合成网络。

VITS的主体是一个条件VAE模型,包含了prior encoder,posterior encoder,decoder,discriminator和stochastic duration predictor。其中posterior encoder和discriminator只在训练中使用。VITS采用了和Fastspeech系统相同的transformer作为文本Encoder,与Glow-TTS相同的Flow结构作为VAE的主体以及和HiFiGAN生成器相同的反卷积作为Decoder,此外还采用Glow-TTS相同的单调对齐搜索算法(MAS), 保证生成对齐的稳定性。在推理时,输入的phoneme透过prior encoder得到隐变量z,然后z通过decoder生成原始波形。VITS整体训练和推理流程如下所示:

Singing Voice Conversion

上面介绍了端到端的语音合成网络VITS,我们接下来看下如何使用VITS进行歌声转换。这里我们以SoVITS[9]为例进行讲解,网上搜了一圈都是介绍如何应用的,原理性的讲解比较少。总的来说,SoVITS在VITS的基础上,将解码器改为NSF-HiFiGAN,输入改为ContentVec,在推理时对ContentVec预测和pitch decoder的输出进行聚类,以减少输入语音泄漏,并在原始网络之前增加了Conv1d。

SoVITS输入改自SoftVC,原始SoftVC论文中的encoder有两种,如下图所示,其中第一种是离散内容编码器,它首先提取特征,然后通过聚类的方法生成一系列离散的语音单元;另一种是软内容编码器,它不使用聚类的方法而是训练一个网络去预测离线语音单元,去除了不必要的说话人信息,因此更适合语音转换这个任务,这也是SoVITS中采用softcontent encoder的原因。

此外,由于是歌声转换任务,作者将f0显式的引入到了vits中以便更好的对歌声信息进行建模,这点我们可以从作者代码中获得。最后作者将声码器改为NSF-HiFiGAN以解决声音中断的问题。在推理过程中,只需说话人信息和音频信息,其中音频信息会首先计算f0,然后将说话人信号,音频信号和f0一起送到encoder,随后encoder的输出经过flow和NSF-HiFiGAN生成最终的结果,其完整流程如下所示:


参考文献:

[1].https://www.zhihu.com/question/599898172/answer/3019724022

[2]. http://www.vc-challenge.org/

[3].https://zhuanlan.zhihu.com/p/474601997

[4].https://github.com/jaywalnut310/vits

[5].https://arxiv.org/pdf/2106.06103.pdf

[6].https://blog.csdn.net/Terry_ZzZzZz/article/details/120458064

[7].https://zhuanlan.zhihu.com/p/422463115

[8].https://arxiv.org/pdf/2008.03648.pdf

[9].https://github.com/voicepaw/so-vits-svc-fork/tree/main

[10].https://zhuanlan.zhihu.com/p/628118728

[11].https://ieeexplore.ieee.org/abstract/document/9746484

[12].https://blog.csdn.net/zephyr_wang/article/details/127923998