音频时域特征的提取

介绍

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

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

在这些本篇中,我将详细说明该特性是什么,如何正式定义它,并展示如何在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

deephub翻译组

在Python中,对于时域特征提取,你可以使用各种信号处理库和机器学习库来实现。以下是一些常用的库和方法: 1. Librosa:它是一个用于音频和音乐信号处理的流行库。你可以使用Librosa来提取各种时域特征,如时长、能量、过零率、音调等。 ```python import librosa # 加载音频文件 audio, sr = librosa.load('audio.wav') # 提取时长 duration = librosa.get_duration(audio, sr) # 提取能量 energy = librosa.feature.rms(audio) # 提取过零率 zero_crossing_rate = librosa.feature.zero_crossing_rate(audio) # 提取音调 pitches, magnitudes = librosa.piptrack(audio) # 其他特征提取方法请参考Librosa文档 ``` 2. Python_speech_features:这是一个专门用于语音信号处理的库。你可以使用它提取MFCC(Mel频率倒谱系数)等特征。 ```python from python_speech_features import mfcc # 提取MFCC特征 mfcc_features = mfcc(audio, sr) # 其他特征提取方法请参考Python_speech_features文档 ``` 3. SciPy:SciPy是一个强大的科学计算库,其中包含了丰富的信号处理函数。你可以使用SciPy来进行信号滤波、傅里叶变换等操作。 ```python from scipy import signal # 设计一个低通滤波器 b, a = signal.butter(4, 0.2, 'low') # 应用滤波器 filtered_audio = signal.lfilter(b, a, audio) # 进行傅里叶变换 spectrum = np.fft.fft(audio) # 其他信号处理操作请参考SciPy文档 ``` 这只是几个常用的库和方法,实际上还有很多其他的库和算法可以用于时域特征提取。具体使用哪个库和方法取决于你的需求和数据类型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值