适用于python3.x的pyAudioAnalysis使用及音频信号相关基础

使用pyAudioAnalys工具包来处理音频信号
你是否拥有一款属于自己的可穿戴设备?现在可穿戴设备异常发达,音频作为更加可获得的信号,是否可以为这些设备注入新的活力。记录一下音频相关知识以及适用于python3.x的特征提取方法。
1.音频相关知识
(1)基于片段(segment)的短期特征
音频信号(audio signal)在某个特定的“样本分辨率(sample resolution)”下由一串样本序列来表示的,并且会有一些特定的采样频率(例如,16KHz =每秒16000个样本)。
之后就可以使用这些样本(samples)来分析音频。例如我们能对两种不同的声音进行区别,将音频分割为均匀的片段(例如将语音信号中的浊音段和清音段分开),或者对于音频聚类。
特征提取(feature extraction简称FE)的目的,希望能够使用大量音频信号的底层特征来得到音频特征的高层表示(深度学习所做的似乎也就是这样),特征提取能够获得一组关于原始数据基本信息的特征,根据每一个人的领域不同,我们所感兴趣的特征值也不同。
短期窗口是FE的重要概念,即音频信号的采样窗口很短,以至于音频信号被分为很短的片段,采样时可以选择重叠部分,这里要说明,如果步长<窗口长度,采样得到的音频片段是由重叠部分的,(例如,步长10ms,窗口40ms,那么采样的重叠部分为75%),至于为什么需要重叠部分,可以找一些关于音频信号的相关论文里面讲到:避免丢失一些连续性的信息(有RNN那味了)。下图展示采样以及步长,阴影代表重叠部分
在这里插入图片描述
采样的长度通常为10-100ms,这可以根据你的具体数据来决定。当然也可以选择不重叠的方法来进行采样,那么最后得到的样本数量就等于你的 音频总长/(步长或采样窗口长度)。汉明窗(hamming)目前我还没掌握。
对于每一帧或者说每一个样本,我们都能够获取一组特征,直接从音频样本中提取的信号,称为时域特征。如果特征值是基于FFT(快速傅里叶变换)计算得到的,那么这些就成为频域信号。最后,倒谱特征(MFCCS)是基于倒谱的特征(这个十分关键)。
例如,让我们假设我们只提取信号的能量(音频样本的平方和)和频谱质心(快速傅立叶变换幅度的质心)。这意味着,在采样过程中,信号由一系列二维短期特征向量表示(或者两个等长的特征序列)。
那么如何来表示任意长度的音频?一种是短的填充到最大值,这样会使维度很高,并且时间戳也是一个问题。在传统的音频分析中,更常见的方法是为每个固定大小的片段提取一组特征统计。在短期特征序列上提取的段级统计是每个固定大小段的表示。最终的信号表示可以是分段统计的长期平均值。
例如,考虑一个2.5秒的音频信号。我们选择50毫秒的短期窗口和1秒的时间段。根据上述内容,将为每个1秒的片段提取能量和光谱质心序列。序列的长度将等于1 / 0.050 = 20。然后,为每个1秒的片段提取每个序列的μ和σ,作为片段特征统计。这些最终被平均,产生最终的信号表示。(请注意,最后一个片段长度为0.5,因此统计数据是在较短的片段上提取的)
在这里插入图片描述
注释:
1.)短期特征取样窗口大小一般在10-100毫秒,窗口越长代表更好的频率表示(计算快速傅立叶变换的样本越多,因此每个快速傅立叶变换仓对应的频率越少)。但是更长的窗口意味着时域信息的丢失----即窗口越长,对时域不友好对频域友好,因为音频信号是非平稳的(考虑一个较长的窗口,他包含了两个不同音频:这两个音频在频域的分辨率会很高,但是各自的特征具体代表什么呢?)
2.)信号的分段特征统计的长期平均步骤(如上所述)是可选的,通常在训练/测试音频分类器时采用。长期特征最后会用一个代表不同特征的向量来表示。但是当我们分析短期特征或者说需要对于原始信号进行分割的时候,长期特征值就不可取啦。

