声音是如何产生的
声音以波的形式传播,即声波(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)]