让音视频学习变得简单之音频深度学习(2):为什么梅尔频谱图的性能更好

一份用Python处理音频的实用指南:什么是梅尔频谱图,以及如何用通俗易懂的语言生成音视频。

这是我介绍有关音频深度学习系列的第二篇文章。现在我们已经知道了声音是如何以数字方式表示的,需要将其转换为频谱图以便用于深度学习体系结构。接下来,我们将更详细地了解如何转换以及怎样调整以获得更好的性能。

由于数据准备至关重要(尤其是在音频深度学习模型中),所以这将是接下来两篇文章的重点。

这里有我相关文章的索引。我的目标始终是不仅要理解某件事情的工作原理,还要理解它工作的动因。

1.最先进的技术-本文(声音及其数字化方式。在日常生活中深度学习音频会遇到那些问题?什么是声谱图,为什么它们对使用语音聊天室至关重要?)

2.为什么梅尔频谱图的性能更好(在Python中处理音频数据。什么是梅尔频谱图以及如何生成它们)

3.功能的优化和增强(增强频谱图功能可通过超参数调整和数据增强实现最佳性能)

4.音频分类(端到端的示例和用于对普通声音进行分类的体系结构。适用于语音聊天室使用的各种场景。)

5.自动语音识别(语音转文本算法和体系结构,使用CTC Loss和解码来对齐序列)

音频文件格式和Python库

深度学习模型的音视频数据通常以数字音频文件开头。从收听录音和音乐开始,我们就都知道这些文件会根据声音的压缩方式以各种格式存储。这些格式的示例包括.wav、.mp3、.wma、.aac、.flac等。

Python中有一些很棒的音频处理库,其中,Librosa是最受欢迎的数据库之一,并且功能广泛,scipy也很常用。如果你使用的是Pytorch,它有一个名为torchaudio的配套库,该库与Pytorch紧密联系,它虽然没有Librosa那么的功能,但它却是专门为深度学习而开发的。

这些音频处理库都能让你读取不同格式的音频文件,而第一步是加载文件。比如用librosa:

import librosa

# Load the audio file
AUDIO_FILE = './audio.wav'
samples, sample_rate = librosa.load(AUDIO_FILE, sr=None)

或者,你也可以使用scipy执行相同的操作:

然后可以将声波可视化:

import librosa.display
import matplotlib.pyplot as plt

# x-axis has been converted to time using our sample rate. 
# matplotlib plt.plot(y), would output the same figure, but with sample 
# number on the x-axis instead of seconds
plt.figure(figsize=(14, 5))
librosa.display.waveplot(samples, sr=sample_rate)


可视化声波(图像由作者提供)

如果你使用的是Jupyter笔记本,则可以直接在单元中播放音频。

from IPython.display import Audio
Audio(AUDIO_FILE)

8f7vjehxOiaWnLvl
在笔记本电脑中播放音频(图片由作者提供)

音频信号数据

正如我们在上一篇文章中所看到的,音频数据是通过有规律的时间间隔对声波进行采样,并在每个样本处测量声波的强度或幅度来获得的。该音频的元数据会告诉我们采样率,即每秒的采样数。

当该音频保存在文件中时,它是压缩格式。加载文件后,将其解压并转换为Numpy数组。无论你以哪种文件格式开始,这个数组看起来都是一样的。

在存储器中,音频被表示为数字的时间序列,也就是每个时间步长的振幅。例如,如果采样率为16800,则一秒钟的音频片段将具有16800个数字。由于测量是在固定的时间间隔下进行的,因此数据仅包含振幅数量,而不包含时间值。在给定采样率的情况下,我们可以计算出在特定时间点进行测量的振幅数量。

print ('Example shape ', samples.shape, 'Sample rate ', sample_rate, 'Data type', type(samples))
print (samples[22400:22420])

Qo1DoCIvMRVpMOry

