介绍
本文主要是通过对声音数据介绍与分析。在本次Task02的学习之前,我们先来思考以下问题:
- 声音是什么呢?
- 声音的原理是什么?
- 我们应该如何去分析声音数据?
我的思考:
- 声音是振动产生的声波,通过介质(气体、固体、液体)传播并能被人或动物听觉器官所感知的波动现象。
- 声音是一种波动,当演奏乐器、拍打一扇门或者敲击桌面时,声音的振动会引起介质——空气分子有节奏的振动,使周围的空气产生疏密变化,形成疏密相间的纵波,这就产生了声波,这种现象会一直延续到振动消失为止。声音总可以被分解为不同频率不同强度正弦波的叠加。这种变换(或分解)的过程,称为傅里叶变换。
- 上个问题中,提到的傅里叶变换,就是对声音(声波)的处理,通过转换,使之变为数学中的周期函数形式。音波常简化为正弦平面波的合成,各平面波可以用以下的性质来描述:
- 频率:频率越大,音调越高;频率越小,音调越低。(介质相同时,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')