填词绘谱,虚拟偶像,即刻出道

Your browser does not support the audio element.

(🔈欢迎呐,来到AI造梦堂)

(串场了,这儿可不是AI造梦堂系列)

乍一听,这歌声的旋律有点耳熟。

哈,其实就是著名的空耳神曲《我在东北玩泥巴》填了下词再由AI演唱出来。

若是没人说,笔者试玩时初见印象还以为这就是真实人声歌唱。

这其中的换气声甚至让笔者一阵恍惚。

传统的虚拟歌姬如初音未来、洛天依,创作者们创作出的歌曲都有明显的不自然,但同样能够创作出美妙的歌曲。

这种特殊的机械音区别于真人的独特性也赢得了不少粉丝。

但虚拟歌姬的道路不会停下。

前阵子听闻ACE Studio推出了洛天依AI,能让洛天依唱出的歌声更接近人类发声,这种效果正好让在语音领域有所涉足的笔者将目光投射过来。

一番翻阅后,笔者发现了开放权重的DiffSinger,通过一个歌手的歌唱数据集训练而成的AI歌唱模型。

玩耍过后,笔者决定深入学习一番,便折腾了好些天,终于把这款歌唱AI做成了推理版本,分享给大家。

AI元宇宙敲门砖【3.2】:太好听了吧,和AI一起唱,一起做虚拟偶像

在元宇宙中用AI微调出的自己的专属嗓音进行发声后(关于微调StarGANv2 VC的项目已经鸽掉了[doge]),加上先前所说提及的三维人脸拟合方案,你的在元宇宙中的人物形象也开始愈渐成型。

心血来潮,在元宇宙中想高歌一曲,却又满心羞涩,更是担心万一跑调了可就丢大脸了。

为了构建自己的完美人设,AI变声器已经不够用了。

更何况,AI变声器的训练数据通常不包含歌声。

于是,一个需求就呼之欲出了,能帮你唱歌的AI唱歌模型。

DiffSinger就是笔者前段时间观测到的AI唱歌模型SOTA.

那就用这DiffSinger来代你发声。歌词+曲谱,不怕跑调,虚拟歌姬即刻出道。

一、原理

本项目使用DiffSinger进行歌声合唱,非学术的说法,即AI驱动的虚拟歌姬。

TTS

TTS是Text To Speech的缩写,即“从文本到语音”,通过算法让机器发出人声。传统的TTS研究在很多年之前就已经开始。随着深度学习的发展,深度学习的方法也加入了文字转语音的赛道。

SVS

SVS是Singing Voice Synthesis的缩写,即“歌声生成”,本质与TTS没有大的区别,一般只是将输入在原先的文字基础上增加了声调以及节奏等辅助信息。相比与TTS,SVS更具娱乐性,所以实际需求量远小于TTS,属于不太热门的研究领域。

FastSpeech2

一种快速的、端到端的文字转梅尔倒谱模型,基本结构块是当下热门的Transformer层,分为编码和解码的两大块Transformer模型主体,在PaddleSpeech中有实现。

Denoising Diffusion Probabilistic Model

Denoising Diffusion Probabilistic Model 是一个参数化的马尔科夫链,使用variational推断进行训练。用不太专业的术语来讲,就是训练一个能给图像加噪并能从噪声中去噪出图像的模型。是时下相当热门的深度学习方法。此类模型在Paddle上的基础训练代码,笔者在一两年前进行了实现,欢迎大家Fork:项目主页

音频的预处理

音频存储下来是每个时间点声波不同的振幅,因为现实中的声音是很多声波叠在一起的,所以存储下来的数据单看是不规律的,需要使用短时傅里叶变换将一小段时间内的时域转换为频域,而频域是可以无限大的,我们只取人耳可以辨别的80块,这80块组成的频谱被称为梅尔谱,通过Log处理,再将梅尔谱转换为梅尔倒谱,这个转换使得人声能更多地分布在频谱上,而不是挤在高频率区域。

梅尔倒谱便是声音处理的一般输入输出。

声码器 (Vocoder)

但是声音处理到梅尔倒谱时已经丢失了很多信息,所以需要声码器将梅尔倒谱转换为波形,使重建的波形更自然。常见的声码器有WaveGAN,MelGAN, HifiGAN,Parallel WaveGAN,这些在PaddleSpeech中都有集成。

二、论文简介

DiffSinger: Singing Voice Synthesis via Shallow Diffusion Mechanism

歌声合成(SVS)系统是为了合成高质量和有表现力的歌声而建立的,其中声学模型会在给定的乐谱上生成声学特征(通常是梅尔倒谱)。以前的歌唱声学模型采用简单的损失(如L1损失和L2损失)或GAN(生成式对抗网络)来重建声学特征,而它们分别存在过度平滑和不稳定的训练问题,这阻碍了合成歌声的自然度。

这篇论文中的DiffSinger模型是一个基于扩散概率模型的SVS声学模型。DiffSinger也是一个马尔科夫链参数模型,它根据乐谱一步步地将噪声转换为梅尔频谱。通过隐式地优化变分边界,DiffSinger可以稳定地训练并产生真实的输出。为了进一步提高语音质量和加快推理速度,论文作者引入了一个浅层扩散机制,以更好地利用通过之前简单损失学到的先验知识。

具体来说,DiffSinger根据真实梅尔频谱的扩散轨迹和简单梅尔频谱解码器预测的扩散轨迹的交点,以小于原始的总扩散步数的浅层步数开始生成。此外,论文提出了边界预测方法来定位交点,并自适应地确定浅层步骤。

三、论文细节

扩散模型

