学得会音色,学不会说话
停更的两个月 · 第 3 篇,共 4 篇
如果你是按顺序读下来的:第一篇讲我停更去画画,第二篇讲那本书其实还不完全是那本书。这一篇讲七月里我说已经能用的另一半:声音。角色们都有了自己的嗓子,一回一回也都能念出来了。剩下的问题是,念这本书的那个人,能不能是我。
这件事我七月就明说过:用我自己的声音,把这些小说念给我的孩子听,就是这个项目的起点。书里那些将军的声音是编出来的,听着像编出来的也无妨。可旁白不一样,旁白应该是那个坐在床边讲故事的人。
所以我想靠微调(fine-tune)把旁白变成我。做完之后,我又量了一下,这番功夫到底换来了什么。
先说结论,后面讲的是我怎么一步步走到这个结论的。
拿一段我本人的真实录音做参考,零样本(zero-shot)生成出来的声音,本来就已经像我了。今天用的就是这条路:我对着麦克风念几句,这段录音就是参考音,模型照着它的声音把一整回念出来,不需要额外训练。我一听就认出了自己。
有一阵子旁白听着不像我,原因并不是少了一次微调,而是参考音是假的:那是一段由声音设计模型合成出来的片段,采样率只有 16 kHz,比语音模型自己输出的还低。换成我真实的录音,问题基本就消失了。我原本正准备靠训练,去摆脱一段从来就不是我的录音。
可我还是训练了。一来”基本像”不等于”就是我说话的样子”,二来我也想知道,天花板到底在哪儿。
六分钟的单句录音,教得会模型你的音色,教不会它你怎么说话。
我手上一共是 45 条短录音,加起来 6.2 分钟。为此我专门做了一个录音页面,一次念一句,存下来,再念下一句。拿这种方式读书,实在是件苦差事;现在回头看,拿它来给一个要念整本书的人准备训练数据,也一样不对路。
我前后训了三个适配器(adapter)。超参数我就不一一讲了,有用的是三次都出现的那个规律。
适配器每次都能学会”说话的是谁”。语速正常、音量正常的时候,听起来确实像我,大体上像。可是在同一段生成的语音里,音量和音高会一路往上爬,一句比一句响,一句比一句高,好像说书的人突然觉得故事到了最激动的地方。到下一段,它又一下子落回去,再从头往上爬。爬得太高的时候,就完全出了我的音域,听着像换了一个人。
不带适配器的基础模型正好相反:一句话说下来,声音会稍稍往下走,人真正说话本来就是这样。问题出在我那 45 条录音的音量高低差了将近 16 dB,微调就让模型以为,音量是可以随便变的。于是我把训练音频的音量统一了一遍。结果有些片段一下就好了,有些几乎没变化,音高往上蹿的毛病也基本没改。
我还走了不少弯路,才学会一件事:这种问题,不能拿八句话的小样来判断。小样预测的改善,是后来整回实际效果的两倍。唯一算数的检验,是真的生成一整回,从头听到尾。这很慢,所以我老想拿小样抄近路,也所以我老是判断错。
第一个问题底下,还藏着第二个问题。一句一句单独录,念出来的是一种朗读单句的腔调:每句重新起调,每个字都咬得很重,句号那里干干净净地收住,句句如此。背单词卡片是这么念的,可给孩子讲故事不是这样讲的,一整回书听起来也不是这样的。所以就算这 6.2 分钟音量完全一致、音色完全到位,它教给模型的也是错的那种说话方式。这批录音不光是太少,形状也不对。
我不再去调那些参数了。
这一点我要固执一些,因为”再跑一次”的诱惑永远都在。
秩(rank)、学习率、适配器挂在模型的哪几部分、推理时开多大,这些我都有数据,也都记下来了。可它们都不是真正卡住我的地方。卡住我的是那六分钟。再拿这批录音训一个星期,只会得到又一个”没激动之前挺像我”的适配器。这样的适配器我已经有了,不需要第四个。
所以我把”让录音变多”的工具做好了,然后,并没有去录。
现在录音页面可以直接给我一整段小说原文里的叙述,大概一分钟左右的朗读量,我一口气念完,句与句之间停一下。程序再把这一整段录音切回一句一句的训练数据。这一步叫强制对齐(forced alignment),不是语音转文字:字是什么、顺序是什么,我本来就知道,要找的只是每一句落在录音的哪个位置。为了验证这个切分,我把原来那 45 条录音首尾拼成一段假的长录音,每一句的边界都是已知的,这样就不用拿一段没法核对的演示来相信它。结果它采纳的每一刀,离真实边界都在 306 毫秒以内,中位数 13 毫秒。它自己拿不准的那些,它直接扔掉,而不是去猜。
剩下的,就是我坐下来,对着麦克风,念完大约 32 分钟的段落。
这一步我还没做。八月中旬我把这件事停了下来,转去画画,而画到现在也还没画完。今天要是做一段演示,你听到的旁白就是零样本的那个版本,它本来就已经像我,所以先停在这里并不误事,也没有什么好掩饰的。适配器是可选的,默认是关着的。挡在我的孩子和我的声音之间的,从来都不是微调,而是一段真实的录音。一批更多的录音要跨过的是另一道坎:从”声音像我”,到”说话像我”。
这一课我记下了,留给下一次我又想靠训练去解决一种感觉的时候。
先摸清上限在哪儿,再去修修补补。如果毛病本来就长在数据里,同样的数据加得越多,毛病也跟着一起放大。如果数据的形状不对,换一个更好的优化器,只会更有效率地把错的东西教会。而如果再往前一步需要的是人亲自去做的事,那流水线上做多少工作都替代不了。录音棚可以搭,录音只能我自己去录。
第一回现在已经是用我自己的声音在念了,就是零样本的那个版本。我一边跟那些画较劲,一边听着它。(其余 119 回是旁白还用合成参考音的时候生成的,之后都得重新生成一遍。)七月里说的那部分是真的,只不过,并没有像”开始微调”这件事暗示的那样,已经做完了。
这一组的最后一篇,是一个更正。我说过这一切都跑在我书桌上的一台机器上。这句话已经不对了,而第二台机器,也没有做到我原本希望它做到的事。