音频课程文档
音频数据简介
并获得增强的文档体验
开始
音频数据简介
本质上,声波是一种连续信号,意味着它在给定的时间内包含无限数量的信号值。 这对期望有限数组的数字设备造成了问题。 为了被数字设备处理、存储和传输,连续声波需要被转换为一系列离散值,称为数字表示。
如果您查看任何音频数据集,您会发现包含声音摘录的数字文件,例如文本旁白或音乐。 您可能会遇到不同的文件格式,例如 .wav
(波形音频文件)、.flac
(自由无损音频编解码器) 和 .mp3
(MPEG-1 音频层 3)。 这些格式的主要区别在于它们如何压缩音频信号的数字表示。
让我们看看我们如何从连续信号到达这种表示。 模拟信号首先由麦克风捕获,麦克风将声波转换为电信号。 然后,电信号通过模数转换器数字化,通过采样获得数字表示。
采样和采样率
采样是以固定的时间步长测量连续信号值的过程。 采样的波形是*离散的*,因为它在均匀的间隔包含有限数量的信号值。

来自维基百科文章的插图:采样(信号处理)
**采样率**(也称为采样频率)是每秒钟采集的样本数,以赫兹 (Hz) 为单位测量。 为了给您一个参考点,CD 质量的音频的采样率为 44,100 Hz,这意味着每秒采集 44,100 个样本。 相比之下,高分辨率音频的采样率为 192,000 Hz 或 192 kHz。 训练语音模型中常用的采样率是 16,000 Hz 或 16 kHz。
采样率的选择主要决定了可以从信号中捕获的最高频率。 这也称为奈奎斯特极限,恰好是采样率的一半。 人类语音中的可听频率低于 8 kHz,因此以 16 kHz 采样语音就足够了。 使用更高的采样率不会捕获更多信息,只会导致处理此类文件的计算成本增加。 另一方面,以过低的采样率采样音频会导致信息丢失。 以 8 kHz 采样的语音听起来会很沉闷,因为在这个速率下无法捕获更高的频率。
重要的是要确保当您处理任何音频任务时,数据集中的所有音频示例都具有相同的采样率。 如果您计划使用自定义音频数据来微调预训练模型,则数据的采样率应与模型预训练数据的采样率相匹配。 采样率决定了连续音频样本之间的时间间隔,这会影响音频数据的时间分辨率。 考虑一个示例:采样率为 16,000 Hz 的 5 秒声音将被表示为 80,000 个值的序列,而采样率为 8,000 Hz 的相同 5 秒声音将被表示为 40,000 个值的序列。 解决音频任务的 Transformer 模型将示例视为序列,并依靠注意力机制来学习音频或多模态表示。 由于不同采样率的音频示例的序列不同,因此模型在采样率之间进行泛化将具有挑战性。 **重采样**是使采样率匹配的过程,并且是预处理音频数据的一部分。
幅度和位深度
虽然采样率告诉您样本的采集频率,但每个样本中的值究竟是什么?
声音是由人类可听频率下气压的变化产生的。 声音的**幅度**描述了任何给定时刻的声压级,以分贝 (dB) 为单位测量。 我们将幅度感知为响度。 举个例子,正常的说话声音低于 60 分贝,而摇滚音乐会可能在 125 分贝左右,这已经接近人类听觉的极限。
在数字音频中,每个音频样本记录音频波在某个时间点的幅度。 样本的**位深度**决定了可以多精确地描述此幅度值。 位深度越高,数字表示就越忠实地逼近原始连续声波。
最常见的音频位深度是 16 位和 24 位。 每个都是一个二进制术语,表示当幅度值从连续值转换为离散值时,可以量化的可能步数:16 位音频为 65,536 步,24 位音频为惊人的 16,777,216 步。 由于量化涉及将连续值四舍五入为离散值,因此采样过程会引入噪声。 位深度越高,这种量化噪声就越小。 在实践中,16 位音频的量化噪声已经足够小而听不见,通常不需要使用更高的位深度。
您可能还会遇到 32 位音频。 这会将样本存储为浮点值,而 16 位和 24 位音频使用整数样本。 32 位浮点值的精度为 24 位,使其具有与 24 位音频相同的位深度。 浮点音频样本预计位于 [-1.0, 1.0] 范围内。 由于机器学习模型自然地处理浮点数据,因此音频必须首先转换为浮点格式,然后才能用于训练模型。 我们将在下一节“预处理”中了解如何执行此操作。
与连续音频信号一样,数字音频的幅度通常以分贝 (dB) 表示。 由于人类听觉本质上是对数的——我们的耳朵对安静声音的小波动比对响亮声音的小波动更敏感——如果幅度以分贝表示,声音的响度更容易解释,分贝也是对数的。 真实世界音频的分贝刻度从 0 dB 开始,这代表人类可以听到的最安静的声音,而响亮的声音具有更大的值。 但是,对于数字音频信号,0 dB 是可能的最大幅度,而所有其他幅度均为负值。 作为一个快速的经验法则:每 -6 dB 幅度减半,除非您真的调大音量,否则低于 -60 dB 的声音通常是听不见的。
音频作为波形
您可能已经看到声音被可视化为**波形**,它绘制了样本值随时间的变化,并说明了声音幅度的变化。 这也称为声音的时域表示。
这种类型的可视化对于识别音频信号的特定特征非常有用,例如各个声音事件的定时、信号的整体响度以及音频中存在的任何不规则性或噪声。
要绘制音频信号的波形,我们可以使用一个名为 librosa
的 Python 库
pip install librosa
让我们以库中附带的名为“trumpet”的示例声音为例
import librosa
array, sampling_rate = librosa.load(librosa.ex("trumpet"))
该示例加载为音频时间序列(这里我们称之为 array
)和采样率 (sampling_rate
) 的元组。 让我们通过使用 librosa 的 waveshow()
函数来查看此声音的波形
import matplotlib.pyplot as plt
import librosa.display
plt.figure().set_figwidth(12)
librosa.display.waveshow(array, sr=sampling_rate)

