音频变时不变调处理(SoundTouch WSOLA)

现在已有一些博客写这相关的内容,但是真的写的看完和没看一样,我最近也研究了一下相关内容,为自己记个笔记,同时也分享出来,和大家一起讨论

变时不变调时音频处理里的一个小方向,但又没那么简单,算法有很多,我就以soundtouch库为例来展开聊一下。

  • soundtouch是一个音频处理开源库,其官网(http://soundtouch.surina.net),该库支持在windows、GNU、android平台的安装,有编译好的库也有源码。

  • soundtouch能处理wav格式的音频。

  • soundtouch支持音频的变时不变调处理(tempo),变调不变时处理(pitch),和变时变调处理(playback rate),在soundtouch的可执行命令里对应tempo、pitch、rate,其实这三个参数是通过两大类算法来控制的,tempo是通过类WSOLA算法来控制音频的时长且不改变音频的音调,rate是通过采样的算法加滤波算法(这两者一般是在一起的,不管是上采样还是下采样,因为抽取可能产生混叠,内插可能产生镜像,所以分别要使用抗混叠或抗镜像滤波器来处理,这两种滤波器一般都是低通滤波去)来控制音频的时长同时也改变音频的音调,pitch就是tempo+rate的结果。

  • soundtouch库对音频进行变时不变调处理时会有100ms的延时。

下面主要就讲一下WSOLA算法,这里不会讲到太深的理论,不使用复杂公式,通过一篇综述来讲一下:

  • 综述名叫《A Review of Time-Scale Modification of Music Signals》,可以自己google一下 *

1.音频的时长变换TSM

时长变换基本分为三个步骤:

  • 将音频按帧分解

  • 将分解好的帧重新定位

  • 合成最终音频

如下图所示:

音频的时长变换流程

2.OLA算法(Overlap-Add)

看名字可以理解,这就是一个简单的叠加算法,先将输入的音频进行分帧处理,然后进行音频合成(叠加),叠加间隔计算如下面公式

叠加间隔计算公式

OLA算法如下图所示:

OLA算法

这样做会使得产生的音频有两个问题:

  • 会造成音频的不连续,如下图所示
OLA算法产生问题1
  • 直接叠加会造成音频叠加部分信号幅值改变,如下图所示
OLA算法产生问题2

3.WSOLA算法(Waveform Similarity Overlap-Add)

WSOLA类似于SOLA,不同的是在对输入音频分解成音频帧后不直接叠加,而是在一定的范围内查找待叠加的音频帧,该音频帧要符合与原位置处音频帧“波形最相似”的条件,符合该条件的音频帧作为输出帧进行输出视频的合成。“波形最相似”可以通过互相关系数来确定。

上面这句话可能较难理解,但是是核心,可以结合下图来理解(图片的注释很有帮助)

WSOLA算法

原理基本就这样了,回到sountouch的源码来看一下,源码下载地址(http://soundtouch.surina.net/download.html),我目前下的是SoundStretch 2.0 for Mac OSX 版本,下载后解压,按照Readme安装该库,在文件夹soundstretch_mac_osx_v2.0.0/soundtouch/source中保存着soundtouch的源码,其中source/SoundStretch保存着一个使用样例用于音频的变时不变调处理,source/SoundTouch保存着soundtouch的源码。

自己用xcode新建了一个工程,源码使用source/SoundStretch,如下图所示

xcode工程目录

在上图中,soundtouch_test文件夹中,main里面是主函数,RunParameters是用来处理输入参数的类,WavFile是用来处理wav文件的类,TDStretch就是用来处理变时不变调的类(改变tempo),RateTransposer是用来处理音频采样的类(改变tempo和pitch),pitch的实现则是使用了TDStretch和RateTranspose两个类。

在处理变时不变调时,可以调整三个参数,DEFAULT_SEQUENCE_MS、DEFAULT_SEEKWINDOW_MS、DEFAULT_OVERLAP_MS,这部分的设置方法可以在readme和TDStretch.h看到一些信息,默认的设置是有利于处理音乐音频,如果要处理演讲类的音频TDStretch.h给出了另一组设置。DEFAULT_SEQUENCE_MS指的是处理的音频片段长度,DEFAULT_SEEKWINDOW_MS指的是WSOLA算法中查找“波形最相似”音频的区域大小,DEFAULT_OVERLAP_MS指的是最后的叠加区域大小。

还有一点要注意的是在SoundTouch类中定义了virtualTempo、virtualPitch、virtualRate,这些是外部设置的参数与命令工具的tempo、pitch、rate不对应,而内部运算用的也不是virtualTempo、virtualPitch、virtualRate,而是SoundTouch类中的tempo、rate(如果命令工具设置tempo=-70则virtualTempo=0.3、virtualPitch=1、virtualRate=1,tempo=0.3、rate=1)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 180,161评论 5 436
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 75,785评论 2 342
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 128,551评论 0 297
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 48,708评论 1 254
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 57,479评论 4 337
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 43,558评论 1 250
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 34,544评论 3 364
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 33,100评论 0 237
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 37,231评论 1 278
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 32,788评论 2 285
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 34,457评论 1 300
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 30,484评论 3 294
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 35,750评论 3 287
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 27,507评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 28,714评论 1 240
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 38,993评论 2 318
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 38,555评论 2 318

推荐阅读更多精彩内容