标题:Adapting Speech Language Model to Singing Voice Synthesis

链接:https://arxiv.org/pdf/2512.14657

作者单位:卡内基梅隆大学、中国人民大学、约翰霍普金斯大学

发表日期:2025年12月16日

说明:Accepted by NeurIPS 2025 workshop AI for Music.

这篇论文是卡内基梅隆大学、中国人民大学这些学校团队做的,核心是想试试能不能把本来用来做语音任务(比如文字转语音TTS)的语音语言模型(SLM),改成能生成歌声的模型(SVS,歌声合成),还得在数据不多的情况下做好。

01、摘要:核心是“改造SLM做SVS”

简单说,现在的SLM(语音语言模型)挺厉害的,能统一处理TTS、语音增强、语音识别这些任务,但它“举一反三”的能力(泛化性)还没怎么被挖透。这篇论文就干了件事:拿一个1.7B参数、预训练好的TTS-SLM,改成做SVS,而且只用了一个135小时的合成歌声数据集(叫ACE-Opencpop)。
具体步骤分四步:
  1. 把音乐得分(比如音高、歌词音素、时长)和歌声波形都转成token;
  2. 让模型做“多流token预测”(就是同时预测不同类型的token);
  3. 用“条件流匹配”的方法生成mel谱(声音的一种特征);
  4. 最后用声码器把mel谱转成实际的歌声波形。

结果也不错:改完的SLM做SVS的效果,能跟现在主流的、专门做SVS的“离散token模型”比一比。他们还放了项目页,能听样例、看代码:https://tsukasane.github.io/SLMSVS/

02、引言:为啥要做这件事?

先铺垫下背景:现在大语言模型(LLM)很火,因为能把不同数据类型(比如文字、语音)的特征统一起来,一个模型就能干好多活,而且小数据场景也能适配。
在语音领域,之前主要有两种思路做模型:要么拿文字预训练的LLM改改做语音任务,要么直接用语音数据训练“语音语言模型(SLM)”。后者的好处是能抓更细的声音特征(毕竟直接学音频),但缺点是特别费数据——所以之前的SLM都只敢碰TTS、语音识别(ASR)这种数据多的任务。
而SVS(歌声合成)就麻烦多了:输入得是复杂的音乐得分(比如一句歌词对应哪个音高、唱多久),输出的歌声既要符合歌词(语音层面),又要符合音乐(音高、节奏层面)。更坑的是,公开的SVS数据集特别少——要么版权卡得严,要么标注音乐得分太费人力。
所以这篇论文的动机就很明确了:想试试SLM的泛化性到底行不行——能不能把一个预训练好的TTS-SLM,改成做SVS?
不过一开始试的时候也遇到问题:直接用模型预测的token生成歌声,会有“噪声”,比如声音断断续续的(尤其是token衔接的地方),听着很怪;而且之前的codec(音频编解码器)是用语音数据训的,用来还原歌声会丢信息,效果上限被卡住了。
后来他们就加了两步优化:
  1. 用“条件流匹配模型”把高斯噪声转成mel谱,还把音高信息加进去,让歌声更准;
  2. 专门训了个声码器,跟codec的参数对齐,解决声音质量问题。

03、方法:具体怎么改SLM做SVS?

这部分是核心,分三步讲:先把SVS的数据转成token,再给SLM做微调,最后用“流匹配”优化声音质量。
3.1 SVS数据token化:把“音乐得分+歌声”都转成模型能懂的token
他们是基于一个叫“ESPNet-SpeechLM”的现有框架改的,新增了一个叫“svs_lb”的模态(可以理解为“歌声标签”),专门存SVS需要的关键信息:每帧的音高、时长、音素。
具体怎么转token?
  • 对于音乐得分里的“音素、音高、时长”:先把它们量化成“50FPS的离散token”(50FPS就是每秒50个帧,保证时间对齐),然后加到原来TTS模型的词汇表里;
  • 对于歌声波形:用两个预训练模型提token——一个是codec编码器(提“低层声学token”,管声音的细节),一个是SSL模型(提“高层语义token”,管歌词对应的语音特征),每帧的token是“1个SSL token + 8个codec token”拼起来的。
