音频算法入门-变音项目
本文主要是基于一个变音项目带大家入门音频算法。项目用到了波形相似叠加算法(Waveform similarity Overlap-Add WSOLA)和重采样算法。wsola能做到变时不变调,重采样是变时也变调,两者结合就能做到变调不变时。项目地址在文章末尾给出。
该算法属于时域法,能做到音频的变时不变调(改变语速但不改变语调)。时域法的基本思路是将音频切分成很小的若干等份,然后每份都去删减一截或者复制一截数据,来减少或增加音频数据,这样就不会改变音频波形,也就不影响音调,最后把每份重新合成播放就达到了变时不变调的目的。但如果只是这么做的话播放出来的声音是有瑕疵的。例如想要加快播放速度,也就是对每份数据删减一截,问题会出在合成的时候,前后两份音频的波形会出现断横,如果是想要减缓播放速度,也就是每份复制一截数据,问题会出在复制后的数据拼接到原数据末尾的时候,拼接处会出现断横。波形相似度叠加算法就是为了优化这个断横问题而提出的。横断如下图所示。
首先介绍几个概念,分别为有效帧,分析帧、搜索窗、重叠区域,合成帧、搜索窗可移动距离。
有效帧:把音频切分成很小的若干等份,每份数据就叫做有效帧。
分析帧:实际分析和处理的时候,仅仅有有效帧是不够的,需要把上个分析帧末尾的一段数据复制并拼接到当前分析帧的头部,这样的一份数据被称为分析帧。分析帧的组成为:analysisFrameLength(分析帧长度) = effectiveFrameLengthInAnalysisFrame(有效帧长度)+duplicateLengthInAnalysisFrame(重复数据长度)
搜索窗:通过波形相似查找算法在分析帧里截取出的一段数据,数据长度为搜索窗长度,但搜索窗数据并不是直接用于拼接成最终的音频,因为搜索窗里包含重叠区域。
重叠区域:搜索窗数据在处理成最终音频的时候,每个搜索窗数据都会被下一个搜索窗数据重叠一块区域,这块区域叫做重叠区域。
合成帧:由于每个搜索窗数据都会被下一个搜索窗数据重叠一块区域,所以真正用于合成拼接的数据=搜索窗数据-重叠区域,这段数据叫做合成帧。所以播放速度=有效帧/合成帧
搜索窗可移动距离:用上一个搜索窗尾部重叠区域大小的数据(波形数据)作为参考,从当前分析帧头部开始往后平移寻找最相似的数据(相似的波形数据),可平移的最大距离就是搜索窗可移动距离。所以分析帧必须要比搜索窗+搜索窗可移动距离大才行。
熟悉了上面介绍的概念后再来看下面的波形相似度叠加算法示意图,图中展示了两个分析帧变成两个合成帧的完整过程。具体实现细节就看项目吧,主要涉及的操作就是计算波形相似度和叠加这两个相似波形。
重采样分为上采样和下采样,上采样就是增加数据,带来的效果是语速变慢且音调降低,下采样就是减少数据,带来的效果是语速变快且音调提高。所以配合波形相似叠加算法能做到变时不变调。下采样会造成混叠,上采样会造成镜像,想要了解的更细,需要先了解香浓采样定理,然后我推荐一个网址,讲的是上采样和下采样的内容https://www.cnblogs.com/TaigaCon/p/8512219.html。为了让重采样不出现混叠和镜像,本项目用的是窗函数(凯泽窗)设计的sinc低通滤波器进行重采样操作。
低通滤波的目的就是把低频信号保留,把高频信号除去,这相当于把一段音频的频域信号点乘sinc函数傅里叶变换后的频谱函数(该函数的形状请看上图的sinc函数频谱图)。频域点乘又相当于时域卷积,所以又相当于把一段音频时域信号和sinc函数做卷积,但是由于sinc函数在时域上是从负无穷到正无穷的,这就导致没法做卷积,我们观察一下这个sinc函数会发现,离坐标原点越远,曲线上下波动就越小,y值也越接近0,就表示信息量就越少,这时候有人肯定会想到那就裁剪一下,把接近坐标原点的中间这块裁剪下来做卷积。卷积后的结果如下图所示。
看上图会发现不再是标准的矩形函数,两边会有长长的拖尾,而且拖尾的y值还挺大的,这种现象叫做泄露,这不是我们想要的效果,我们还是希望能尽量的接近原来的矩形窗,这就引出了窗函数,对这个sinc函数进行加窗操作(就是裁剪并和窗函数点乘)就可以减少泄露。下面这图就是加了凯泽窗后的sinc函数频谱图
看上图会发现拖尾虽然还是存在,但是拖尾的y值变得更小了,这个效果虽然不是最理想的,但比原来好多了。所以用这个加了窗的sinc函数进行卷积就可以实现低通滤波。那么怎么用这个低通滤波器进行插值呢?请看下图。
为了方便项目的理解,可以先看看这个项目的简单介绍,该项目是先定义了搜索窗大小,搜索窗可移动距离大小和重叠区域大小,然后通过播放速度计算出其他的参数,包括合成帧大小,分析帧大小,有效帧大小和分析帧的重复区域大小。公式如下:
合成帧 = 搜索窗可移动距离重叠区域
有效帧 = 播放速度*(搜索窗-重叠区域)
分析帧 = Math.max(有效帧+重叠区域,搜索窗)+搜索窗可移动距离
分析帧的重复区域 = 分析帧-有效帧
今天春节,是新一年的开端,祝大家在新的一年里付出的努力都能有所收获,年牛大吉!
继续阅读:音频算法入门-变音项目该算法属于时域法,能做到音频的变时不变调(改变语速但不改变语调)。时域法的基本思路是将音频切分成很小的若干等份,然后每份都去删减一截或者复制一截数据,来减少或增加音频数据,这样就不会改变音频波形,也就不影响音调,最后把每份重新合成播放就达到了变时不变调的目的。但如果只是这么做的话播放出来的声音是有瑕疵的。例如想要加快播放速度,也就是对每份数据删减一截,问题会出在合成的时候,前后两份音频的波形会出现断横,如果是想要减缓播放速度,也就是每份复制一截数据,问题会出在复制后的数据拼接到原数据末尾的时候,拼接处会出现断横。波形相似度叠加算法就是为了优化这个断横问题而提出的。横断如下图所示。
首先介绍几个概念,分别为有效帧,分析帧、搜索窗、重叠区域,合成帧、搜索窗可移动距离。
有效帧:把音频切分成很小的若干等份,每份数据就叫做有效帧。
分析帧:实际分析和处理的时候,仅仅有有效帧是不够的,需要把上个分析帧末尾的一段数据复制并拼接到当前分析帧的头部,这样的一份数据被称为分析帧。分析帧的组成为:analysisFrameLength(分析帧长度) = effectiveFrameLengthInAnalysisFrame(有效帧长度)+duplicateLengthInAnalysisFrame(重复数据长度)
搜索窗:通过波形相似查找算法在分析帧里截取出的一段数据,数据长度为搜索窗长度,但搜索窗数据并不是直接用于拼接成最终的音频,因为搜索窗里包含重叠区域。
重叠区域:搜索窗数据在处理成最终音频的时候,每个搜索窗数据都会被下一个搜索窗数据重叠一块区域,这块区域叫做重叠区域。
合成帧:由于每个搜索窗数据都会被下一个搜索窗数据重叠一块区域,所以真正用于合成拼接的数据=搜索窗数据-重叠区域,这段数据叫做合成帧。所以播放速度=有效帧/合成帧
搜索窗可移动距离:用上一个搜索窗尾部重叠区域大小的数据(波形数据)作为参考,从当前分析帧头部开始往后平移寻找最相似的数据(相似的波形数据),可平移的最大距离就是搜索窗可移动距离。所以分析帧必须要比搜索窗+搜索窗可移动距离大才行。
熟悉了上面介绍的概念后再来看下面的波形相似度叠加算法示意图,图中展示了两个分析帧变成两个合成帧的完整过程。具体实现细节就看项目吧,主要涉及的操作就是计算波形相似度和叠加这两个相似波形。
重采样分为上采样和下采样,上采样就是增加数据,带来的效果是语速变慢且音调降低,下采样就是减少数据,带来的效果是语速变快且音调提高。所以配合波形相似叠加算法能做到变时不变调。下采样会造成混叠,上采样会造成镜像,想要了解的更细,需要先了解香浓采样定理,然后我推荐一个网址,讲的是上采样和下采样的内容https://www.cnblogs.com/TaigaCon/p/8512219.html。为了让重采样不出现混叠和镜像,本项目用的是窗函数(凯泽窗)设计的sinc低通滤波器进行重采样操作。
低通滤波的目的就是把低频信号保留,把高频信号除去,这相当于把一段音频的频域信号点乘sinc函数傅里叶变换后的频谱函数(该函数的形状请看上图的sinc函数频谱图)。频域点乘又相当于时域卷积,所以又相当于把一段音频时域信号和sinc函数做卷积,但是由于sinc函数在时域上是从负无穷到正无穷的,这就导致没法做卷积,我们观察一下这个sinc函数会发现,离坐标原点越远,曲线上下波动就越小,y值也越接近0,就表示信息量就越少,这时候有人肯定会想到那就裁剪一下,把接近坐标原点的中间这块裁剪下来做卷积。卷积后的结果如下图所示。
看上图会发现不再是标准的矩形函数,两边会有长长的拖尾,而且拖尾的y值还挺大的,这种现象叫做泄露,这不是我们想要的效果,我们还是希望能尽量的接近原来的矩形窗,这就引出了窗函数,对这个sinc函数进行加窗操作(就是裁剪并和窗函数点乘)就可以减少泄露。下面这图就是加了凯泽窗后的sinc函数频谱图
看上图会发现拖尾虽然还是存在,但是拖尾的y值变得更小了,这个效果虽然不是最理想的,但比原来好多了。所以用这个加了窗的sinc函数进行卷积就可以实现低通滤波。那么怎么用这个低通滤波器进行插值呢?请看下图。
为了方便项目的理解,可以先看看这个项目的简单介绍,该项目是先定义了搜索窗大小,搜索窗可移动距离大小和重叠区域大小,然后通过播放速度计算出其他的参数,包括合成帧大小,分析帧大小,有效帧大小和分析帧的重复区域大小。公式如下:
合成帧 = 搜索窗可移动距离重叠区域
有效帧 = 播放速度*(搜索窗-重叠区域)
分析帧 = Math.max(有效帧+重叠区域,搜索窗)+搜索窗可移动距离
分析帧的重复区域 = 分析帧-有效帧
今天春节,是新一年的开端,祝大家在新的一年里付出的努力都能有所收获,年牛大吉!