0


音频时域特征的提取

介绍

在音频领域中,我们可以使用深度学习提取和分析这些音频的频率和时域特征以了解波形的属性。在时域内提取特征时,通常将研究每个样本的幅度。我们如何操纵幅度为我们提供了有关信号的某些细节。

在开始之前,我先确定一些符号:

在这些本篇中,我将详细说明该特性是什么,如何正式定义它,并展示如何在Python中提取这些特性。我们将随机查看不同类型(特别是R&B、说唱和摇滚)歌曲的7秒片段,因为我们将能够更好地看到这些特性的属性。

出于版权考虑,我不能分享这些有争议的歌曲,但我会分享这些歌曲的输出情节和类型。这将使我们能够研究流派之间的细微差别。

 import numpy as np
 import math
 import matplotlib.pyplot as plt
 import librosa
 import librosa.display as ld
 # Load in the songs
 rb, sr = librosa.load('td/rb.wav')
 rap, _ = librosa.load('td/rb.wav')
 rock, _ = librosa.load('td/rock.wav')

振幅包络线

振幅包络(Amplitude Envelope)的目的是提取每一帧的最大振幅并将它们串在一起。重要的是要记住振幅代表信号的音量(或响度)。首先,我们把信号分解成它的组成窗口,并找出每个窗口内的最大振幅。然后,我们画出每个窗口沿时间的最大振幅。

我们可以将AE用于检测声音是否开始。在各种语音处理应用程序中,这可能是某人讲话或外部噪音,而在音乐信息检索(MIR)中,这可能是音符或乐器的开始。

AE的主要缺点是对离群值的鲁棒性不如我们即将研究的Root-Mean-Square Energy。

我们可以这样来形式化这个概念:

在Python中搜索可以完成此任务的已定义方法后,我找不到它。因此,我们将轻松地对其进行定义。我们将要研究的其他特征提取方法已经在librosa中定义,因此我们将在正式定义它们之后使用这些函数。

重要的是要注意,通过此for循环中的设置,我们没有指定跳跃长度。这意味着,当我们创建上下边界时,窗口不会重叠,从而使跳长和帧长相同。

 def AE(signal, frame_length):
     '''
     Create the Amplitude Envelope of a given signal.
     
     Parameters:
     ------------
     
     - signal (numpy array):
         The signal/sound in question to be analyzed. 
     - frame_size (int):
         Number of samples within each frame. Formally defined as K.
     
     Returns:
     ---------
     Array of amplitude envelope
     '''
     AE = []
     # Calculate number of frames
     num_frames = math.floor(signal.shape[0] / frame_length)
     for t in range(num_frames):
         # Calculate bounds of each frame
         # By doing this, our hop length is the same as the frame length
         # Therefore, these frames are NOT overlapping.
         lower = t*frame_size
         upper = (t+1)*(frame_size-1)
         # Find maximum of each frame and add it to our array
         AE.append(np.max(signal[lower:upper]))
     return np.array(AE)

现在,要可视化并比较不同类型的AE:

能量的均方根 Root-Mean-Square Energy

如前所述,均方根(RMS)能量与AE非常相似。但是,与开始检测相反,它尝试感知响度,该响度可用于事件检测。此外,它对于异常值的抵抗力要强得多,这意味着如果我们对音频进行分段,就可以更加可靠地检测到新事件(例如新乐器,某人讲话等)。

RMS能量的正式定义:

如果你熟悉均方根的概念,这对你来说不会太新。然而,如果你没有,也不要担心。

当我们观察波形时,我们对窗口内的振幅进行平方,然后求和。一旦完成,我们将除以帧长,取平方根,那将是那个窗口的均方根能量。

要提取RMS,我们可以简单地使用librosa.feature.rms。现在,我们把它形象化:

 # Define ZCR for each genre
 ZCRrb = librosa.feature.zero_crossing_rate(y = rb, frame_length=1024, hop_length=1024)
 ZCRrap = librosa.feature.zero_crossing_rate(y = rap, frame_length=1024, hop_length=1024)
 ZCRrock = librosa.feature.zero_crossing_rate(rock, frame_length=1024, hop_length=1024)
 # Now we plot:
 fig, ax = plt.subplots(2,3, figsize=(30,15))
 # Plotting R&B
 ax[0,0].set(title='Wave Form of R&B')
 ld.waveplot(rb, sr=sr, ax=ax[0,0])
 ax[1,0].set(title = 'ZCR Energy of R&B')
 ax[1,0].plot(ZCRrb.T) # Returned shape is (1,t) so we take the transpose.
 # Plotting Rap
 ax[0,1].set(title='Wave Form of Rap')
 ld.waveplot(rap, sr=sr, ax=ax[0,1])
 ax[1,1].set(title = 'ZCR Energy of Rap')
 ax[1,1].plot(ZCRrap.T)
 # Plotting Rock
 ax[0,2].set(title='Wave Form of Rock')
 ld.waveplot(rock, sr=sr, ax=ax[0,2])
 ax[1,2].set(title = 'ZCR Energy of Rock')
 ax[1,2].plot(ZCRrock.T)

从均方根和声发射的差异可以看出,均方根波动不像声发射那样剧烈。这个特性使振幅的均方根对异常值更加稳健。

过零率

过零速率(ZCR)的目的是研究信号的幅值在每一帧中的变化速率。与前两个特性相比,这个特性非常容易提取。

ZCR的正式定义如下:

对于MIR,此功能与识别打击乐器声音有关,因为它们经常具有波动信号,ZCR可以很好地检测到这些声音,并且可以检测到音高。但是,此功能通常用作语音识别中用于语音活动检测的功能。

使用librosa,我们可以使用librosa.feature.zero_crossing_rate提取ZCR。

 # Define ZCR for each genre
 ZCRrb = librosa.feature.zero_crossing_rate(y = rb, frame_length=1024, hop_length=1024)
 ZCRrap = librosa.feature.zero_crossing_rate(y = rap, frame_length=1024, hop_length=1024)
 ZCRrock = librosa.feature.zero_crossing_rate(rock, frame_length=1024, hop_length=1024)
 # Now we plot:
 fig, ax = plt.subplots(2,3, figsize=(30,15))
 # Plotting R&B
 ax[0,0].set(title='Wave Form of R&B')
 ld.waveplot(rb, sr=sr, ax=ax[0,0])
 ax[1,0].set(title = 'ZCR Energy of R&B')
 ax[1,0].plot(ZCRrb.T) # Returned shape is (1,t) so we take the transpose.
 # Plotting Rap
 ax[0,1].set(title='Wave Form of Rap')
 ld.waveplot(rap, sr=sr, ax=ax[0,1])
 ax[1,1].set(title = 'ZCR Energy of Rap')
 ax[1,1].plot(ZCRrap.T)
 # Plotting Rock
 ax[0,2].set(title='Wave Form of Rock')
 ld.waveplot(rock, sr=sr, ax=ax[0,2])
 ax[1,2].set(title = 'ZCR Energy of Rock')
 ax[1,2].plot(ZCRrock.T)

结论

到现在为止,您应该对时间特征提取如何工作,如何在各种基于音频的应用程序中加以利用以及如何自己开发特征提取方法有所了解。通过利用特定窗口内的振幅,我们对MIR和ASR中的各种应用打开了无数的见解。感谢您的阅读!

本文代码:https://github.com/theadamsabra/LearningfromAudio

作者:Adam Sabra

标签:

“音频时域特征的提取”的评论:

还没有评论