零基础入门语音识别-食物声音识别[Task 2]

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

Task1 食物声音识别之Baseline学习

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值