AI 翻唱的声音是怎么换出来的
刷到 AI 孙燕姿翻唱以后,我也想试试:让林俊杰的声音唱《知我》。用的是 RVC,一个把人声换成另一种音色的工具。没找到合用的现成模型,就准备自己训练。
歌和素材都弄好了,真正开始训练才发现慢得离谱。最后没有做出翻唱。
歌已经唱好了,要换的是声音
做这类翻唱,要准备两份不同的人声。林俊杰的录音用来训练目标音色;《知我》原来的人声用来转换。后者已经带着歌词、旋律、停顿和拖长的音,不需要再让模型从歌词开始写一首歌。
比如原唱把一个字唱了两秒,转换时处理的就是这两秒声音。换了音色,原来那段演唱的节奏和咬字仍会影响结果。听着像某个歌手,不代表那个歌手真的会这样唱。
整首歌还要先把人声与伴奏分开。模型转换人声以后,再把新的人声和原来的伴奏混在一起。伴奏留在这一步,训练和换声用的都应是尽量干净的人声。
图里用位置不变、颜色改变的音符表示换音色,是原理示意。
先把录音变成训练数据
我当时的笔记记的是四首歌,合起来约十八分钟。这里得区分歌曲时长和可用的人声时长:前奏、间奏里没有人在唱,分离后的音轨也可能留下乐器或别人的和声。十八分钟的歌曲,不等于十八分钟干净的目标声音。
RVC 的官方说明 (opens in a new tab)建议使用低噪声录音。凑够时长只是准备素材的一部分,人声分离也不会自动把录音变干净。
接下来才是训练页里的数据处理。选定训练音频目录和输出采样率后,RVC 会读取音频、切成短片段,并保存训练用的音频。它还会另存一份 16 kHz 的音频,供后面的声音特征提取使用。这两份文件来自同一段声音,用途不同;不是把原始文件改个扩展名就行了。预处理代码 (opens in a new tab)里能看到切分、音量处理和重采样的过程。
随后要把声音变成模型能处理的数字。HuBERT 用来提取声音特征;启用音高引导时,还要提取 F0,也就是每一刻声音的基频。可以先把它理解成音调高低的变化:唱同一个字,唱高一点和低一点,音色转换时仍要知道它原来在哪个音上。特征提取 (opens in a new tab)和音高提取 (opens in a new tab)是两个处理步骤。
模型和检索索引各做一件事
有了音频片段和对应的特征,才能开始训练。RVC 的训练页会把这些文件配在一起,再按选择的模型版本、采样率、是否使用音高等设置启动训练。预训练权重也要和这些设置匹配。界面里的总轮数决定反复训练多少轮,batch size 决定每次送入多少条数据。官方 WebUI (opens in a new tab)把数据处理、特征提取和模型训练分开了。
一轮,也叫一个 epoch,大致就是把训练数据过一遍,再根据误差调整模型。150 轮是在同一批素材上反复训练,不是多找了 150 份声音。轮数能决定要跑多久,不能只凭它判断声音有多像。训练代码 (opens in a new tab)里,epoch 循环和每轮读取训练数据的循环是分开的。
RVC 还有一个检索索引。训练出的模型保存为 .pth,索引则是 .index:它把训练素材的声音特征组织起来,供换声时查找相近特征。模型负责生成声音,检索提供目标声音的特征参考。它们不是同一个文件,建立索引也不是再把模型训练一遍。索引代码 (opens in a new tab)用的是前面提取好的特征。
到了换声阶段,才轮到《知我》的人声:提取它的特征和音高,交给目标音色模型转换,再和伴奏合起来。这是使用模型生成结果,和前面为林俊杰的声音训练模型,是两段不同的计算。
弄好了,才发现还要等很久
我停在了训练这一步。当时记下的是 CPU 每轮五到六分钟,计划跑 150 轮。我问了 ChatGPT 还要多久;按这个速度把全部轮数算完,大约十二个半到十五小时。这是当时的估计,没有真的跑完,也不是 RVC 换一首歌就要这么久。
时间还只是一个问题。模型练出来到底像不像,我也不知道。训练环境、素材和中间文件又很占磁盘,等这么久,还不确定最后能听到什么,瞬间就下头了。
算了,不等了。这次没有完成模型,也没有翻唱成品。
评论