倍速的场景
我们经常在抖音中看到一些视频倍速播放,像幻灯片一样,播放非常快或者非常慢,这都是在剪辑视频的时候进行的速度的调节,就是倍速调节,这是一种很常见的视频处理方案。本文主要分析倍速导出是如何做的?
可以看看剪映中的变速方案,出了常规变速还有曲线变速。曲线变速是常规变速的变种,动态调整速度。
倍速的注意点
我们知道视频是由声音和视频序列画面组成的,如果想倍速处理视频,需要分别处理声音数据和视频序列画面,让他们都达到倍速的要求。处理视频序列画面很容易,例如原来的视频帧率是30fps,现在我需要调整为2倍速,那视频的帧率就变成15fps,原来1秒钟显示30帧画面的现在变成1秒钟显示15帧画面,但是声音的处理需要注意的地方比较多。
我们知道声音原始数据是一种波。它有几个相关的属性:
- 音量
- 音调
- 音色
音频表示同等条件下,如果声音的振幅大,表示音量大,就是我们俗称的大嗓门。如下图:
音调表示同等条件下,如果声音的频率高,表示音调高,就是我们俗称的声音尖,如下图:
手绘的图片,大家将就看一下哈。
音色就是每个人或者物体的声音都有特定的属性,大家一听张三和李四说话的声音,即使看不到他们的脸,依然可以分辨出他们的声音,说明他们的音色是有明显的区别的。音色不在我们讨论的范围之内。
声音处理的倍速方案
我们在处理音频倍速的时候,需要保证变速的同时不能改变音调,如果变速的情况下改变音频,那整个声音听起来就非常怪,不是原来的声音了。
所以我们处理音频倍速需要保证以下的条件:
- 声音保真
- 变速不变调
目前比较成熟的方案有两种:
- soundtouch
- sonic
soundtouch介绍
soundtouch是一个开源的音频处理库,用于更改音频流或者音频文件的速度、音量、播放速率,可以用于处理视频文件或者播放视频时使用。
具体的开源项目地址是:soundtouch
soundtouch使用到的算法是WSOLA算法,WSAOLA就是Wave-form Similarity Overlap-Add 算法,实际上经过WSOLA算法处理,需要三个步骤:
- 将音频按帧分解
- 将分解好的帧重新定位
- 合成最终的音频
完整的流程如下:
其中的分过程是将输入的音频进行分帧处理,然后进行音频叠加:添加的算法OLA如下:
但是叠加的过程中可能会存在两个问题:
(1)音频不连续
(2)直接叠加会造成音频叠加部分音频振幅改变
WSOLA算法在此基础上改进了叠加算法产生的问题,输入的音频分别成音频帧之后,不会直接叠加处理,而是再一定的范围内查找叠加的音频帧,该音频帧要符合与原位置处音频帧“波形最相似”的条件,符合该条件的音频帧作为输出帧进行输出视频的合成。“波形最相似”可以通过互相关系数来确定。
这儿我建议大家看下论文:《A Review of Time-Scale Modification of Music Signals》
sonic介绍
sonic是一款用于加快和减慢音频速度的开源软件,与soundtouch不同的时,sonic主要针对的对象是说话,就是sonic对普通的语音处理效果要好一点,soundtouch对音乐数据处理更加好一点。sonic基于PICOLA算法,主要是处理音频流,像ExoPlayer等开源软件都使用了sonic来处理音频。
sonic还有一个很好的优势,就是代码非常简介,直接就是基于CPU的浮点计算,一个文件。
GitHub - waywardgeek/sonic: Simple library to speed up or slow down speech
只需要引入sonic.c文件即可,不像soundtouch要引入的文件比较多。
我们VE中采用的是sonic,简单易上手。