WAV 文件

前言

距离上一篇博客已经过去了一个半月,这段时间看了几篇关于 Learning to Rank 的文章,老肖就很固执地想让我用到代码错误检测中去,我还是想再慢慢学一下推荐算法,看能不能做点小工作。同时这段时间想搭一个 BBS,于是升级重构了一下 phphub,算是捡起 Laravel 再学习了一下吧!深度学习也不能落下,继续搞起来。

WAV 文件

在触发词检测实验之前,先来学习一下 WAV 文件。根据百度百科的解释:

WAV 为微软公司开发的一种声音文件格式,它符合RIFF (Resource Interchange File Format) 文件规范,用于保存 Windows 平台的音频信息资源,被 Windows 平台及其应用程序所广泛支持,该格式也支持 MSADPCM,CCITT A LAW 等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的 WAV 文件和 CD 格式一样,也是 44.1K 的取样频率,16 位量化数字,因此在声音文件质量和 CD 相差无几!

表示 WAV 文件使用的是 44.1K 的采样频率,16位量化数字(即采样位数为 16)。音频文件记录的是空气压力随时间的变化,表示麦克风检测到的微小气压变化。在 DeepLearning 触发词检测实验提供的数据中,我们查看 example_train.wav 文件的属性可知:

  • 文件大小:1764044 字节
  • 时长:00:00:10
  • 比特率:1411 kbps

这些值是怎么计算出来的呢?首先需要了解一下 WAV 格式文件的几个参数:

采样频率

指每秒钟取得声音样本的次数。采样的过程就是抽取某点的频率值,在一秒中内抽取的点越多,获取得频率信息更丰富,采样频率越高,声音的还原也就越真实越自然,但同时它占的资源比较多。

现实的时间是连续的,而电脑却做不到在每个时刻都能记录声音,所以只能通过采样。由于人耳的分辨率很有限,太高的频率并不能分辨出来。22050 赫兹的采样频率是常用的,44100 赫兹已是 CD 音质,超过 48000 赫兹或 96000 赫兹的采样对人耳已经没有意义。实验数据的采样频率为 44100 赫兹,即每秒获取声音样本 44100 次。

通道数

声音的通道的数目。常见的单声道和立体声(双声道),现在发展到了四声环绕(四声道)和5.1声道。

实验数据为双声道音频,所以采样就是双份的,即一次采样包含两帧。

采样位数

声卡处理声音的解析度。这个数值越大,解析度就越高,录制和回放的声音就越真实。 采样位数也叫采样大小或量化位数。它是用来衡量声音波动变化的一个参数,也就是声卡的分辨率。它的数值越大,分辨率也就越高,录制和回放的声音就越真实。

类似于图像的位数,位数越大,色彩越鲜艳,表达能力越强。

1
2
from scipy.io import wavfile
rate, data = wavfile.read('example_train.wav')

使用 wavfile.read() 获取 WAV 文件的采样频率和数据,data.shape 为:(441000, 2)。表示 10 秒音频一共获取声音样本 44100 × 10 次,每次采样包含两个声道(这里两个声道的声音一样)。data 的取值范围为 (-32768, 32767),即 $2^{16}$,表示每次的采样位数为 16。

比特率

每秒平均传输的千比特

$$
比特率 = 采样频率 × 通道数 × 采样位数 / 1000
$$

根据以上公式可以计算出比特率为 1411.2 kbps,与文件属性一致。

波形数据传输速率

每秒平均传输的字节

$$
波形传输速率 = 采样频率 × 通道数 × 采样位数 / 8
$$

根据以上公式可以算出波形传输速率为 176400 字节每秒。

文件大小

$$
文件大小 = 波形数据传输速率 × 音频文件时长
$$

根据以上公式可以算出文件大小为 176400,000 字节,即约为 1.68 MB,与文件属性一致。

音频文件时长

也可以根据文件大小和波形数据传输速率计算出音频文件的时长:
$$
音频文件时长 = 文件大小 / 波形数据传输速率
$$
同样可以验证音频文件的时长为 10 秒,在 Windows 操作系统中按整数显示音频文件的时长。

疏影横斜水清浅,暗香浮动月黄昏