2.音频特征提取:代码示例
例1.使用pyAudioAnalysis读取WAV文件并且提取短期特征序列,并且绘制能量序列(这个图片仅仅代表一个特征值)。请参考以下两个代码以及注释:
1.read_audio_file()
2.返回音频文件的采样率(Fs)和原始音频样本的NumPy数组。要获得以秒为单位的持续时间,只需将样本数除以Fs即可。
3.ShortTermFeatures.feature_extraction()
4.函数返回(a)68 x sss的短期特征矩阵,其中68是库中实现的短期特征的数量,sss是1秒语音信号的帧数(在本例中1秒用作中期窗口)(b)68长度的字符串列表,其中包含库中实现的每个特征的名称。

以下代码在python3.8环境运行,因python3.9无法使用pip及pycharm 的setting中安装numpy及pandas,在此之前你需要安装一下库:
当然版本差异影响并不是很大,我使用的都是最新版本,运行目前没有问题。但是这些库你需要拥有
在这里插入图片描述

代码示例

from pyAudioAnalysis import ShortTermFeatures as aF
from pyAudioAnalysis import audioBasicIO as aIO 
import numpy as np 
import plotly.graph_objs as go 
import plotly
import IPython

# 读取音频文件
# fs是指文中开始所说的16kHz,即每秒取16000个样本,s是指你的音频文件总的样本数
fs, s = aIO.read_audio_file("data/object.wav")

# 例如我使用的pycharm,下面这个是用来播放音频文件的,可以删去不需要播放
IPython.display.display(IPython.display.Audio("data/object.wav"))

# 利用总样本数/每秒多少个样本=时长,来输出你的音频文件有多长
duration = len(s) / float(fs)
print(f'duration = {duration} seconds')

# 提取短期信号,win和step代表窗口和步长,f为一个[68,片段长度]的矩阵,fn为特征名称
win, step = 0.050, 0.050
[f, fn] = aF.feature_extraction(s, fs, int(fs * win), 
                                int(fs * step))
print(f'{f.shape[1]} frames, {f.shape[0]} short-term features')
print('Feature names:')
for i, nam in enumerate(fn):
    print(f'{i}:{nam}')
# plot short-term energy
# create time axis in seconds
time = np.arange(0, duration - step, win) 
# get the feature whose name is 'energy'
energy = f[fn.index('energy'), :]
mylayout = go.Layout(yaxis=dict(title="frame energy value"),
                     xaxis=dict(title="time (sec)"))
plotly.offline.iplot(go.Figure(data=[go.Scatter(x=time, 
                                                y=energy)], 
                               layout=mylayout))

运行结果:(原作者的音频文件)

duration = 1.03 seconds
20 frames, 68 short-term features
Feature names:
0:zcr
1:energy
2:energy_entropy
3:spectral_centroid
4:spectral_spread
5:spectral_entropy
6:spectral_flux
7:spectral_rolloff
8:mfcc_1
...
31:chroma_11
32:chroma_12
33:chroma_std
34:delta zcr
35:delta energy
...
66:delta chroma_12
67:delta chroma_std

代码运行问题:(使用自己的音频)
1.RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
读取除WAV文件之外的需要下载ffmpeg,读取的如果是WAV文件,那么他会出现这个警告,影响不大
2.duration = 858.1 seconds
这是我们使用s/fs得到音频长度

17162 frames, 68 short-term features
858.1是音频长度,因为我的采样频率为0.5,步长0.5.因此每秒钟就会有20个采样片段,那么每个特征值就有858.1*20=17168个片段表示,特征很显然就是68个。
3.2020.10.20更改,IPython安装好就能够显示图片了
在这里插入图片描述

例2.
未完待续
文章来源于https://hackernoon.com/intro-to-audio-analysis-recognizing-sounds-using-machine-learning-qy2r3ufl,由于翻译和信号处理知识薄弱,内容可能不够严谨,感兴趣可自行查阅。欢迎指正~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值