UrbanSound8K-城市音频分类实战

先放个排名:
没错,榜一AiFool就是我了,打工赚点米饭钱。。。
在这里插入图片描述

大赛简介
该数据集收录的城市声音包含10个声音类别、8732个声音文件(每个文件最长不超过4秒)。

环境声音分类是一个不断发展的研究领域,例如对导致城市噪声污染的声音研究。鉴于对环境,特别是城市环境声音进行分类的各种研究,我们应该使用哪种分类法,它是否能满足我们的研究需求等并没有明确的结论。通过本赛题建立准确的音频分类模型,希望给大家带来更多对音频分类方法上的思考与突破。

比赛链接:https://www.flyai.com/d/173

赛事主题和数据说明
赛题描述
通过实现算法并提交训练,获取奖金池奖金。小提示:抢先更新算法排行榜,有更大机会获取高额奖金哦!

数据来源
UrbanSoundClassification

数据描述
由于需要提交代码作品在云端进行训练,参赛数据集不对外开放。仅提供调试数据,可通过使用本地调试的方式获取调试数据集。本地调试和提交指南请查看[文档中心]

字段说明:

文件名 字段名称 字段类型 备注
ID string 不为空 音频路径
Class string 大于等于 0, 小于等于 9 音频分类
参考文献:

[1]无

评审标准
算法输入输出格式
输入字段: ID,

输出字段: Class,

评审指标说明
准确率(Accuracy):对于给定的测试数据集,预测正确的样本数与实际总样本数之比
True,表示预测正确的样本数数量
Total Number of Samples,表示实际总样本数数量
计算公式如下:
在这里插入图片描述

实战开始

1.数据描述
wav音频文件名音频分类
n.wavclass n

通俗一点就是模型的输入是wav格式的音频文件,输出是这个音频的类别。
类别一共有这几种:

self.list_labels = ['air_conditioner', 'car_horn', 'children_playing', 'dog_bark',
                            'drilling','engine_idling', 'gun_shot', 'jackhammer', 'siren', 'street_music']

再来说一下wav格式的音频文件:
这里先举个例子,获取音频信息:

with wave.open(wav_path, "rb") as f:
    f = wave.open(wav_path)
    print(f.getparams())

返回内容为:

  • 声道,
  • 采样宽度,
  • 帧速率,
  • 帧数,
  • 唯一标识,
  • 无损

在这里插入图片描述
音频信息:
采样点的个数为 2510762,采样的频率为44100HZ,通过这两个参数可以得到声音信号的时长,每个采样点是16 bit = 2 bytes ,那么将采样点的个数 25107622/(10241024)=4.78889MB,那么这个信息就是文件大小信息。

检验一下声音波形的时间
xx.wav 4.78MB,时长56s
time = 56.93337868480726

WAV文件中由以下三个部分组成:
1.“RIFF” chunk descriptor
2.The “fmt” sub-chunk
3.The “data” sub-chunk
存这些信息的时候都要要有 “ID”、“大小”、“格式”,这些信息标注了数据的位置, “WAV”格式由“fmt”和“data”,两个部分组成,其中“fmt”的存储块用来存音频文件的格式,“data”的存储块用来存实际听到的声音的信息,物理上描述的振幅和时间:长度(时间)和振幅,当然人的耳朵听听见的是长度和音调。也就是说可以读取这个数组,在配合频率的信息直接画出波形图。
在这里插入图片描述
通过这个图片,应该可以对音频信号有个大体的概念。音频可以分解为时间维度上的频率波。既然是分类问题,那最重要的就是提取音频特征了,我们有了从时间维度提取音频特征的方法,那接下来再用一些其他的方法,丰富其特征。

2.音频特征提取方法

先走个捷径:

(1)使用spafe提取音频特征

spafe.fbanks

Bark filterbanks

import matplotlib.pyplot as plt
from spafe.fbanks import bark_fbanks

# compute fbanks
fbanks = bark_fbanks.bark_filter_banks(nfilts=24, nfft=512, fs=16000)

# plot fbanks
for i in range(len(fbanks)):
    plt.plot(fbanks[i])
    plt.ylim(0, 1.1)
    plt.grid(True)
    plt.ylabel(ylabel)
    plt.xlabel(xlabel)
    plt.show()

在这里插入图片描述

Gammatone filterbanks

import matplotlib.pyplot as plt
from spafe.fbanks import gammatone_fbanks

# compute fbanks
fbanks = gammatone_fbanks.gammatone_filter_banks(nfilts=24, nfft=512, fs=16000)

# plot fbanks
for i in range(len(fbanks)):
   plt.plot(fbanks[i])
   plt.ylim(0, 1.1)
   plt.grid(True)
   plt.ylabel(ylabel)
   plt.xlabel(xlabel)
   plt.show()

