一位男中音歌手在唱歌。
但其实没有男中音,也没有歌手。“唱歌”的是一款名为《Synthesizer V》的歌声合成软件,演唱的声音来自名为青溯的深度神经网络(DNN)歌声数据库。
然而,让人惊讶的不仅仅是这位“歌手”媲美人声的表现力,还有她的性别:青溯其实是汉语普通话女声音源,她的声音本该是这样的:
这样的:
但在UP主GrogTony的手中,“她”不仅可以用男声演唱,甚至可以唱粤语:
粤语的男声是另一个名为Kevin的音源,不是“性转”青溯。不过从音源的名字你应该能看出来,Kevin其实是男声英语音源,录音给开发者训练模型的本人可能根本不会汉语。但是极具可塑性的深度神经网络还是让“他”成功学会了汉语,虽然还是有一些口音,但听起来和一个初学汉语的外国人差别真的不大。
我录了一段用《Synthesizer V》让青溯演唱《两只老虎》的视频:
演唱效果不是很完美,如果再加上亿点点细节上的调整,效果肯定会更好(虽然我不知道怎么调整)。但是,如此简单的一通拖放就能让虚拟歌手为你唱出一首完整的童谣,而且声音的真实度并不是特别差,这已经足够让人惊讶。
不过,最让我惊讶的,或者说最让我感动的,不仅仅是该软件极富表现力的音质,还有该软件的作者:
哔哩哔哩UP主sleepwalking(原名华侃如)是该软件的作者。他用七年向我们演绎了一个努力坚持并最终实现梦想的故事。
所以,当他最终选择在日本创立公司(基于商业上的考虑,因为日本的虚拟歌姬产业最发达)发售自己的软件时,公司的名称定为“Dreamtonics”(可译为“梦想音阶”)。
我决定要完成我的软件,然后用它翻唱一首《夕日坂》,
送给二言。
在这个开发进展视频中,作者讲述了他开发歌声合成软件的初衷。故事在视频的后半部分:
他成功了。
从2012到2018,从16岁到23岁,从Rocaloid、Synth V到Synthesizer V,从初中、高中、大学再到辍学,他终于完成了自己的歌声合成软件,实现了自己的梦想,并且合成质量业界领先。
现在,每个人都有机会用它演唱自己想要的歌曲,然后送给喜欢的人了。
转自:https://tieba.baidu.com/p/7390478977
作者:华侃如(英文)
译者:4dimer
【翻译&转载】华侃如的五日SynthV AI技术科普
今年2月20日,在Synthesizer V AI的新更新发布不久后,SynthV软件的编写者华侃如在他的推特账号上发布了一系列给非专业人士的相关技术科普,主要涉及如何优化加速神经网络的运行,以便SynthV AI版本可以流畅地运行在多样的设备上,完成高质量的歌声合成。
之前没有看到中文版本我想着要不要打算翻译一下,但拖了这么久才终于动手。其中华侃如老师关于溢出等许多概念的解释非常精准且深入浅出,如果对AI歌声合成的原理或编程、机器学习等相关话题感兴趣的话不妨一读。希望这个翻译没有做无用功。
考虑开一个长回复推文给非专业人士解释一下我们是如何在最近的Synthesizer V更新中对神经网络接口进行优化的。基本上算是昨天发布会直播的详细版本。有人感兴趣吗?
如果一句话总结Synthesizer V 1.2里我们做了什么,那就是:即时编译/量化/稀疏矩阵-向量乘法内核。别急,我知道这是一堆术语的堆叠。在此推文里我会把它分成一部分一部分地来解释。
由于本条可能会很长,我打算每天分开,集中处理一个话题。准备好了吗?
一个人工神经网络可以归结为一系列非常简单的代数运算,例如:a + b * x1 + c * x2 + ...
。但当你(有意地)把这些来上个几百万次,它们就可能被转变成极度复杂的机器。
我们合成声音时要做的,关键就是选取一些「魔法的」a、b、c,使其能最好地表现声音,然后把它们带入到方程中去;尽管这样的数字有千千万。这些a、b、c叫做参数。
每次都把这些方程写一遍实属麻烦,因此线性代数就派上用场。从一个有点过分简化的视角看,矩阵和向量只是用来表示大批量简单数学运算的符号,仅此而已。
其他一些神经网络模型主要由矩阵-矩阵乘法组成。对我们来说,瓶颈则是矩阵-向量乘法(MVM),这是某个用于产生波形采样的网络(名为「神经声编码」)所主要使用的运算。
这里我们面对的挑战不仅在于我们有一个很大的网络,更在于这个网络要以每秒上万次的频率运转,以便实时合成高品质的声音。这将会被分解为每秒几十亿次加法和乘法。
现代CPU以每秒几吉个周期的速度运行,这和上述的运算所需的频率近似在同一个数量级。然而,余裕太小了。并且事实上,不是所有的CPU周期都能做有用功(这一点后面还会提到)。非常有挑战性!
到此为止就完成了问题的建立。我们的目标是,让这种MVM运算在现代CPU上尽可能快地运行。大家歇歇脑子下条见。
今天将开始对我们的神经网络加速的第一步。首先说件幸运的事,在几百万个参数(那些a、b、c)中,一大部分都是多余的。
事实上你可以在不减损音质的情况下舍弃掉一大堆这些参数;其结果便是我们所称的「稀疏矩阵」(与之对应的,正如你所想,是紧密矩阵)。
当然也有许多参数是非常重要、不能舍弃的。如果你移除了过多的参数,那质量必然下降。合成的声音将会越来越像是从对讲机里发出来的,直至完全变成噪音。
所以,策略是小心地移除不太关键的参数,并尽可能多地移除而不伤害合成的质量。目前也有许多相关的小技巧(但超出了本次的讨论范围)。如果处理得好,我们能甩掉大概3/4的参数!
然而,把参数的数量减少4倍并不一定意味着我们立马获得4倍的运算速度提升。执行稀疏神经网络时,程序需要跳过被移除的参数。这一负责跳过的进程有时会增加相当多的额外的运算消耗。
关于如何将这些参数存储在计算机运存里,则有着许多更机智的方式,能减轻这些额外消耗。然而即使是最优化的情形,也很难达到完美的(参数的减少:运行速度)1:1的加速。Day 4的时候我们还将回到这一点上来。
今日总结。采用稀疏矩阵是一个压缩神经网络的有效方式。如果搞得好,它也还能将运算加速个几倍,尽管这需要高度优化的SpMVM代码。明天我们将讨论另一个加速MVM的方式:量化。
基于历史原因,整数运算比小数运算的速度快。不难看出一个小数需要被分成两部分存储,比如π~=3.1415926分成31415926和1,其中1代表小数点的位置(浮点数)。
对于浮点数加法、乘法等运算的支持需要更多的电路,因此早期的计算机处理数字运算比较困难,除非你把所有的数字都转换成整数,完成运算再转换回小数。这叫做定点数运算。
现代的CPU能够拥有几十亿的晶体管,因此在Intel和AMD的芯片上,浮点数和定点数的性能差别很大程度上成为了过去式。
然而,整数还是有一点优势。如果精度不重要,你可以只用两个字节来存储一个整型变量,相比之下一个单精度浮点数则需要4个字节(这是许多芯片所支持的标准)。
在许多芯片上这不仅仅能减少存储空间。如果单位时间内你能处理一个4字节的区段,那你也能在同样时间内处理两个2字节的区段。如果是4个4字节,则可以放大为8个2字节。带宽翻倍了!
这种并行处理的方式叫做单指令多数据(SIMD)。在x86平台上它最早在90年代由早期Pentium采纳。AMD也随后跟进。到2020年最新的CPU可以在一秒内进行数十亿次运算,每次处理16个4字节浮点型或者32个2字节整型再或者64个1字节整型。
所以SIMD和定点数运算很棒,但和神经网络有啥关系呢?实际上神经网络不需要过多的精度就能工作。大多数情况下,你甚至分别不出我们是否从4字节浮点型切换成了2字节整型。
在一些极端情形下我们甚至可以降退到1字节整型(意味着8个bit,或者说是红白机原生支持的那种)。甚至在我们可以察觉质量减损的情况中,也有办法通过重新训练低精度神经网络的方式来弥补不足。
不过定点数有一个问题:由于只有这么几个bit,能表示的数的范围就变得很有限。比方说如果你把一千个一加起来,你得到1000,这就不能放进一个1字节的整型里。
看看前面已经讲了不少了,休息一下,明天讲如何解决范围的问题以及这对于MVM性能的影响。
昨天说到用整型表示参数可以带来很好的加速,(如果不明白,建议从Day 1看起)。但我们有个范围的问题。
一个有符号的8-bit整型数据范围是从-128到127(一共256个数)但两个8-bit整型的乘法经常就会超出这个范围。比方说,40 * 40 = 1600
,比127可大多了。
甚至加法和减法也有这个问题。很明显如果你给127加上1,它就会超出可表示的最大值,更不用说如果你把一长串数加起来。
当加法或乘法的结果超出了范围时会发生什么呢?结果会重新转回到下限。比如127 + 1就得-128,而127 + 2得-127…是的,你会得到一个负数。
这叫做溢出。当溢出发生时,合成的声音就会像没调好的广播或是完全的噪音。有一个办法可以避免这种溢出:在做MVM前谨慎地将数值等比缩小以确保结果在范围内。
但即使有缩小,溢出也还是偶有发生,尤其是当用户扔进来一个开发时不常见或者很极端的数值。我们不希望看到一款产品时不时地故障。幸运地是我们还有一招:饱和算术运算。
有一部分CPU支持一些特殊的指令,可以改变算术的行为。回到127 + 1的例子,正常情况下会得-128,但在饱和运算条件下,结果会被封留在上限127。仍然不完美,但比变成负的强多了。
到目前为止我们已知,一些CPU可以以低精度完成定点数运算,这可以带来更高的处理容量。我们了解了定点数算术的问题,也找到了解决方法。
要解决溢出的问题就需要额外的代码来等比缩小参数,来做饱和运算,等等。就像是稀疏MVM的情况,额外的代码就会造成额外的运算消耗。所以,有必要使用定点数吗?嗯,这个比较复杂,也取决于到底用的是什么CPU。
比如说,在Intel这边,Sandy Bridge和Ivy Bridge处理器(i3/i5/i7 2xxx, 3xxx)可以在一个循环内做8个浮点型运算,但它们却不能做16个2字节的整型运算,直至下一代(Haswell,i3/i5/i7 4xxx)。
AMD处理器写明了自Excavator系列(如Athlon X4 845)开始有着同样的支持,但它们的实现方式不太优化,直到最近的Zen 2。尽管如果优化的足够好,它们甚至比Intel的定点数运算还要快。
我们目前已考察了两种手段:一是使用稀疏参数矩阵,二是将参数量化成为整型数据(若不理解术语,请从Day 1开始读)。
两种方法的相同点:都只做很小的合成质量牺牲,来换取大幅度的加速;同时由于要从普通的矩阵乘法进行变形,也必然会带来一些额外的运算消耗。
我们想要两者一起应用,以达成更高的提速。那将是一个所有参数都以小整数存储的稀疏矩阵。然而,这究竟能不能提速,还得看程序到底跑在什么硬件上。
之前提过,很旧很旧的老电脑在量化情形下跑得很好;2021年你手头上典型的“老电脑”可能没有量化反而跑得快;然后又然后,刚出炉的新设备量化之后性能更佳。
稀疏MVM是同样的情形,但这次还不是单纯的硬件。对于删减不足一半的不那么稀疏的矩阵,还不如把它们当作密集矩阵来处理。
纵使是对于那些非常稀疏的矩阵,我们也需要选择如何将数据存储在运存上,以及以何种顺序将它们加载至CPU还有如何处理它们。每种方式都有其优点和缺点,并会影响一些种类的稀疏矩阵。
Synthesizer V AI所使用的神经网络有许多不同大小。有些可以变形成稀疏的,有些则不行。我们的软件可以运行在自Pentium 4(2004)之后的所有x86处理器上。这些硬件搭配矩阵的类型和大小,有无数种排列组合。
我们该如何编程神经网络(或者精确说,MVM子程序)来支持所有这些情况?我们真的要写100个或者1000个版本?不。我们不写程序本身,我们写一个程序,让它去写另一个程序来做工。
更有趣的是——所有这些都在运行中完成。我们并不发出一个预构造(预编译)好的程序,让它包含所有的情形(程序将会大的离谱)。我们发出一个“程序构造器”,它接收一个神经网络,并生成运行神经网络的代码。
这儿的代码是什么呢?如果你了解编程,你或许知道C、C++和Fortran是性能最好的编程语言。比这些还快的就是汇编语言了,汇编会直接翻译成CPU可理解的一串0和1。
我们的程序构造器是用C写的。它首先扫描CPU支持的特性及它所接收的矩阵种类;然后它将0和1转存进内存并告诉CPU,“这儿有些新鲜出炉的代码,请运行它们!”
这个方法叫做即时(JIT)编译,也不是什么新东西了。同样的方法被用在现代网络浏览器里,来加速Javascript的运行。只是直到最近我们才发现它在机器学习方面的应用。
(给进阶读者)你可能想过FBGEMM。是的,就是它的灵感。我们的大概是一个GeMV/SpMV版本的FBGEMM,并添加了基于AsmJit的旧处理器的支持。
如果想试用这款软件,可以去这里下载基础版(我演示的是专业版,和基础版的表现可能不同):
https://zhuanlan.zhihu.com/p/399791677
直接下载地址:
https://resource.dreamtonics.com/download/
此外,这是Synthesizer V一代的官网,仅供参考,不是下文讨论的版本:https://dreamtonics.com/synthesizerv-gen1/zh-cn/
下文讨论的都是Synthesizer V二代。
其中:
Synthesizer V Studio%20Basic/latest/svstudio-basic-setup-latest.exe
是编辑器基础版。Voice Databases/chiyu-lite-install-100.svpk
是名为赤羽的汉语女声声库Lite版(基于音频片段拼接,拟真程度可能不如青溯)。Voice Databases/aiko-lite-install-100.svpk
是名为艾可的汉语女声声库Lite版(基于音频片段拼接,拟真程度可能不如青溯)。-ai-
的是基于深度学习模型的声库,不带-ai-
的是基于音频片段拼接的声库。不过Synthesizer V会使用深度学习模型进行拼接处理,所以结果的拟真程度依然优于同类软件,但没有带-ai-
的模型效果好。-ai-
的声库存储的是模型,不带-ai-
的声库存储的是一系列音频文件,所以带-ai-
的声库比不带-ai-
的同角色声库小很多。-ai-
声库。官网能下载的两个免费汉语声库都是基于音频拼接。-ai-
的版本可调节性比带-ai-
的版本更高。AI声库有自己的“天赋”和“极限”,并不总是受你控制。免费版使用限制:
如果想买这个软件的专业版,可以前往淘宝店:
https://dreamtonics-cn.taobao.com/
基础版和专业版都支持Windows/Linux/macOS,不过可能仅限x86。
注意声库和编辑器是分开卖的,编辑器不附带声库(除非购买套装)。
此外,该软件还可以加载第三方声库。
与“青溯”这样的第一方声库只有名字和声音不同,很多第三方声库都有“虚拟歌姬形象”和“人设”。
由平行四界发行的Synthesizer V兼容声库(可免费下载的赤羽Lite就是他们的作品):
https://item.taobao.com/item.htm?id=622045467110
里面也卖编辑器,和dreamtonics-cn卖的是一样的。注意声库不附带编辑器,如果不买编辑器,只能用基础版。不过基础版没有试用时间限制,可以一直用下去,只是不能创作商业作品,且发表作品时需要注明“使用基础版”。
上面那个贴出下载地址的知乎文章也有各种第三方声库的介绍。
附演示用的《两只老虎》工程文件(它是\0
结尾的JSON文件,你也可以用文本编辑器打开查看):
如果你没有青溯声库,可以点击这里切换(不同声库的音色和拟真度各不相同,此外有的不支持汉语):
上图中除青溯外,其他都是官网下载的免费Lite版声库。带AI的使用人工神经网络发声模型,不带AI的除了青溯都使用音频片段拼接。
从听感上来说,青溯的训练集音源可能是台湾腔。
所以模仿周杰伦很像(结尾有一段是青溯的男声演唱,通过在软件里调整性别参数实现。不过我简单试了试,调不出来这么自然的。看起来要实现“性转”还是有难度的)
此外,因为神经网络模型需要大量数据集进行训练,所以为青溯贡献音源的录音者可能不止一个。而青溯也只是这个训练好的模型的名称,不一定与特定的录音者具有一对一关系。
这与基于音频拼接的声库非常不同,音频拼接的声库与录音者往往具有一对一关系。
软件附带的“人工神经网络性能调整工具”
关于青溯不能彪高音,一唱高音声音就变小的问题,我找到一个重大线索,就在这个视频里:
https://www.bilibili.com/video/BV11f4y1u7Sw?t=3785
华侃如说:“音区偏移的更多一个作用是把假声和真声之间的切换点提高或降低。”
所以,只要把歌声面板里的音区偏移拉到-400音分,就能让高音变成真声,极大提高高音的音质(一个八度1200音分,相当于真声音域提高1/3个八度)。所以青溯的高音音质问题可能不是模型缺陷,只是开发者把默认的真假声转换音区设得太低了。
拉到-400后如果还想降低,可以用文本编辑器打开.svp文件(它是个以\0
结尾的JSON,删除\0
再格式化一下也能读取),搜索-400,直接修改为更低值(比如-1200,一个八度)。效果应该是有的,只是这样修改之后就不能再拉编辑器里的音区偏移滑块了,拉了就会再次变成-400。
除了滑块之外,拉参数里的音区偏移曲线还能再降低400音分,如果两者是相加关系,总计可降低800音分(真声音域提高2/3个八度)。
备注:Synthesizer V Studio Basic(基础版)没有音区偏移,看起来它是付费版的专属功能。
高音演示工程文件:大鱼-青溯-高音.zip(23.51 KB) 或 https://www.vsqx.top/project/vn5280
原唱:周深
扒谱:落雨
无参工程文件:https://www.vsqx.top/project/vn134
调教:老虎会游泳
歌声:青溯(版本号:130,P1音区偏移:-400,P2音区偏移:可能是-800)
编辑器:Synthesizer V Studio Pro(版本号:1.5.0)
旧观点:
当然,青溯这个模型也有自己的缺点,比如高音表现不佳(所以Synthesizer V也有传统的基于音频拼接的声库,没有类似缺陷,但音质更不像真人):
https://www.bilibili.com/video/BV19q4y1q782/
人工神经网络的第一个特点是:每个模型都不同。由同一个组织训练的、同一个程序加载的多个模型,可能具有完全不同的性能特征。因为人工神经网络模型中所包含的不仅是数据,还有程序,并且数据和程序是一个整体,是无数次训练的结果,无法单独修改其中一部分。
人工神经网络的第二个特点是:如果输入参数在训练时没有涉及到,很可能会产生意外结果,这和人类很类似,如果从未或者很少练习高音,突然要唱高音的话,要么声音小要么破音。而青溯这个模型很可能就有相同的缺陷。如果真的是模型本身的缺陷,开发者可能需要重新训练模型才能解决问题,至少需要为高音部分重新训练一个模型。
人工神经网络的第三个特点是:需要大量的数据集去训练。数据集越广泛、来源越丰富,性能就越优秀。所以,官方AI声库(可能并不是声“库”,里面可能没有任何声音文件,有的只是一个训练好的人工神经网络模型,这个模型可以按需产生声音)不见得只用了某个人的声音进行训练,而是很可能用了很多人的声音进行训练。
当然,也有可能真的只用了一个人的声音进行训练。那么如果这个人本身就不太能飙高音,训练集缺少高音数据,那训练出来的结果很可能也不能飙高音。
人工神经网络和人类很类似,有的天赋异禀,有的平平淡淡。开发者需要做的,就是制作一系列工具,不断尝试训练新的模型,发现好的,淘汰差的。然后,模型一旦选定并发布给用户,通常就无法再修改(发布给用户的软件并没有继续训练模型的能力),那它的“天赋”也就确定了。它会有和人类相似的优势,也会有和人类相似的缺点。比如,用人类歌声训练出来的模型可能大都无法演唱超高速曲目(比如《初音未来的消失》),因为那是训练数据集中从未有过的部分。除非再把人工调教的超高速曲目加入训练数据集,或者开发工具对吐字速度进行专门强化训练(不断挑选能更快吐字的模型),否则这些模型在超越人类语速方面通常都不会有好结果。
高音也是一样。如果一开始就没有对高音进行针对性训练,那么随便挑出来的一个模型如果高音优秀,是幸运——天赋异禀。而高音不佳则是通常会发生的情况,就像大多数的我们。
当然,问题并不是完全不能解决。只要不断增加训练数据、调整训练方法,总有一天能训练出各方面都很全面的模型。不过,这需要时间,有时候还需要运气。但是它最吸引人的一点在于,如果真的找到天赋异禀的模型,那么在某些条件下原本很差的性能就可以大幅度提升。而采用传统方法的话,算法一旦确定,要做出颠覆性的提升几无可能,但它的好处是简单可靠,不会一离开舒适区性能就急剧降低。
所以,用“不适合”来形容人工神经网络声库是非常确切的。人工神经网络声库比基于音频拼接的声库更像一个活生生的人,因为她不完全受你控制——她有她的个性,也有她的极限。只有开发者通过专业的工具对其进行重新训练,才能帮助其提升。
该软件的Linux版本有一个Bug,如果解压出来的license
文件夹没有写入权限,在你输入激活码之后,软件会提示激活成功,但是实际上激活没有成功,界面无响应,关闭后又再次提示输入激活码。
如果你的根文件系统是一次性的(比如在容器内运行,做成snapd打包等),这个问题就可能会吃掉你的激活次数。反复创建容器重试3次后激活码就失效了。而且如果提示激活成功的旧容器已销毁,就没有取消激活的机会。
所以我现在正在发邮件联系客服。
对华侃如的采访:
非常适合作为 Synthesizer V 新手教程的直播录像:
从18分钟开始是B站UP主某只泽的歌曲调教实操演示,我看完真是受益良多,果然是看文档一百遍不如看大神操作一遍。
视频链接
9分30秒的时候华侃如说:“其实泽老师参加了很多 Synthesizer V 声库的开发。还有参加了我们AI引擎的一些开发中的反馈。”
30分钟的时候华侃如说:“某种意义上来说这是泽老师加泽老师的AI。”
所以视频中介绍的“修饰选择的音符”功能很可能有某只泽的歌曲调教记录参与训练。训练方法可以是:把调教前的文件交给AI处理,然后和某只泽调教后的文件进行对比,越接近得分越高。