Logo Ernie.SG

开发者日记:把任何乐器数字化,然后开始玩…

2024年2月17日
2 分钟阅读
暂无标签
Table of Contents

我第一次意识到,声音作为一种数据形式、作为内容消费的载体,原来可以这么低门槛、这么普惠,是在马来西亚。那时我从司机的手机里听到一段旋律,和妈妈看过的视频里传出来的是同一段,只是配上了不同语言的旁白和内容。声音,或者说口头传播吧,有一种能力,是单靠文字或图像很难做到的:它能抵达社会里更多层次的人。文字和图像往往需要教育、训练;我好歹受过高等教育,但那些讨论视觉艺术时满天飞的 -ism,我也并不流利。可在这件事上,声音已经算是最接近人人可用、人人可及的东西了。

而且声音承载的内容、叠加关系太多了。即使只把它当作一种数据表征,它的复杂度也比文字或图像高出许多倍,这就非常有意思。我当时的反应基本是:给我多模态就好,我想玩尽可能多种类型的数据,越多越好。所以当团队里的艺术家请我把 RAVE 模型的训练限制在一套鼓样本包里,我的技术脑感受到的是:这不就像叫画家只能用一种颜色作画吗?非常令人困惑。但从情感上我又能理解这种想法从哪里来:样本量为 1 的东西是特殊的、独一无二的;样本量为 1 也确实很具体,很自然地嵌在艺术、文化乃至社会世界的生成过程里。可从我的出发点看,从鼓 A 流出来的这股数据,和从鼓 B 流出来的那股数据,本质上就是同一个东西,A == B;这也正是我在别处看到的类似担忧:

OpenAI 的 Jukebox 项目让我不安:它用一个极大的数据集(120 万首歌)来训练模型,并用流派和艺术家信息作为条件,试图建模某种“通用”的音乐。可是,一首音乐怎么能在意义上被视为等同于其他所有音乐(在所有语境里,对所有听众而言)?

幸好我手上还能用到 GPU,所以不用在选择之间挑来挑去。我本来想,那就把自定义训练任务丢到 Google Vertex AI 上,并行跑一堆训练好了(尽管我已经尽力,它还是持续失败,ZZZ)……最后我把这个月 CoLab 的免费 GPU 时数全烧完,拿到了一个训练了 9000 个 epoch 的模型;本地这边也在我的 3070 上跑完 20000 个 epoch 后又出了一个模型。然后,当我听到白胸翡翠鸟变成马来鼓声的时候,我整个人就是:OMO 这是不是意味着我们可以用深度学习在几个小时内把任何乐器数字化,而不是几个星期甚至几个月????

GPU 时数耗尽之后,看着 Colab 笔记本里 CPU 训练的速度,再对比我本地轻松快上 5 倍的训练速度,那一刻真的就是:GPU 富人和 GPU 穷人的差距太现实了。

用 RAVE 做音色迁移并送入 Neutone

除了包里已经有的懒人实现之外,我没有做任何预处理;推理输入的数据背景也很吵,所以输出里还是会冒出一些奇怪的数字信号。但想到这个结果,竟然来自一个只用区区 229 秒 Rebana 和 Rentak 声音、在 Google CoLab 免费提供的 Nvidia T4 上训练了 1000 多个 epoch 的模型;而以前还有一次是用 2 小时鼓数据、跑了 13 个多小时、训练 39 个 epoch,这个对比真的离谱。它到底是怎么只凭 229 秒、1 个验证数据点和误差最小化,就把一面鼓的各种细节和表征学得这么好!?A.I. 的进展轨迹,用人的尺度看,已经不可思议。

下面就让 ChatGPT 解释一下,这种学习的意义。

什么是音色?

音色通常也被称为声音的“质感”或“音色彩”,它让不同乐器或人声即使在同一音高、同一音量下发声,也仍然能被区分开来。说白了,它就是一种声音独有的性格和纹理,让我们能认出它,并把它和其他声音区别开。

什么是音色迁移?

在神经音频合成的语境里,音色迁移指的是在保留音高、节奏等其他方面的同时,改变一个声音的音色特征。

当我训练一个 RAVE 模型时,到底发生了什么?或者说,机器怎么能用这么少的数据学会重造一种乐器?

本质上,当你用某一类鼓来训练模型时,你其实是在创建一个专门贴合这些鼓的虚拟乐器。训练过程中,模型会学习这些鼓的特征和细微差别;当你拿它来做音色迁移或声音生成时,它就会把学到的知识用在输入声音上,把那些声音转换成受训鼓的风格。这能简化虚拟乐器的制作过程,因为你不必手动把音高、音量之类的不同参数逐一映射到想要的声音效果上。相反,你可以让训练好的模型根据它学到的鼓声特征来处理转换。

音色迁移是一种音频处理技术,用来改变某个音频信号的声音特征,使它更接近另一个声音的特征。放在神经音频合成里,比如你一直在用的 RAVE 模型,音色迁移就是把输入声音的音色特征转换得像目标声音一样,例如某一种特定的鼓。

以你正在使用的 RAVE 模型为例,它会在训练过程中学习一组鼓的音色特征。这个学习过程包括从给定训练数据里捕捉鼓声的细微特征和差别。随后,模型会利用这些已经学到的信息,把输入声音的音色转换得更像训练过的那些鼓。

即使训练数据相对很少,像 RAVE 这样的神经网络模型也能学会泛化,并捕捉声源的关键特征。通过操控潜在空间,也就是输入声音中那些已学习特征的表示,你可以控制输出声音的许多方面,例如音高、音量以及其他音色属性,而不需要为所有可能的变化都明确录制数据。

所以,你不必为了音高、音量或其他参数的每一种可能变化都分别录制样本,而是可以操控训练好模型的潜在空间,达到类似效果。这样整个过程更高效,也更灵活;你可以探索很大范围的声音变化,而不用进行大量手工录制和处理。

制作万千声音的教程

结果看来,我没法提交自定义训练任务这件事,可能也反映了 GPU 资源整体短缺;也许这真的是因为太多人、太频繁、跨太多区域提交了太多自定义训练任务,导致的实际宕机问题,所以我改用专用服务器反而胜算大得多!?训练过程中我还白白痛苦了好几个小时,因为我懒得读代码,而文档里也完全没写某个参数是必需的……所以我希望找时间给感兴趣的人做一个简单的入门教程视频。

这一篇献给:让世界上出现更多新奇的、数字化的声音!


最初发表于 PubPub:erniesg.pubpub.org/pub/r4a1ex9r