音视频处理系列(二):音频那些事
0. 为什么要写这篇文章?
现实生活中,大家每天都能够听到各种各样的声音,一切都那么自然而然,再熟悉不过了,为何还要花费时间来谈谈“音频那些事呢”?
虽然讯飞长期深耕语音产业,但具体业务线的同事对于相关基础知识却较为缺乏,对一些问题存在误区。在AI营销业务开展过程中,时常需要给相关同事进行一些常识性的说明。本文仅按照我本人的理解,对一些音频上的常识进行总结,若有错漏,望大家指正。
1. 从初中物理开始说起
在初中物理课本上,我们对声音有了更深层次的认识,我们先来回顾一下我们都学过什么:
声音的三要素是—— 音调、响度、音色。
可以从以下四点来掌握声音的特性。
定义:
- 音调:声音的高低
- 响度:声音的强弱
- 音色:声音的品质
影响因素:
- 音调:取决于发声体的频率。频率高则音调高。
响度:
- 取决于发声体的振幅。振幅越大,响度越大。
- 还与人距离发声体的距离有关。距离越近,响度越大。
- 音色:与发声体的材料核结构等自身因素有关。
波形图:
- 音调:波形的疏密影响音调。波形越密集(相当于振动快,频率大),音调越高。
- 响度:波形的振幅大,响度大。
- 音色:波形的细节不同。
生活实例:
- 音调:男高音,女高音;弦乐器,管乐器。
- 响度:歌声嘹亮,震耳欲聋,大力击鼓,收音机调音。
- 音色:分辨不同乐器和人声、动物鸣叫声。
2. 声音在计算机中如何存储?
回顾了当年在校园里学习的知识之后,我们把视线转回计算机领域。
2.1 采样率
现实生活中,声音是一个连续的过程,可以细分到毫秒、微秒、纳秒……那么理论上,若需要真实还原一段声音,记录每一个瞬时的状态,需要无穷大的数据量。那么实际上工程师们是如何处理的呢?
与视频类似,声音的存储与人的生理结构有关:人类的听力范围是20~20000Hz,人类的发声范围在85~1100Hz。在计算机或通信领域中,我们只需要针对能感知的频率进行处理即可。这个处理过程,实际上是按照固定间隔对声音波形进行取值,也就是所谓的采样(sampling)
根据香浓采样定理(又称奈奎斯特采样定理),为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍。
所以,采样频率(也称采样率)是音频文件的一项重要指标,根据用途的不同,往往也会选用不同的采样率:
- 8000Hz 电话所用采样率,对于人的说话已经足够
- 11025Hz 获得的声音称为电话音质,基本上能让你分辨出通话人的声音
- 22050Hz 无线电广播所用采样率,广播音质
- 44100Hz 音频CD,也常用于MPEG-1音频(VCD,SVCD,MP3)所用采样率
- 48000Hz miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率
- 96000或192000Hz DVD-Audio、一些LPCMDVD音轨、BD-ROM(蓝光盘)音轨、和HD-DVD(高清晰度DVD)音轨所用所用采样率
我们科大讯飞早期使用的是8KHz可以满足声音转文字的基本需要,目前使用的是16KHz的音频,足以获取人声音的特征,为听写、声纹、性别年龄识别等AI能力提供素材。
根据上文所说,人类的听阈是20~20000Hz,按照两倍的采样率计算,44100Hz可以覆盖人类的听阈,所以更高的采样率对于人耳来说,就没有太大区别了。
2.2 位深度
上文提到,采样率规定了采样的时间间隔,以固定的间隔对声音波形进行取值。那么音频的存储就是很多很多这样的“点”组成的。这些点本身是如何存储的呢?
位深度(也叫采样精度),表示每个采样点用多少bit来表示。以最常见的位深度为16bit的音频举例,每个值以16bit进行存储。
结合声音波形可知,采样值越大则波形的振幅越大,声音的响度也就越大。
16bit能够表示的数值范围是2^16 = 65536个振幅等级
除了16bit之外,较为常见的还是20bit、24bit,它们能反应更大的声音范围
2.3 比特率
比特率是指每秒传送的比特(bit)数,实际上采样率,和位深度确定了,比特率也就确定了
3. 常见音频格式介绍
3.1 PCM
日常生活当中,可能见到最多的是mp3,为何要把pcm放到第一位呢?
因为它是最贴近原始音频的格式,我们也称之为裸音频,它没有经过任何的压缩转化,甚至没有头信息。其他格式音频在播放时,也是通过解码转化为PCM后,通过声音设备进行播放的。
由于没有头信息,pcm往往无法直接播放(需要知道采样率,位深度,声道数 才能进行数模转换)
3.2 WAV
将pcm文件简单的添加44bit的头信息就可以变成一个可播放的WAV文件了。头信息里记录了音频的采样率,位深度,声道数,大小端模式等。当然wav格式不仅限于此,也支持多种压缩格式
3.3 MP3
mp3文件可以说是最常见的音频格式,它通过有损压缩,可达到10:1~12:1的压缩率
4. 一些常见问题
4.1 音量
- 为什么能看到音频音量是负值?
- 现在音量是-6dB,我要把音量调大一倍应该是多少dB呢?
众所周知,声音的大小是用分贝(dB)来表示的,生活中有以下表格百度百科_ 分贝
1分贝 | 刚能听到的声音 |
15 分贝以下 | 感觉安静 |
30 分贝 | 耳语的音量大小 |
40 分贝 | 冰箱的嗡嗡声 |
60分贝 | 正常交谈的声音 |
70分贝 | 相当于走在闹市区 |
85分贝 | 汽车穿梭的马路上 |
95分贝 | 摩托车启动声音 |
100分贝 | 装修电钻的声音 |
110分贝 | 卡拉OK、大声播放MP3 的声音 |
120分贝 | 飞机起飞时的声音 |
150分贝 | 燃放烟花爆竹的声音 |
提一个小问题:120dB 是 60dB 的两倍么?
按照一般的逻辑:10米是5米的两倍,120dB 当然是 60dB 的两倍了。但从上面这个表格来看——答案显然是否定的。但是他们到底是怎样的关系呢?
这些要从分贝的定义说起:(百度百科_dB)
- dB是一个比值,是一个数值,是一个纯计数方法,没有任何单位标注。
- “分”(deci-)指十分之一,个位是“贝”(bel),它是一个以十为底的比值对数
说人话就是:
- 分贝与一般的单位不同,他是一个以对数形式记录的比值。
- 分贝并非是响度的“专属单位”,也用于表示信号强度等
- 分贝是一个比值,所以需要一个基准数值
在日常生活中,将人耳能听到的最微弱的的声音定义为0dB。在此场景中,负分贝,就是微不可闻的声响了。
当然,音频音量并非是微不可闻。而是定义不同。
上文提到,响度除了声源的振幅大小,还受人和声源的距离影响。音频音量大小是无法直接用我们日常的生活中的响度方式来度量的。
音频的音量是将0dB 定义为可表示的最大值,当0dB时,音频振幅到达峰值,超过0dB,波形就会失真。下图可见,当音频振幅超过表示范围,波峰被抹平了(在线体验)
更准确的说,音频的音量应当称之为声能。公式如下,E0为最大能量,E1为当前能量
根据公式可知,当E1增大一倍,则对应的分贝数增加 10*lg2 dB约为3dB。
那么我们现在来回答上面的两个问题:
- 音频音量,以0dB作为最大值,所以音量不会超过0dB,且越接近于0越大
- -6dB的音量,增大一倍应该是-3dB
声道
3.什么是立体声,环绕声?
广义上来说,立体声就是能给人打来立体感的声音。人有双耳,可以大致判断声源的位置。在音频里面,就涉及到多声道:
声道(Sound Channel) 是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号
狭义来说,立体声 就是由左右两个声道组成,相比单声道,更具方向感,分布感
环绕声 是指中央声道,前置左、右声道,后置左、右环绕声道,及所谓的0.1声道重低音声道,一般用于影院场景
音频混合
4.为什么音频混合后音量变小了?怎么解决呢?
在将多段音频通过延迟开始时间的方式进行混合之后,音量却变得很小,且越往后音量越大
ffmpeg -i 1.wav -i 2.wav -i 3.wav -i 4.wav -filter_complex '[1:a]adelay=630[a1];[2:a]adelay=4450[a2];[3:a]adelay=8100[a3];[a:0][a1][a2][a3]amix=inputs=4:dropout_transition=0' -async 1 out.wav
这个问题着实困扰了我们一段时间。其实想通了还是比较简单——上文说到,音量过大会导致波形失真,当有n个文件进行混音时,工具会自动将音量缩小到原有的1/n,而当一个音频播放完毕,n就减少了,相对的,单个音频音量也就增大了。
解决方式:
- dropout_transition参数设置到大于音频时长,这样就不会存在音频播放完毕,音量逐步增大的问题了
- 音频处理的最后,添加音量调节(volume或loudness)