记录一次失败的经历。
最近1个多月,忙活着训练一个小模型,效果上大失败,但是学到了一些东西。
本来想训练一个小模型,可以实时转换音频,类似变声器,可以准实时转化悄悄话的声音
这个想法是因为有一些人因为声带切除无法正常发声,只能发出悄悄话一样的声音(想想声带不震动用呼吸声说话),要么通过人工喉发声。想着用模型能不能解决这个问题(肯定能解决,只是我没解决😂)。后边又想到一个类似场景是,半夜玩游戏连麦,不想打扰别人用悄悄话转正常语音也可以。
由于自己认知不够,模型的训练过程全是问题,光是自己整体的记录(图),刚看了下,就5000多字,加上没解决问题,不想过多记录过程了,怕得PTSD。
挑一个数据上遇到得问题,首先这个点子有点歪,找不到数据(也不知道怎么找),于是自己录,刚开始录了5分钟,才想起来输入和目标数据对齐的问题。用笨方法写个小工具一句一句录制,尽量保证小短句的对齐,录了69句作为最初数据集,测试整体的跑通。
偶然间想起来用大模型的数据训练小模型的方法,能不能找到现有质量高得语音模型,可以变换音色,将呼吸声转换为正常声音,用来给小模型训练?找了几个在线的AI变声测试效果都不是很好,可能是没人想到用呼吸声去做训练吧。最后想起用剪映剪视频有变声功能,测试下,居然比收费的一些变声做的还好,关键还免费。虽然呼吸声转换的结果一般,但是好歹可以录制严格对齐的数据了。
后边某一天又发现,录制时候麦克风默认开增益,导致实际测试数据偏差很大,之前数据(虽然只有10多分)全都作废重新统一标准录制……
整体上模型训练这里耗费了将近一个月的摸索,反复调整,有时候一个问题出现。因为不知道问题出在哪里,只能对比测试,经常改动一多、时间一长就忘记改了啥,非常纠结。而且训练这个玩意,还不能单独看某一个参数的影响,调整某一部分,可能其他都需要对应调整,找到相对较好的那么一个“组合”。
最终结果非常拉跨,尤其是实时输入的处理,延迟0.5s都不算什么问题,转换的效果也是很差,输出结果自己能听懂对应上自己说的啥,但是别人是听不清转换后的音频,而且效果时好时坏。
自己总结一些想法,也算是当作进步了:
1.重视数据的标准化方法。有一天突然想起改变标准化方式用对数后归一化,效果立马好了很多。
2.有一段时间测试输出的音频一直有很大噪音,后来才发现是输入数据log处理后,转回线性过程中引入了噪声,导致训练的目标中就包括了噪声。有时候问题可能不是模型的问题。再比如前面讲的麦克风自动音频增益得问题。
3.借助正则化技术,小的数据集也可以训练出像样的模型。
4.以前以为L1loss,L2loss是每批的均值,用了才知道默认是所有批次的均值
5.激活函数的选择根据自己输出目标的分布来决定,不同的激活函数,效果可能差别非常大。
6.训练中打印输出模型的梯度信息,学习率,可以提前观察到梯度爆炸梯度消失等信息。
7.优化器上Adam基本没错,RMSprop有时候效果也很好
8.数据集不够可以上数据增强,迅速增大数据集,还有一定正则化作用,用了以后验证集上损失明显下降。比如为了使模型不处理正常声音,将正常声音最为输入加入模型,用正常声音作为目标训练,模型还能够具备一定的区分能力,针对呼吸声进行转换。
9.tensorboard对比不同批次很方便,记录重要信息
10.git记录很有用,多在分支上修改,至少保存训练最好的结果分支。
11.涉及到训练参数的,尽量不要在代码中设置默认参数,否则中间环节一个默认,排查都不好排查。然后最好是统一管理,不然可能出现测试和训练用的不是一套数据这种低级错误。
搞这个晕乎了,估计将来会回头捡起来搞一搞吧,短时间内不想碰了。。。。
烂摊子:[github](
github.com)