给一段干声升两个半音,导出来一听:音高确实上去了,可总时长一点没变,跟着伴奏唱也对得上拍。这就是「变调不变速」。但音频本来只是时间轴上的一条波形,把音高改了、时长却不许动,工具究竟动了哪里?
底层原理:音高藏在周期里,时长藏在周期个数里
在波形上,音高由相邻波谷之间的间隔决定,也就是周期长度;而一段音频的总时长,取决于这段时间里塞进了多少个周期。核心就变成对「单个周期的长度」和「周期的个数」分别下手:改变单个周期的长度能改音高,却会连带改变总时长;改变周期的个数能改时长,又不直接动音高。两者相互牵制,所有算法路线本质上都是在回答同一个问题——改了周期之后,怎么把时长补回来。
时域里直接硬切割会留下断点,所以工程上普遍先做一次短时傅里叶变换(STFT),把波形切成逐帧的频谱(典型帧长 20-40ms,帧移取帧长的四分之一),再在时频平面上操作。帧长决定频率分辨率,帧移决定时间分辨率,这是一对天然矛盾,也决定了后面每条路线的精度上限。
三条路线:把音高和时长拆开的三种做法
路线一:重采样加时间伸缩——最省算力的两段式
先整体重采样改变音高,得到的文件同时被变速了,再用时间伸缩算法(WSOLA、Elastique 这类)把时长拉回来。
优点是实现简单、几乎不引入频域伪影;缺点是时间伸缩本身会模糊瞬态,鼓点和爆破音的锐利边缘被抹平。伸缩在 1.2 倍以内还能接受,超过 1.5 倍就能明显听出「拖沓感」。
路线二:PSOLA——沿基音周期切段再重排
PSOLA(Pitch Synchronous Overlap and Add,基音同步叠加)跳过了「先变调再补时长」的迂回:先在波形上标出每个基音周期的起止(pitch marks),再按音高需求复制或丢弃周期,最后用交叠相加把接缝平滑掉。周期变密就是升调,变疏就是降调,而总时长基本不变。
它的死穴有两处。一是标注精度:pitch marks 只要偏 0.5ms,叠加处就会出现相位不连续,听感上是「咯噔」一声。二是清辅音:像 s、f 这类摩擦音没有稳定周期,PSOLA 的切段逻辑在它们身上失效,出来的就是颗粒状噪声。所以它最适合素材里有明确基频的音段,比如独唱人声。
路线三:相位声码器——在频域搬移谱包络
相位声码器(Phase Vocoder)把 STFT 之后的频谱做幅值重排:拉伸或压缩频谱包络来改音高,再单独修正相位来保持帧间连贯。因为操作对象是频谱而不是波形周期,理论上可以独立控制音高与共振峰(Formant)。
代价是相位修正只是近似。高频段的相位误差会累积,形成类似梳状滤波的金属感(phasiness),齿音和摩擦音部分尤其明显。想压住共振峰漂移,还要在频谱上做倒谱分析(Cepstral Analysis),把声道包络近似地剥出来——注意是近似,频谱上并没有一条清晰的线区分哪段是基频、哪段是共振峰。
把流程拆成两步
理解了三条路线,操作路径反而简单:先把人声和伴奏分开,再单独对人声变调,最后合回去。这样变调只作用于有明确基频的那一轨,正是 PSOLA 和相位声码器各自擅长的场景。
在线调音工具 :上传本地文件、分离出人声轨、在变调环节控制半音数,改完直接试听对比。不必装软件,打开就能用,比在多个软件之间来回倒腾省事。需要说明的是,它处理的是你上传的本地音频文件,不支持粘贴链接在线解析;上传的文件 24 小时后自动删除。
收尾:先想清楚在动哪一层,再拧参数
「变调不变速」听起来像魔法,拆开看只是把周期长度和周期个数两件事分开处理,再用不同的算法补回接缝。真正决定成败的不是把某个滑块拉到多少,而是素材里有几轨、你要动的又是哪一轨。想明白这一层,参数往往调两遍就到位;想不明白,再怎么试也只是在三种伪影之间来回换。