零基础入门语音识别-食物声音识别 Task02『赛题数据介绍与分析』


介绍

本文主要是通过对声音数据介绍与分析。在本次Task02的学习之前,我们先来思考以下问题:

  1. 声音是什么呢?
  2. 声音的原理是什么?
  3. 我们应该如何去分析声音数据?

我的思考:

  • 声音是振动产生的声波,通过介质(气体、固体、液体)传播并能被人或动物听觉器官所感知的波动现象。
  • 声音是一种波动,当演奏乐器、拍打一扇门或者敲击桌面时,声音的振动会引起介质——空气分子有节奏的振动,使周围的空气产生疏密变化,形成疏密相间的纵波,这就产生了声波,这种现象会一直延续到振动消失为止。声音总可以被分解为不同频率不同强度正弦波的叠加。这种变换(或分解)的过程,称为傅里叶变换。
  • 上个问题中,提到的傅里叶变换,就是对声音(声波)的处理,通过转换,使之变为数学中的周期函数形式。音波常简化为正弦平面波的合成,各平面波可以用以下的性质来描述:
    • 频率:频率越大,音调越高;频率越小,音调越低。(介质相同时,fλ成反比)
    • 波长:波长越短,音调越高;波长越长,音调越低。(介质相同时,fλ成反比)
    • 波数
    • 振幅:振幅越大,音量(响度)越大;振幅越小,音量越小。
    • 声压
    • 音强
    • 音速
    • 方向
    • 音色:即波形

一、下载数据集

### 下载天池数据集并解压
wget http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531887/train_sample.zip
unzip -qq train_sample.zip
rm train_sample.zip

wget http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531887/test_a.zip
unzip -qq test_a.zip
rm test_a.zip

二、数据处理与分析

1.导入音频处理库

安装库
librosa官方文档
音频处理库—librosa的安装与使用

pip install librosa

导入库

import librosa
import librosa.display

2.查看数据基本情况

在做数据分析之前,我们得先对数据进行统计,了解数据的基本情况。

import os

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()

输出
在这里插入图片描述

python format的基本用法

数字格式输出描述
3.1415926{:.2f}3.14保留小数点后两位
3.1415926{:+.2f}+3.14带符号保留小数点后两位
-1{:+.2f}-1.00带符号保留小数点后两位
2.71828{:.0f}3不带小数
5{:0>2d}05数字补零 (填充左边, 宽度为2)
5{:x<4d}5xxx数字补x (填充右边, 宽度为4)
10{:x<4d}10xx数字补x (填充右边, 宽度为4)
1000000{:,}1,000,000以逗号分隔的数字格式
0.25{:.2%}25.00%百分比格式
1000000000{:.2e}1.00e+09指数记法
13{:>10d}13右对齐 (默认, 宽度为10)
13{:<10d}13左对齐 (宽度为10)
13{:^10d}13中间对齐 (宽度为10)

^, <, > 分别是居中、左对齐、右对齐,后面带宽度, :号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。

+ 表示在正数前显示 +,负数前显示 -(空格)表示在正数前加空格

b、d、o、x 分别是二进制、十进制、八进制、十六进制。

'{:b}'.format(11) # 1011
'{:d}'.format(11) # 11
'{:o}'.format(11) # 13
'{:x}'.format(11) # b
'{:#x}'.format(11) # 0xb
'{:#X}'.format(11) # 0XB

3.查看音频特征

使用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)来更改采样频率

data1, sampling_rate1 = librosa.load('./train_sample/aloe/24EJ22XBZ5.wav')

画出波形幅度包络图

# 芦荟的波形幅度包络
plt.figure(figsize=(14, 5))
librosa.display.waveplot(data1,sr=sampling_rate1)

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

# 芦荟的声谱图
plt.figure(figsize=(20, 10))
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')

在这里插入图片描述

参考资料


Datawhale Github官方代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值