还有个小细节:“时长”怎么用token表示?他们没单独做时长token,而是用“(音素token+音高token)的重复次数”来表示——比如一个音要唱0.2秒,50FPS就是10帧,那这个(音素+音高)的tuple就重复10次。公式是“repeat=(med - mst)×fps”,med是这个音的结束时间,mst是开始时间,fps就是50。
这里画了“音乐音符token化”和“波形token化”的过程:

左边是音乐得分的三个要素(音素、时长、MIDI音高)怎么转成离散token,右边是歌声波形怎么用codec和SSL提token,很直观。
最后模型的输入和输出也定好了:输入是“svs_lb(音素+音高+时长的token) + 说话人prompt(告诉模型用哪个歌手的声线)”,输出是“歌声的codec token + SSL token”(但解码的时候只留codec token,因为SSL是辅助预测的)。
3.2 语言模型公式:给SLM定微调目标
首先,模型对音频的表示用两种token:SSL的“高层语义token”(管歌词对应的语音)和codec的“低层声学token”(管声音细节)。他们把这两种token沿“流维度”拼起来(比如一个流存SSL,八个流存codec),形成一个“多流离散音频表示”(叫sf,形状是F×nq,F是总帧数,n_q是流的数量)。
微调的目标很简单:让模型根据“输入的音乐得分(m)”和“说话人prompt(p)”,尽可能准确地预测“目标歌声的token(s)”——本质是个分类任务,用交叉熵损失最大化“P(s|m,p)”(给定m和p,预测s的概率)。
“SVS微调的任务模板”:

上图画了“音频codec token和SSL token怎么沿RVQ流轴拼接”——能清楚看到输入(音乐得分、说话人)和输出(拼接后的token)的对应关系,模型就是学这个映射。
3.3 流匹配优化:解决声音质量问题
前面说过,直接用token生成歌声会有噪声、不连贯,所以他们加了“条件流匹配(CFM)”这一步,核心是把“高斯噪声”转成“高质量的mel谱”,再用声码器转成歌声。
先解释下“流匹配”是啥:它是一种生成模型,学一个“速度场”——可以理解为给一个“起点”(比如高斯噪声),沿着这个速度场走,就能走到“终点”(比如目标mel谱)。训练的时候,模型学“怎么调整速度”才能从噪声走到mel谱;推理的时候,就从噪声出发,跟着学过的速度场走,最后得到mel谱。
具体怎么做的?
  • 起点(源分布):X₀,是标准高斯噪声(简单说就是随机噪声);
  • 终点(目标分布):X₁,是真实歌声经过STFT(一种信号处理方法)得到的mel谱;
  • 路径:用“线性插值”——比如时间t=0时是纯噪声,t=1时是纯mel谱,中间t时刻的状态是“(1-t)×噪声 + t×mel谱”,这样走的路径是“动能最小”的,模型好学好优化;
  • 条件:为了让生成的mel谱符合SVS需求,他们把“模型预测的codec token”和“音乐得分里的音高信号”都作为“条件”喂给流模型,保证生成的声音既贴合预测的token,又不跑调;;
  • 训练损失:让模型预测的“速度”和“真实速度”尽可能像——真实速度是“从噪声到mel谱的实际变化速度”,模型预测的速度要跟它接近,用平方误差算损失。
推理的时候也简单:先从高斯噪声(X₀)出发,用训练好的速度场解一个“常微分方程(ODE)”,一步步走到X₁(mel谱),最后用声码器把mel谱转成波形(Y=Voc(X₁))。
“流匹配的训练和推理过程”:
训练时是“噪声→中间状态→mel谱”,学速度场;推理时是“噪声→沿速度场积分→mel谱→声码器→歌声”,一步到位。

04、实验:效果到底怎么样?