在这里插入图片描述

Mel filterbanks

import matplotlib.pyplot as plt
from spafe.fbanks import mel_fbanks

# compute fbanks
fbanks = mel_fbanks.mel_filter_banks(nfilts=24, nfft=512, fs=16000)

# plot fbanks
for i in range(len(fbanks)):
    plt.plot(fbanks[i])
    plt.ylim(0, 1.1)
    plt.grid(True)
    plt.ylabel(ylabel)
    plt.xlabel(xlabel)
    plt.show()

在这里插入图片描述

spafe.features

MFCC, IMFCC, MFE

import scipy.io.wavfile
import spafe.utils.vis as vis
from spafe.features.mfcc import mfcc, imfcc, mfe


# read wave file
fs, sig = scipy.io.wavfile.read('../test.wav')

# compute mfccs and mfes
mfccs  = mfcc(sig, 13)
imfccs = imfcc(sig, 13)
mfes   = mfe(sig, fs)

# visualize features
vis.visualize(mfccs, 'MFCC Coefficient Index','Frame Index')
vis.visualize(imfccs, 'IMFCC Coefficient Index','Frame Index')
vis.plot(mfes,  'MFE Coefficient Index','Frame Index')

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面说的是一种比较便捷的提取音频特征的方法,但是要做到提取自定义的特征,还是要用其他的方法,写累了,,,未完待续。。。。

这里整理了多种音频特征提取方法(bark,gamma,linear,mel,bfcc,gfcc,lfcc,lpc,mfcc,msrcc,ngcc,pncc,psrcc,rplp,spfeats),开箱即用,欢迎下载:
音频特征提取示例

(2)使用librosa提取音频特征

这个是flyai给出的输入示例,ID表示输入音频的id号。

def input_x(self, ID):
    duration = 2.97
    sr = 22050
    y, sr = librosa.load(os.path.join(path.DATA_PATH, ID), duration=duration, sr=sr)
    return y

本模型使用改进后的函数:

def input_x(self, ID):
    duration = 2.97
    sr = 22050
    #y, sr = librosa.load(os.path.join(path.DATA_PATH, ID), duration=duration, sr=sr)
    x, xsr = sf.read(os.path.join(path.DATA_PATH, ID), always_2d=True)
    x = self.parse_audio(x)
    fx = self.mean_mfccs(x)
    return fx

先来介绍一下librosa的使用方法:介绍

读取音频

librosa.load(path, sr=22050, mono=True, offset=0.0, duration=None)

读取音频文件。默认采样率是22050,如果要保留音频的原始采样率,使用sr = None。

参数:
path :音频文件的路径。
sr :采样率,如果为“None”使用音频自身的采样率
mono :bool,是否将信号转换为单声道
offset :float,在此时间之后开始阅读(以秒为单位)
持续时间:float,仅加载这么多的音频(以秒为单位)

返回:
y :音频时间序列
sr :音频的采样率

使用soundfile读取音频文件

这里要注意的是原始音频文件的声道和原始采样率信息,如果设置错误会导致原始的特征失真。
我并没有使用librosa.load,因为我认为pysoundfile更好用,而且librosa兼容性有时候不好,读取某些文件会报错,而always_2d=True参数会使pysoundfile读取出的音频文件具有相同的shape。

pysoundfile文档地址:https://pypi.org/project/SoundFile/
https://pysoundfile.readthedocs.io/en/latest/#module-soundfile

SoundFile has evolved rapidly during the last few releases. Most
notably, we changed the import name from import pysoundfile to import
soundfile
in 0.7. In 0.6, we cleaned up many small inconsistencies,
particularly in the the ordering and naming of function arguments and
the removal of the indexing interface.

In 0.8.0, we changed the default value of always_2d from True to
False. Also, the order of arguments of the write function changed from
write(data, file, …) to write(file, data, …).

In 0.9.0, we changed the ctype arguments of the buffer_* methods to
dtype, using the Numpy dtype notation. The old ctype arguments still
work, but are now officially deprecated.

在这里插入图片描述

在这里插入图片描述
Examples

```python
>>> import soundfile as sf
>>> data, samplerate = sf.read('stereo_file.wav')
>>> data
array([[ 0.71329652,  0.06294799],
       [-0.26450912, -0.38874483],
       ...
       [ 0.67398441, -0.11516333]])
>>> samplerate
44100

这里整理了多种音频特征提取方法(bark,gamma,linear,mel,bfcc,gfcc,lfcc,lpc,mfcc,msrcc,ngcc,pncc,psrcc,rplp,spfeats),开箱即用,欢迎下载:
音频特征提取示例

其实可以按照上面的方法,把上述几种特征都提取出来,特征不够怎么能练好丹呢

  • 7
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AiFool

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值