这会在 y 轴上绘制信号的幅度,并在 x 轴上绘制时间。 换句话说,每个点都对应于对此声音进行采样时采集的单个样本值。 另请注意,librosa 已经以浮点值形式返回音频,并且幅度值确实在 [-1.0, 1.0] 范围内。
将音频可视化与收听音频相结合,可以成为理解您正在处理的数据的有用工具。 您可以看到信号的形状、观察模式、学习发现噪声或失真。 如果您以某种方式预处理数据(例如归一化、重采样或滤波),您可以直观地确认预处理步骤已按预期应用。 在训练模型之后,您还可以可视化发生错误的样本(例如在音频分类任务中)以调试问题。
频谱
可视化音频数据的另一种方法是绘制音频信号的**频谱**,也称为频域表示。 频谱是使用离散傅里叶变换或 DFT 计算的。 它描述了构成信号的各个频率以及它们的强度。
让我们通过使用 numpy 的 rfft()
函数进行 DFT 来绘制相同小号声音的频谱。 虽然可以绘制整个声音的频谱,但查看一个小区域反而更有用。 在这里,我们将对前 4096 个样本进行 DFT,这大致是正在播放的第一个音符的长度
import numpy as np
dft_input = array[:4096]
# calculate the DFT
window = np.hanning(len(dft_input))
windowed_input = dft_input * window
dft = np.fft.rfft(windowed_input)
# get the amplitude spectrum in decibels
amplitude = np.abs(dft)
amplitude_db = librosa.amplitude_to_db(amplitude, ref=np.max)
# get the frequency bins
frequency = librosa.fft_frequencies(sr=sampling_rate, n_fft=len(dft_input))
plt.figure().set_figwidth(12)
plt.plot(frequency, amplitude_db)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude (dB)")
plt.xscale("log")

这绘制了此音频段中存在的各种频率分量的强度。 频率值在 x 轴上,通常以对数刻度绘制,而它们的幅度在 y 轴上。
我们绘制的频谱显示了几个峰值。 这些峰值对应于正在播放的音符的谐波,其中较高的谐波较安静。 由于第一个峰值在 620 Hz 左右,因此这是 E♭ 音符的频谱。
DFT 的输出是一个复数数组,由实部和虚部组成。 使用 np.abs(dft)
取模可从频谱图中提取幅度信息。 实部和虚部之间的角度提供了所谓的相位谱,但在机器学习应用中,相位谱通常被丢弃。
您使用 librosa.amplitude_to_db()
将幅度值转换为分贝刻度,从而更容易看到频谱中的精细细节。 有时人们使用功率谱,功率谱测量能量而不是幅度; 这只是一个幅度值平方的频谱。
音频信号的频谱包含与其波形完全相同的信息——它们只是查看相同数据的两种不同方式(这里是来自小号声音的前 4096 个样本)。 波形绘制音频信号的幅度随时间的变化,而频谱可视化固定时间点各个频率的幅度。
频谱图
如果我们想查看音频信号中的频率如何变化怎么办? 小号演奏了几个音符,它们都具有不同的频率。 问题是频谱仅显示给定时刻频率的冻结快照。 解决方案是进行多次 DFT,每次 DFT 仅覆盖一小段时间,并将生成的频谱堆叠在一起形成频谱图。
频谱图绘制音频信号的频率内容随时间的变化。 它允许您在一个图表上查看时间、频率和幅度。 执行此计算的算法是 STFT 或短时傅里叶变换。
频谱图是您可以使用的信息量最大的音频工具之一。 例如,当处理音乐录音时,您可以看到各种乐器和人声轨道以及它们如何为整体声音做出贡献。 在语音中,您可以识别不同的元音,因为每个元音都以特定的频率为特征。
让我们使用 librosa 的 stft()
和 specshow()
函数为相同的小号声音绘制频谱图
import numpy as np
D = librosa.stft(array)
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)
plt.figure().set_figwidth(12)
librosa.display.specshow(S_db, x_axis="time", y_axis="hz")
plt.colorbar()

