WSOLA
摘要
时域压扩(Time-scale modification简称TSM,又叫变速不变调)是一个能够改变音频的"语速"而不改变其音调的算法,是一个在目前音频信号处理中必不可少的一种重要算法,然而音频信号是多种多样的(包含了各种谐波(基音,泛音)冲击和瞬态分量),因为这种广泛的声学和音频特性,因此,目前没有一种能够通用的TSM算法,你需要依据音频特性来选择合适的TSM方法,本文的目的也就是科普一系列TSM算法并对它的特性与局限性进行讨论。
为此,我们先回顾一些基础的TSM方法,讨论一些比较典型的TSM相关问题,同时针对这些问题也给出一系列解决方案,特别的,本文要讨论一种音频融合算法(也就是WSOLA了),其中涉及了一些谐波(泛音)分离的最新技术和时域、频域相关的TSM程序。
介绍
时域压扩(Time-scale modificatio) 算法简单说就是能改变"语速"不改变"语调"(改变速度不改变音调)的一种音频处理算法,当然,这是理想状态下的效果,很多时候这种算法会有各种各样的问题,为啥捏,这里卖个关子往下看你就知道了,那么TSM算法适用于哪些场景呢,按论文的说法是,它让音乐创作和混音变得简单,比如你在B站看到的那些二次创作的鬼畜,或者来说你想变声成可爱的女孩纸,那么在使用例如重采样方法进行变调(重采样变调的同时也会变速)后,你还得依靠TSM方法把语速变回来这样才不会导致“乔碧萝”惨案。同样的,除了很多“不正当”用途外,TSM也广泛应用于各类正当用途,比如作为一个Dj你完全可以把一个让人听着想睡的音乐听起来像是打了鸡血。
然而TSM算法面临各种各样的挑战,我们听到的声音往往有多种不同的音源,比如小提琴和响板一起演奏,在理想情况下,TSM必须保持小提琴的音色和音调,但是响板的“click” “click”“click”的声音没有音调,在变调的过程中,如何保证响板的声音不被抹掉就显得更为的重要,为了保持音乐的节奏,你就需要知道这些响板声音出现的位置。
因此,保持这些声学特性并非易事,你往往需要使用不同的TSM方法,例如基于波形相似重叠叠加算法(WSOLA)或者是相位声码器(PV-TSM)就能够在很大程度上保留这些谐波信号的质量但同时也很容易引入一系列的瑕疵(失真),因此通常使用不同的TSM方法对音频信号进行分类处理,比如把音频中的谐波信号和冲击信号给区分开来,然后分类处理后在合到一块。
那么,本文的目标就有2个,一个是回顾一些经典的TSM算法并讨论他们的优缺点然后改进他们,之后,聊聊两类比较有代表性的TSM算法,分别是时域WSOLA类算法和频域PV-TSM算法。
变速不变调(TSM)的基本原理
变速不变调,顾名思义,改变速度不改变音调,大部分的TSM算法,都可以用下图进行解释
简单来说,就是把一段音频信号等分成不同的帧,帧的长度大多选取是50ms到100ms之间度,然后对每个帧进行一系列处理比如拉伸或者压缩,最后在将这些帧重新叠加成合成信号(当然很多的TSM方法中两个帧叠加时常常是由重叠部分(overlap)的)当然这个重叠部分需要进行一系列的处理以减少类似于相位不连续、幅度波动造成的影响,上述这个过程在论文中有一个数学的表达方式(当然有些内容是笔者依据自己经验加上去的),但不管是文字表达还是数学表达基本意思大致如此,如果有兴趣可以转到论文中去详细查看。
最直接暴力的一种TSM方式(重叠叠加OLA)
这个很好解释,把音频信号分帧处理后,直接把这些处理后的信号首位拼接起来,比如一个最简单粗暴的方式,比如要把一段音频信号的语速放慢,只需要每一个帧都进行延扩,然后在首位拼接起来就行了,但造成的劣势也是显而易见的,它会造成拼接处的波形不连续(语音信号中的基音断裂),于是拼接的信号中会有biu吱biu吱的奇怪的声音。
直接拼接造成的波形不连续
为了减轻这种波形不连续造成的影响,上一章节我们也提到了,两个帧之间需要留一点重叠的部分,同时,对每一个帧进行加窗处理,在OLA中,常常使用汉宁窗对帧进行加窗叠加。那么,一个音频变速的叠加算法的流程如下图所示
- 首先对音频时域进行分帧,
- 加上汉宁窗
- 间隔Ha 取第二个帧
- 对第二个进行加窗,并与第一个窗进行叠加,叠加的长度是 Hs
上述加窗在一定程度上缓解了波形不连续(基音断裂)问题,但仍然造成了一系列失真。
我那么努力了,为什么还会失真
首先最直观的,OLA常常无法保持信号中的周期性结构,在帧裁剪的过程中,你没办法保证每一个帧都能覆盖完整周期并保证其相位对齐,这种失真也叫相位跳跃失真(phase jump artifacts),那么重点来了,因为音频信号中的局部周期性与谐音(基音、泛音)相对应,因此OLA并不适合处理这类信号,至少处理的效果不咋样。
一个OLA栗子,两个周期信号帧被伸缩了1.8倍然后加窗合成在一块,你可以看到原先周期性号合成后就变得“不周期”了
不过OLA并非是一无是处,对于一些纯打击乐来说,OLA还是能取得非常好的效果的(打击乐音频很少有局部周期结构),重要的是,帧长应该尽量选的比较小(比如10ms)以减少瞬态加倍引起的影响。
波形相似叠加(Waveform similarity Overlap-Add WSOLA)
在上面的章节中我们已经明确了OLA算法的缺陷和导致缺陷的原因,为了减少这种相位跳变失真,一种直观的方式是调整那些连续的合成帧使得互相叠加的区域能够相位对齐,下图演示了WSOLA算法的基本思想。
- 在原音频中截取一个帧,加窗
- 在一个范围内(蓝色虚线框)选取第二个帧,这个帧的相位参数应该和第一个帧相位对齐
- 在另一个范围内(蓝色实线框)中查找第三个帧,这个帧和第二个帧应该最相似
- 然后再把它们叠加在一块
那么,上述问题的主要问题就是,两个帧怎么样才是“最像”的,当然,要判断的办法很多,论文中给出了一种最直接的办法“自相关”(说通俗点就是每个样本点乘起来然后再加起来看看数值有多大)
Sorry,WSOLA仍然无法完全解决根本问题
你可能已经意识到了,我们无法为所有的帧都找到最优匹配只能找到相对靠谱点的帧,因此WSOLA仅仅只是OLA方法的一种改进形式能够进一步减轻这种失真效应,但是遗憾的是,它仍然无法从根本上解决这种失真并可能导致一些新的问题
看下面图的栗子
原音频信号截取一帧后,通过波形相似匹配下一帧,但两个帧都包含一个瞬态的音频信号,导致合成音频失真。(伸展信号通常会出现这种瞬态加倍失真,而压缩信号则容易发生瞬态跳跃),如果你将WSOLA应用于打击乐乐器的音频,这种现象将会更加的明显,正如我们之前在OLA中提到的那样,WSOLA与OLA相反并不适合处理这些冲击瞬态信号。