因为DiffSinger区别于其它歌声模型,多了一个扩散模型的结构,故再介绍一下扩散模型。

扩散模型分为两个过程:扩散过程和反向过程。

扩散过程

扩散过程是一个具有固定参数的马尔科夫链,在每一步都向数据中添加微小的高斯噪声,最终将原始数据逐渐转换为高斯分布。

反向过程

反向过程是具有可学习参数的马尔科夫链,是扩散过程的反过程,从高斯白噪声中恢复原始数据。

模型细节

DiffSinger是建立在扩散模型上的。由于SVS任务对条件分布p(M0|x)进行建模(其中M是梅尔频谱,x是与M相对应的音乐分数),论文在反向过程中把x作为条件添加到扩散降噪器。论文提出了一个新颖的浅层扩散机制,以提高模型的性能和效率;并且论文还提出了边界预测网络,它可以自适应地找到浅层扩散机制中需要的相交的边界。

工作流程

在训练过程中,DiffSinger根据时间步t,乐谱x和第t步的梅尔频谱Mt,来预测随机噪声。

在推理时,从服从N(0, 1)分布的高斯噪声开始,一步一步进行去噪。去噪分为两步:1) 使用降噪器预测随机噪声。2) 根据预测的随机噪声,从Mt推断出Mt-1

浅层扩散机制

虽然之前由简单损失函数训练的声学模型有模糊和过度平滑的缺点,但它仍然产生了与真实数据分布有很强联系的样本,这可以为DiffSinger提供大量的先验知识。

为了探索这种联系并找到更好地利用先验知识的方法,论文作者利用扩散过程进行了经验性的观察:

1)当t=0时,M在相邻的谐波之间有丰富的细节,这可以影响合成歌声的自然度,但M~是过度平滑的

2)随着t的增加,两个过程的样本变得无法区分。

通过观察,论文作者提出了这样的猜想:当扩散步骤足够大时,从M~流形到高斯噪声流形的轨迹和从M到高斯噪声流形的轨迹相交。受这一观察的启发,论文作者提出了浅层扩散机制:不是从高斯白噪声开始,而是从下图图中所示的两个轨迹的交点开始反向过程。

因此,反向过程的计算开销可以得到明显的缓解。具体来说,在推理阶段,

  • 利用一个辅助解码器来生成M~,该解码器是以乐谱编码器的输出为条件用L1训练的。

  • 通过扩散过程在一个较小的时间步k生成中间样本。

  • 从两轨迹相交处的Mk~梅尔频谱开始,进行k轮降噪。

四、 个人理解

就笔者个人看来,DiffSinger更偏向搭积木式的方法,把几个现行优秀的模型结合在一起,FastSpeech2将歌词和曲调粗略地转换为潜在特征,作为条件输入扩散模型,扩散模型在多步去噪过程后生成了梅尔频谱,使用声码器HifiGAN将梅尔频谱转换为波形数组,导出为波形文件。

而论文作者比较创新的地方,是提出了浅层扩散机制,使得扩散模型不需要对相当无规律的高斯模型进行去噪,从而能够缓解计算开销,再结合轻量的FastSpeech2和HifiGAN,整个模型即使在CPU上也能运行得相当快速。

五、推理演示

演示基于notebook的ipywidgets插件和onnxruntime,笔者未能成功将模型转换到paddlepaddle上,原repo很复杂,而x2paddle的onnx2paddle完全不能用,所以只做了onnx演示版本。DiffSinger的核心模块在PaddleSpeech和我之前的DDPM项目中有提供,如果大家有兴趣的话,可以考虑复现一个Paddle版本的DiffSinger。

1. 安装运行环境

!rm -rf DiffSinger-ONNX-Inference/model
!ln -sf /home/aistudio/data/data170207 /home/aistudio/DiffSinger-ONNX-Inference/model
%cd /home/aistudio/DiffSinger-ONNX-Inference
%pip install -r requirements.txt

请在以上操作后刷新网页并重新运行内核,以确保ipywidgets能正确加载

2. 读取配置,加载模型

%cd /home/aistudio/DiffSinger-ONNX-Inference
import yaml
from ipy import IPyWidgetInfer

ipy_config = yaml.safe_load(open('settings.yaml'))
ipy_infer = IPyWidgetInfer(**ipy_config)

3.显示可交互界面(基于ipywidgets)

界面中提供了几个样例列表,可点击填到输入中,也可以自己修改一些参数,应保持input_text(歌词)、input_note(声调)、input_duration(持续时长)的长度一致。点击submit按钮进行歌声生成。

ipy_infer.run()

结语

这个歌声生成的效果真的很棒,可惜训练数据是单人的,而且申请也比较麻烦。也许之后可以考虑迁移训练,到时候才有可能定制自己的专属歌姬。

这次的项目提供的是onnx版本推理,Paddle端的推理和训练可能会耗费很多时间,笔者暂时没有心力去操作。

最近扩散模型也是越来越热门了呀,就是这模型推理时间会久一点,虽然DiffSinger的浅层扩散提高了不少速度,但是像语音之类的对实时性要求会高一些,DiffSpeech的姊妹项目效果也很好,但也同DiffSinger一样的龟速,tts和svs直接运用在虚拟世界的实时通信中难度可能会很大。不过作为npc的发声器官应该很不错。

最后,对于音频处理相关的深度学习话题感兴趣的同学可以加入到我的音频处理交流群来:630835331 艾梦的声动小群,更多领域的讨论可以加入我的QQ频道

也欢迎大家给我的Github点星星哦。

参考资料

【1】百度百科

【2】CSDN

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