4.1 数据集和参数设置
  • 数据集:用的是ACE-Opencpop,135小时的合成歌声数据集,是目前最大的开源SVS数据集。它是在一个5.2小时的中文女声数据集(Opencpop)基础上做的,加了30个歌手的声音(用ACE Studio生成,还手动调过),所以数据量够大,也够多样。
  • 模型参数:
    • SLM微调:用DeepSpeed混合精度(FP16)训练,Adam优化器(β₁=0.9,β₂=0.95),学习率5e-6,还开了ZeRO stage2省内存;学习率用“ Warmup-Cosine”调度(先涨后降,总步数7e5,最低LR是初始的30%),梯度裁剪设1.0,防止训练崩。
    • 流匹配训练:训30轮,batch size=64;学习率从3e-4线性降到1e-4(从2e5步降到5e5步)。
4.2 评价指标:怎么判断歌声好不好?
先解释下用的指标(都是SVS领域常用的):
  • F0_RMSE:基频(音高)的均方根误差,越低越好(说明音高越准,不跑调);
  • F0_CORR:基频的相关性,越高越好(说明生成的音高和参考的音高越像);
  • MCD:mel倒谱距离,越低越好(说明生成的声音频谱和参考的越像,音质越好);
  • PER:音素错误率,越低越好(说明歌词对应的语音越准,没唱错字);
  • SingMOS:歌声的MOS分(1-5分),越高越好(主观听感越好);
  • Sheet-SSQA:歌声和乐谱的匹配度,越高越好(说明歌声符合音乐得分)。
4.3 实验结果:跟主流模型比,跟自己的 ablation 比
(1)跟主流SVS模型比
选了两个代表性模型:XiaoiceSing(早期的SVS模型,用音乐得分预测token,再训声码器)、TokSing(现在主流的离散token模型,加了旋律预测器、音乐增强器,音高很准)。
结果对比(看ACE-Opencpop数据集上的表现):

  • 音高准度:本文模型比XiaoiceSing好,但比TokSing差一点(毕竟TokSing专门加了旋律优化);
  • 音质和听感:本文模型的SingMOS(4.09)比两个对比模型都高,MCD也比XiaoiceSing好很多,说明听感更自然;
  • 乐谱匹配:跟TokSing差不多,比XiaoiceSing好。
结论就是:本文模型虽然音高准度略逊TokSing,但整体效果能跟主流模型持平,甚至听感更好——证明SLM的泛化性确实行。
(2)自己的消融实验:哪些设计有用?
消融实验就是“去掉某个模块,看效果变不变差”,用来验证每个设计的必要性
他们试了5种方案:
从这里能看出几个关键结论:
  • 直接用codec编解码(CD Resynthesis)的“客观指标”(F0_RMSE、MCD)很好,但“主观听感”(SingMOS)一般——因为codec是用语音训的,还原歌声不够自然;
  • 只做SLM微调+codec解码(LM+CD)效果最差——证明之前说的“token有噪声、codec不适配歌声”是真的;
  • 加了流匹配+专门声码器(LM+Flow1+Voc)后,主观听感(SingMOS)和乐谱匹配(Sheet-SSQA)直接冲到最好——说明流匹配和专用声码器是关键,解决了音质问题;
  • 流匹配里加音高条件(LM+Flow2+Voc)后,F0RMSE、F0CORR、MCD这些客观指标略好——证明把音高信息加进去,能让音高更准。

05、结论:总结一下

这篇论文干成了一件事:把一个预训练好的TTS-SLM,用135小时的小数据集改成了SVS模型,效果能跟主流的SVS模型比。
核心贡献(创新点)有三个:
  • 验证了SLM的泛化性——不用专门训SVS模型,改改预训练的TTS-SLM就行,小数据也能适配;
  • 设计了SVS专用的token化方案——把音乐得分(音素、音高、时长)转成帧级token,还和音频的codec/SSL token结合,让模型能同时学语音和音乐特征;
  • 用“条件流匹配+专用声码器”解决了音质问题——既补了codec的短板,又让音高更准,还提升了听感。
最后他们也说,这给未来的“多任务SLM”指了个方向——或许以后一个SLM就能同时干TTS、ASR、SVS这些活了。