Task2 食物声音识别-赛题数据介绍与分析

声音是如何产生的

声音以波的形式传播,即声波(Sound Wave)。当我们以波的视角来理解声音时,却又大繁若简起来:仅凭频率(Frequency)、 幅度(Magnitude)、相位(Phase)便构成了波及其叠加的所有,声音的不同音高(Pitch)、音量(Loudness)、音色(Timbre) 也由这些基本“粒子”组合而来。声音以波的形式传播,即声波(Sound Wave)。当我们以波的视角来理解声音时,却又大繁若简起来:仅凭频率(Frequency)、 幅度(Magnitude)、相位(Phase)便构成了波及其叠加的所有,声音的不同音高(Pitch)、音量(Loudness)、音色(Timbre) 也由这些基本“粒子”组合而来。

赛题数据集介绍

声音分类在很多场景中都有大模型的应用,例如对音乐的分类可以应用于音乐检索和音乐推荐中; 对人声的分类可以应用在身份识别、智能家居中。本比赛的背景是食物的声音的分类,是一个充满趣味性的任务。

本次比赛的数据集来自Kaggle的“Eating Sound Collection”(可商用), 数据集中包含20种不同食物的咀嚼声音,赛题任务是给这些声音数据建模,准确分类。

01 数据探索

import pandas as pd
import numpy as np
pd.plotting.register_matplotlib_converters()
'''pandas.plotting.register_matplotlib_converters()[source]
Register pandas formatters and converters with matplotlib.

This function modifies the global matplotlib.units.registry dictionary. pandas adds custom converters for

pd.Timestamp

pd.Period

np.datetime64

datetime.datetime

datetime.date

datetime.time'''
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.model_selection import GridSearchCV

from sklearn.preprocessing import MinMaxScaler
#加载音频库
import os
import librosa
import librosa.display
import glob
import IPython.display as  ipd

Python有一些很棒的音频处理库,比如Librosa和PyAudio,还有一些内置的模块用于处理音频的基本处理。

我们将主要使用两个库进行音频采集和回放: 1)Librosa:它通常用于分析音频信号,但更倾向于音乐,它包括用于构建MIR(音乐信息检索)系统的nuts 和 bolts。示例和教程可以参考:https://librosa.github.io/librosa/ 2)IPython.display.Audio: 该模块能使得音频直接在jupyter笔记本中播放。

voice_path = './train_sample'


def look_data():
    # 音频类别文件夹个数
    print(f'音频文件夹的个数: {len(os.listdir(voice_path))}')#os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表

    voice_total = 0
    single_label = {}
    for ind, label_name in enumerate(os.listdir(voice_path)):
        file_path = voice_path + '/' + label_name
        single_num = len(os.listdir(file_path))
        single_label[label_name] = single_num
        voice_total += single_num

    print(f'音频文件总量: {voice_total}')
    print(f'{"序号":<5}{"类别":<15}{"数量":<10}{"占比"}')
    for ind, (key, value) in enumerate(single_label.items()):
        print(f'{ind:<5}{key:<20}{value:<10}{value / voice_total:.2%}')


look_data()
        
    
音频文件夹的个数: 20
音频文件总量: 1000
序号   类别             数量        占比
0    aloe                45        4.50%
1    burger              64        6.40%
2    cabbage             48        4.80%
3    candied_fruits      74        7.40%
4    carrots             49        4.90%
5    chips               57        5.70%
6    chocolate           27        2.70%
7    drinks              27        2.70%
8    fries               57        5.70%
9    grapes              61        6.10%
10   gummies             65        6.50%
11   ice-cream           69        6.90%
12   jelly               43        4.30%
13   noodles             33        3.30%
14   pickles             75        7.50%
15   pizza               55        5.50%
16   ribs                47        4.70%
17   salmon              37        3.70%
18   soup                32        3.20%
19   wings               35        3.50%
# 播放芦荟的声音
ipd.Audio('./train_sample/aloe/24EJ22XBZ5.wav')
#使用librosa模块加载音频文件,librosa.load()加载的音频文件,默认采样率(sr)为22050HZ mono。我们可以通过librosa.load(path,sr=44100)来更改采样频率
data1, sampling_rate1 = librosa.load('./train_sample/aloe/24EJ22XBZ5.wav')
data2, sampling_rate2 = librosa.load('./train_sample/burger/0WF1KDZVPZ.wav')

# 芦荟的波形幅度包络
plt.figure(figsize=(14, 5))
librosa.display.waveplot(data1,sr=sampling_rate1)
<matplotlib.collections.PolyCollection at 0x1b2ee060100>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5eDsUzzz-1618412284879)(output_10_1.png)]

# 汉堡的波形幅度包络图
plt.figure(figsize=(14, 5))
librosa.display.waveplot(data2,sr=sampling_rate2)
<matplotlib.collections.PolyCollection at 0x1b2ed9b9cd0>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLfxkdkh-1618412284884)(output_11_1.png)]

查看声谱图

声谱图(spectrogram)是声音或其他信号的频率随时间变化时的频谱(spectrum)的一种直观表示。声谱图有时也称sonographs,voiceprints,或者voicegrams。当数据以三维图形表示时,可称其为瀑布图(waterfalls)。在二维数组中,第一个轴是频率,第二个轴是时间。我们使用librosa.display.specshow来显示声谱图。

sr(sample_rate) 采样率,表示一秒采样多少个样本点
hop_length 步幅;帧移对应卷积中的stride;连续帧分割长度
overlapping 连续两帧的重叠部分
n_fft 窗口大小;n_fft = hop_length+overlapping
spectrum 光谱,频谱
spectrogram: 光谱图;声谱图
Chromagram 色谱图
amplitude 振幅
logarithmic amplitude-frequency 对数振幅频谱图
mono 单声道
pitch 音高
timbral 音色

# 芦荟的声谱图
plt.figure(figsize=(20, 50))
D = librosa.amplitude_to_db(np.abs(librosa.stft(data1)), ref=np.max)
plt.subplot(4, 2, 1)
librosa.display.specshow(D, y_axis='linear')
plt.colorbar(format='%+2.0f dB')
plt.title('%echo维')
Text(0.5, 1.0, '%echo维')



C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py:238: RuntimeWarning: Glyph 32500 missing from current font.
  font.set_text(s, 0.0, flags=flags)
C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py:201: RuntimeWarning: Glyph 32500 missing from current font.
  font.set_text(s, 0, flags=flags)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTPYq3hx-1618412284887)(output_14_2.png)]

# 汉堡的声图谱
plt.figure(figsize=(20, 10))
D = librosa.amplitude_to_db(np.abs(librosa.stft(data2)), ref=np.max)
plt.subplot(4, 2, 1)
librosa.display.specshow(D, y_axis='linear')
plt.colorbar(format='%+2.0f dB')
plt.title('Linear-frequency power spectrogram of burger')
Text(0.5, 1.0, 'Linear-frequency power spectrogram of burger')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cyWVLUTA-1618412284889)(output_15_1.png)]


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值