在此图中,x 轴表示时间,就像在波形可视化中一样,但现在 y 轴表示频率,单位为 Hz。 颜色的强度表示每个时间点频率分量的幅度或功率,以分贝 (dB) 为单位测量。
频谱图是通过获取音频信号的短片段(通常持续几毫秒),并计算每个片段的离散傅里叶变换以获得其频谱而创建的。 然后将生成的频谱沿时间轴堆叠在一起以创建频谱图。 此图像中的每个垂直切片对应于单个频谱,从顶部看。 默认情况下,librosa.stft()
将音频信号分成 2048 个样本的片段,这在频率分辨率和时间分辨率之间取得了良好的平衡。
由于频谱图和波形是相同数据的不同视图,因此可以使用逆 STFT 将频谱图转换回原始波形。 但是,这除了幅度信息之外还需要相位信息。 如果频谱图是由机器学习模型生成的,则它通常仅输出幅度。 在这种情况下,我们可以使用相位重建算法(例如经典的 Griffin-Lim 算法)或使用称为声码器的神经网络,从频谱图重建波形。
频谱图不仅用于可视化。 许多机器学习模型会将频谱图作为输入(而不是波形),并生成频谱图作为输出。
现在我们知道什么是频谱图以及它是如何制作的,让我们看一下它的一种变体,该变体广泛用于语音处理:梅尔频谱图。
梅尔频谱图
梅尔频谱图是频谱图的一种变体,通常用于语音处理和机器学习任务。 它与频谱图类似,因为它显示音频信号的频率内容随时间的变化,但在不同的频率轴上。
在标准频谱图中,频率轴是线性的,以赫兹 (Hz) 为单位测量。 然而,人类听觉系统对较低频率的变化比对较高频率的变化更敏感,并且这种灵敏度随着频率的增加呈对数下降。 梅尔刻度是一种感知刻度,它近似于人耳的非线性频率响应。
要创建梅尔频谱图,就像以前一样使用 STFT,将音频分成短片段以获得一系列频谱。 此外,每个频谱都通过一组滤波器(所谓的梅尔滤波器组)发送,以将频率转换为梅尔刻度。
让我们看看如何使用 librosa 的 melspectrogram()
函数绘制梅尔频谱图,该函数为我们执行所有这些步骤
S = librosa.feature.melspectrogram(y=array, sr=sampling_rate, n_mels=128, fmax=8000)
S_dB = librosa.power_to_db(S, ref=np.max)
plt.figure().set_figwidth(12)
librosa.display.specshow(S_dB, x_axis="time", y_axis="mel", sr=sampling_rate, fmax=8000)
plt.colorbar()

在上面的示例中,n_mels
代表要生成的梅尔频带的数量。 梅尔频带定义了一组频率范围,这些频率范围使用一组滤波器将频谱划分为感知上有意义的分量,这些滤波器的形状和间距被选择为模仿人耳对不同频率的响应方式。 n_mels
的常用值为 40 或 80。 fmax
表示我们关心的最高频率(以 Hz 为单位)。
与常规频谱图一样,通常的做法是以分贝表示梅尔频率分量的强度。 这通常被称为对数梅尔频谱图,因为转换为分贝涉及对数运算。 上面的示例使用了 librosa.power_to_db()
,因为 librosa.feature.melspectrogram()
创建了一个功率频谱图。
log
。 因此,如果机器学习模型期望梅尔频谱图作为输入,请仔细检查以确保您以相同的方式计算它。创建梅尔频谱图是一种有损操作,因为它涉及过滤信号。 将梅尔频谱图转换回波形比对常规频谱图执行此操作更困难,因为它需要估计被丢弃的频率。 这就是为什么需要 HiFiGAN 声码器等机器学习模型来从梅尔频谱图生成波形的原因。
与标准频谱图相比,梅尔频谱图可以捕获对人类感知更有意义的音频信号特征,使其成为语音识别、说话人识别和音乐流派分类等任务的热门选择。
现在您已经知道如何可视化音频数据示例,请继续尝试看看您最喜欢的声音是什么样的。 :)
< > 在 GitHub 上更新