零基础入门语音识别-食物声音识别[Task 2]
Task2 食物声音识别之赛题数据介绍与分析1 赛题数据探索声音识别,那么声音有什么特点呢?声音是以波的形式传播,声波的特性由频率,振幅和相位决定其音高,音量和音色。丰富的声波在自然中的叠加创造了人耳可以听见以及听不见的声音,给生活带来了乐趣抑或烦恼。赛题是分类不同食物的咀嚼声音并做标签,可以推而广之作为音乐分类,音乐推荐以及声音识别等多种用途。2 音频相关知识点学习为了了解我们要处理的音频数据,
Task2 食物声音识别之赛题数据介绍与分析
1 赛题数据探索
声音识别,那么声音有什么特点呢?声音是以波的形式传播,声波的特性由频率,振幅和相位决定其音高,音量和音色。丰富的声波在自然中的叠加创造了人耳可以听见以及听不见的声音,给生活带来了乐趣抑或烦恼。
赛题是分类不同食物的咀嚼声音并做标签,可以推而广之作为音乐分类,音乐推荐以及声音识别等多种用途。
2 音频相关知识点学习
为了了解我们要处理的音频数据,我们需要用到python的一些音频库对音频进行采样以及回放。在这个赛题中主要应用的是python中的librosa这个音频处理库,当然除了librosa还有其他PyAudio,PortAudio以及Pydub等。介于这次的赛题中主要采用的是librosa这个音频库,下面都对这个库进行介绍。
2.1 加载音频库
librosa是一个Python模块,通常用于分析音频信号,但更倾向于音乐。它包括用于构建MIR(音乐信息检索)系统的nuts 和 bolts。示例和教程:https://librosa.github.io/librosa/
具体librosa中的核心函数以及基本操作可以参考:https://blog.csdn.net/zzc15806/article/details/79603994
库的安装语句
pip install librosa
or
conda install -c conda-forge librosa
并将相应的所需用到的库函数加载
import librosa
import librosa.display
2.2 音频采样和特征
首先,需要对给定的音频数据进行分析,那么第一个步骤无论是图片也好,音频也罢,通常都会先统计一下文件的数量,大小以及目前的训练集的分类情况,这样对数据量有个大概的了解,也会决定后面具体算法和函数的选用,示例如下:
voice_path = './train_sample'
def look_data():
# 音频类别文件夹个数
print(f'音频文件夹的个数: {len(os.listdir(voice_path))}')
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()
下一步就是随机选择一些音频文件来查看具体的音频特征,就是上面我们提到的声音的三个参数:频率,幅度和相位。在做具体的音频操作之前,先听一下具体的音频内容,在jupyter中采用的播放的函数是IPython.display.audio()传递的参数为需要播放的音频文件地址。
# 播放芦荟的声音
import IPython.display as ipd
ipd.Audio('./train_sample/aloe/24EJ22XBZ5.wav')
有了感官上的了解以后,使用librosa模块加载音频文件,librosa.load()加载的音频文件,默认采样率(sr)为22050HZ mono。我们可以通过librosa.load(path,sr=44100)来更改采样频率,返回的是音频数据(数据类型是ndarray)以及采样率。
data1, sampling_rate1 = librosa.load('./train_sample/aloe/24EJ22XBZ5.wav')
接下来从幅度,频谱两个维度来对所要识别的音频文件进行了解。
查看波形幅度包络图,首先设置图的大小,采用plt.figure(figsize=(14,5)),其中表示14和5分别表示figure 的大小为宽、长(单位为inch)。然后用librosa.display.waveplot()函数,参数为音频数据以及采样率,这里会有多声道的情况,左右声道会展示在轴上下
# 芦荟的波形幅度包络
plt.figure(figsize=(14, 5))
librosa.display.waveplot(data1,sr=sampling_rate1)
查看声谱图(spectrogram),声谱图是声音或其他信号的频率随时间变化时的频谱(spectrum)的一种直观表示。声谱图有时也称sonographs,voiceprints,或者voicegrams。当数据以三维图形表示时,可称其为瀑布图(waterfalls)。在二维数组中,第一个轴是频率,第二个轴是时间。我们使用librosa.display.specshow()函数来显示声谱图。展示出来的是不同的时间点上相应频率的幅度(这里是转化成对数表示dB)。那么越亮就代表相应的频率越响,在此刻的音频组成中体现的越响。
音频数据->通过STFT变换得到幅度,相位->通过对数变换将幅度转换成dB,并绘制出音频数据在每个时间点上各频率的幅度的大小,可以理解称为这个时间点上音频的频率+响度组成。
# 芦荟的声谱图
plt.figure(figsize=(20, 10))
# 将音频数据通过短时傅里叶变换并做的幅度转化成dB
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('Linear-frequency power spectrogram of aloe')
实际运行结果和赛题指导一致,由于文件名不同,所以随机选取了音频文件做分析。
更多推荐
所有评论(0)