位深告诉我们每个样本的这些振幅测量值可以有多少种可能。例如,位深为16表示振幅数可以在0到65535((2 ¹⁶ -1)之间。位深会影响音频测量的分辨率,位深度越高,音频保真度越好。


位深和采样率决定了音频分辨率(来源

频谱图

深度学习模型很少将这种原始音频直接输入。正如我们在第1部分中了解到的那样,常见的做法是将音频转换成声谱图。频谱图是音视频的“快照”,并且由于它是图像,因此非常适合输入到为处理图像而开发的基于CNN的架构中。

频谱图是使用Fourier Transforms从声音信号中生成的。Fourier Transforms将信号分解成其组成频率,并显示信号中存在的每个频率的振幅。

频谱图将声音信号的持续时间缩短为较小的时间段,然后将Fourier Transform应用于每个时间段以确定该段中所含的频率。然后,它将所有时间段的Fourier Transform合为一个图。

频谱图绘制了频率(y轴)与时间(x轴)的关系,并使用不同的颜色表示每个频率的幅度。颜色越亮,信号越强。

sgram = librosa.stft(samples)
librosa.display.specshow(sgram)

1_RUAD62d_SM2hT3DInZy89g
简单频谱图(图像由作者提供)

不幸的是,当我们显示此频谱图时,并没有太多信息可供我们查看。我们过去在科学课上看到的所有彩色频谱图发生了什么?

这是由于人类感知声音的方式而产生的。我们能够听到的大多数声音都集中在狭窄的频率和振幅范围内。让我们先探讨一下,找出如何产生那些可爱的声谱图。

人类如何听到频率?

我们听到声音频率的方式称为“音调”。这是频率的主观印象。因此,高音调的声音比低音调声音的频率更大。人类不会线性感知频率,我们对低频之间的差异比高频更为敏感。

例如,听不同的声音组,如下所示:

  • 100Hz和200Hz
  • 1000Hz和1100Hz
  • 10000Hz和10100 Hz

你对 每对声音之间的“距离”有什么 看法 ?你能区分每对声音吗?

即使在所有情况下,每对声音之间的实际频率差在100 Hz时都完全相同,但100Hz和200Hz 听起来要 比1000Hz和1100Hz听起来 相距更远 。而且,你很难区分10000Hz和10100Hz之间的区别。

但是,如果我们意识到200Hz的频率实际上是100Hz的两倍,而10100Hz的频率仅比10000Hz的频率高1%,这一切似乎就不足为奇了。

这就是人类感知频率的方式。我们通过对数标度而不是线性标度感知频率。那如何用数据说明这一点?

梅尔倒频谱系数

开发梅尔倒频谱系数是为了通过与大量听众进行实验来考虑到这一点。它是音高的标度,因此听众认为每个单元与下一个单元的音高距离相等。

1_erUKb2-Z-Wi_u8JWel6cDQ
梅尔标度(Mel Scale)用于测量人类对音高的感知(来源, by permission of Prof Barry Truax)

人类如何感知振幅?

人类对声音振幅的感知就是声音的响度。与频率相似,我们听到的音量增大,一般都是非线性放大,而不是线性的,并且使用分贝表对此进行说明。

分贝标度

在此等级上,0 dB是完全静音。从此处开始,测量单位呈指数增长。10 dB是0 dB的10倍,20 dB是100倍,30 dB是1000倍。在此规模上,高于100 dB的声音开始变得让人难以忍受。

o71O8EgJ3QBRIHOE
普通声音的分贝级别(改编来源)

我们可以看到,为了以真实的方式处理声音,我们在处理数据的频率和幅度时,必须通过梅尔标度和分贝标度使用对数标度。

这正是梅尔谱图的作用。

梅尔谱图

相对于绘制频率与时间的常规频谱图,梅尔谱图进行了两个重要的更改。

  • 它使用Mel比例而不是y轴上的频率。
  • 它使用分贝标度代替振幅来指示颜色。

对于深度学习模型,我们通常使用此方法而不是简单的频谱图。

让我们修改上面的频谱图代码,以使用梅尔倒频谱系数代替频率。

# use the mel-scale instead of raw frequency
sgram_mag, _ = librosa.magphase(sgram)
mel_scale_sgram = librosa.feature.melspectrogram(S=sgram_mag, sr=sample_rate)
librosa.display.specshow(mel_scale_sgram)

1_bcpnwBoPEV8OvIdhUjQMPA
使用梅尔标度的频谱图(图片由作者提供)

这比之前的效果要好,但是大多数频谱图仍然很暗,没有携带足够的有用信息。因此,我们需要对它进行修改,以使用分贝标度代替幅度。

# use the decibel scale to get the final Mel Spectrogram
mel_sgram = librosa.amplitude_to_db(mel_scale_sgram, ref=np.min)
librosa.display.specshow(mel_sgram, sr=sample_rate, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')

1_Fro3rNxKeNq4L1pqx7o41Q
梅尔频谱图(图片由作者提供)

最后!这才是我们真正想要得到的东西。

结论

现在我们已经看到了如何预处理音视频数据并准备梅尔频谱图。但是在将它们输入到深度学习模型之前,我们必须对其进行优化以获得最佳性能。

在下一篇关于音视频文章中,我们将研究如何通过调整梅尔谱图以及增强音频数据以帮助我们的模型推广到更广泛的输入范围来增强模型数据。

原文作者 Ketan Doshi

原文链接https://towardsdatascience.com/audio-deep-learning-made-simple-part-2-why-mel-spectrograms-perform-better-aad889a93505

推荐阅读
作者信息
AgoraTechnicalTeam
TA 暂未填写个人简介
文章
155
相关专栏
本专栏仅用于分享音视频相关的技术文章,与其他开发者和 Agora 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。