训练完成以后,最容易让人松一口气的,往往不是指标,而是终于有声音出来了。可这次试音一放出来,我的第一感受并不是“成功”,而是有些不对:前段像没有起声,部分字词没有对上,声音还带着沙哑、发闷和杂音。两份权重都能合成,不代表它们已经能用。
遇到这种情况,人很容易沿着训练这条路继续往前冲。既然声音不够好,那就再加几轮;既然有杂音,那就把训练时间拉长。这个动作看上去积极,实际上把一个尚未定位的问题,直接当成了训练不足。声音变差时,第一步不是增加训练量,而是先确认变差发生在哪一层。
先把“难听”拆成几件事
“发闷”是一个听感词,不是一个诊断结果。它可能来自清晰度下降,也可能来自气声变重、底噪被学进去、字词识别错误,甚至只是语速变慢以后让人觉得声音拖沓。如果不先拆开,后面每一次修改都会同时改变好几个变量,最后只能凭印象猜原因。
我会先把问题分成5类:有没有无声或起声异常,音色是否改变,噪声出现在哪里,语速和停顿是否变化,文字有没有读错。前段无声更像切分、起始位置或推理链路的问题;沙哑和发闷要看参考音频的气声、频谱和训练后的音色;杂音则要追到底噪、切片和后处理;字词不对,不能用“声音不够清晰”一概解释。
这一步看起来只是换了几个描述,实际上是在决定调查顺序。比如一段音频前半截根本没有有效波形,继续训练不会把丢掉的声音训练回来;如果同一模型只在某个推理链路里出现无声,清洗数据也可能是白费力气。
先做同句对照,而不是凭感觉追轮数
这次最有价值的安排,是把同一句话放进几个对照组里:底模、不同轮次的微调权重,以及原先已经定稿的声音。文本要完全相同,推理条件尽量固定,随机种子也固定;否则每组说的不是同一句话,差异就无法归因。
对照时我不会只听一遍“哪个更像”。第一遍可以知道总体印象,第二遍专门听起声、尾音和齿音,第三遍只关注语速与停顿。最好把顺序打乱,暂时不告诉自己哪段来自哪一组。知道答案以后,耳朵会替预期寻找证据,所谓“这版肯定更好”很容易变成自我暗示。
盲听不是为了制造一个神秘的评分,而是为了把身份从判断里拿掉。听者不知道文件来自底模还是微调版,才更可能说出“这一段更闷”“这一句字词不稳”,而不是替某个训练结果找理由。同句、同条件、盲听,是把主观感受变成可比较证据的最低成本办法。
如果底模和微调版在同一句、同一链路下都前段无声,优先查推理和切片;如果只有微调版无声,才把注意力转向权重和训练数据。如果所有版本都读对了,但微调版明显更沙哑,模型学习偏差的可能性上升;如果只在某几句出现字词对不上,还要检查文本、音素和参考片段是否对应。
客观指标只负责缩小范围
听感之外,我会加一层声学指标。清晰度可以先用平坦度观察趋势,数值越低,通常代表声音越集中、越清晰。它不是“好听分数”,也不能单独决定自然度,但能帮助判断“发闷”究竟有没有对应的频谱变化。
比如,盲听认为微调版更闷,同时平坦度也明显升高,这说明清晰度变差并非纯粹的心理感受。若听起来更闷,但指标没有同步变化,就要考虑气声、动态、语速或音量平衡,而不是马上修改模型。指标的价值,不是替耳朵下结论,而是告诉我下一步该查哪里。
这次还要特别留意参考录音本身。参考音频如果偏气声,模型可能把这种气声当成目标音色;原始录音里即使底噪不大,切片、放大和训练也可能让它在输出中变得更明显。模型不会自动区分“我想保留的音色”和“录音环境留下的痕迹”,它只会按数据里的相关性学习。
所以,看到微调版有杂音,不能直接说模型训练坏了。要把参考音频、清洗后的片段、训练输入和最终推理输出依次试听。噪声若在参考音频里已经存在,问题属于数据;若输入干净、输出才出现,才更像模型或推理链路;若换一条后处理链路噪声就消失,则不能把责任推给权重。
语速变化说明自然度不是清晰度
有一个容易被忽略的现象:微调版长句的语速,可能和定稿声音不同。即使每个字都清楚,整句话仍然会显得不自然;反过来,一段声音很像目标音色,也可能因为停顿位置和呼吸节奏不对而不好听。
这提醒我,声音质量至少有两条轴:清晰度和自然度。平坦度可以帮助看清晰度趋势,却无法告诉我一句长话是不是说得像一个人在思考。语速、停顿、重音和气口,需要通过同句盲听和时间对齐来判断。如果只盯着一个指标,就会把“更清楚”误认成“更自然”。
这里最容易误判的是,把所有听感问题都归到模型轮数上。轮数增加以后,音色可能更接近参考数据,但语速变化也可能被一并放大;数据中气声和停顿的比例如果不稳定,继续训练只会让模型更坚定地学会这种不稳定。
我选择先做对照、再决定是否继续训练,是因为训练是成本最高、最不容易回退的一步。对照只需要重新合成几句,能先判断问题属于数据、模型还是推理链路。如果问题在数据,继续训练只会加深错误;如果问题在推理,重训也不会修好那条链路;只有确认是模型尚未学到目标特征,增加轮次才有意义。
不处理会把错误变成“新标准”
如果不处理就继续增加训练轮数,最直接的后果是把气声、底噪、语速偏差和偶发错字一起固化。等到某一轮听起来“似乎更像”时,我们可能已经不知道它到底改善了什么,也不知道牺牲了什么。更麻烦的是,人听久了会适应缺陷,原本明显的发闷,最后会被误认为是这个声音本来就该有的质感。
错误捷径还有一个隐蔽版本:只保留最像的一段试听,把不好听的句子删掉。这样得到的不是更好的模型,而是一份更会挑样本的报告。真正可靠的对照,必须保留相同文本,尤其要保留长句、起声和出现错字的句子,因为这些边界场景最能暴露问题。
我会把每次试听的结果记成“现象—证据—判断—下一步”:现象写听到了什么,证据写盲听意见和指标变化,判断写更像哪一层,下一步只改一个变量。这样做不是为了把过程写得漂亮,而是防止下一轮又回到“感觉不够好,所以再训一会儿”。
下次我会怎么做
下次遇到微调后声音发闷,我会先固定1句短句和1句长句,准备底模、微调权重、不同轮次和定稿声音4组样本。每组使用相同文本、相同推理设置和相同种子,先做盲听,再看平坦度、响度和波形起始位置,最后复核识别文字与语速。
如果无声在所有版本都出现,我先查切片和推理链路;如果只出现在微调版,我再检查训练数据和权重;如果噪声随着参考录音中的气声一起出现,我优先清洗数据,而不是继续加轮数;如果清晰度改善但语速变差,我把自然度单独列为问题,不用一个指标掩盖另一个问题。
这件事让我重新意识到,训练不是解决声音问题的默认答案。真正成熟的流程,不是能产出一份权重,而是能在声音变差时,知道差异从哪里来、下一步只改什么。先建立可复现的对照,再决定清洗数据、调整权重还是停止训练,这条规则比任何一次“多训几轮”的经验都更值得保留下来。