https://librosa.org/doc/latest/tutorial.html
本节介绍使用librosa进行开发的基础知识,包括包概述、基本和高级用法以及与scikit-learn 包的集成。我们将假设您对 Python 和 NumPy/SciPy 有基本的了解。
一、概述
librosa包的结构是子模块的集合:
-
librosa
-
librosa.beat
用于估计节奏和检测节拍事件的功能。 -
librosa.core
核心功能包括从磁盘加载音频、计算各种频谱图表示以及用于音乐分析的各种常用工具的功能。为方便起见,此子模块中的所有功能都可以从顶级librosa.*命名空间直接访问。 -
librosa.decompose
使用在scikit-learn中实现的矩阵分解方法进行谐波打击源分离 (HPSS) 和通用频谱图分解的函数 。 -
librosa.display
使用matplotlib虚拟化并显示. -
librosa.effects
时域音频处理,例如音调偏移和时间拉伸。该子模块还为分解子模块提供了时域包装器 。 -
librosa.feature
特征提取和操作。这包括低级特征提取,例如色谱图、梅尔谱图、MFCC 以及各种其他光谱和节奏特征。还提供了特征操作方法,例如增量特征和内存嵌入。 -
librosa.filters
滤波器组生成(色度、伪 CQT、CQT 等)。这些主要是librosa其他部分使用的内部函数。 -
librosa.onset
发病检测和发病强度计算。 -
librosa.segment
对结构分割有用的函数,例如递归矩阵构造、时滞表示和顺序约束聚类。 -
librosa.sequence
用于顺序建模的函数。各种形式的维特比解码,以及用于构建转移矩阵的辅助函数。 -
librosa.util
辅助实用程序(规范化、填充、居中等)
-
二、快速开始
在深入细节之前,我们将通过一个简短的示例程序
# 节拍跟踪示例
import librosa
# 1.获取包含的音频示例的文件路径。在这一步之后, filename将是一个字符串变量,其中包含示例音频文件的路径。
filename = librosa.example('nutcracker')
print(filename)
# C:\Users\Administrator\AppData\Local\librosa\librosa\Cache\Kevin_MacLeod_-_P_I_Tchaikovsky_Dance_of_the_Sugar_Plum_Fairy.ogg
# 2. 将音频加载和解码为时间序列 y,表示为一维 NumPy 浮点数组。变量sr包含y 的采样率, 即音频每秒的采样数。默认情况下,所有音频都混合为单声道并在加载时重新采样为 22050 Hz。可以通过向librosa.load 提供附加参数来覆盖此行为。
y, sr = librosa.load(filename)
print(y)
print(sr)
"""
[ 2.2716861e-06 5.3327208e-06 -7.2473290e-06 ... 1.1170751e-05
1.2871889e-06 5.4120628e-06]
22050
"""
# 3.运行默认的节拍跟踪器,节拍跟踪器的输出是对速度的估计(以每分钟节拍为单位),以及对应于检测到的节拍事件的帧数数组。
# 这里的帧对应于信号 (y) 的短窗口,每个都由样本分隔。 librosa使用居中的帧,因此第k个帧以 sample 为中心。hop_length = 512k * hop_length
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)
print('估计速度: {:.2f} 拍/分钟'.format(tempo))
# 估计速度: 107.67 拍/分钟
# 4. 将节拍事件的帧索引转换为时间戳
beat_times = librosa.frames_to_time(beat_frames, sr=sr)
print(beat_times)
print(len(beat_times)) # 212
"""
[ 1.18421769 1.71827664 2.32199546 2.87927438 3.45977324
4.01705215 4.59755102 5.13160998 5.7353288 6.29260771
6.84988662 7.40716553 7.9876644 8.54494331 9.12544218
9.65950113 10.21678005 10.72761905 11.28489796 11.79573696
12.32979592 12.86385488 13.42113379 13.95519274 14.4892517
15.02331066 15.55736961 16.09142857 16.62548753 17.15954649
17.69360544 18.25088435 18.80816327 19.31900227 19.87628118
20.38712018 20.92117914 21.4552381 21.98929705 22.52335601
23.05741497 23.59147392 24.12553288 24.65959184 25.19365079
25.72770975 26.26176871 26.81904762 27.35310658 27.88716553
28.44444444 29.00172336 29.55900227 30.11628118 30.67356009
31.20761905 31.78811791 32.34539683 32.85623583 33.36707483
33.90113379 34.43519274 34.94603175 35.45687075 35.99092971
36.52498866 37.03582766 37.56988662 38.12716553 38.66122449
39.2185034 39.75256236 40.30984127 40.84390023 41.40117914
41.9352381 42.46929705 43.02657596 43.56063492 44.11791383
44.67519274 45.2092517 45.76653061 46.30058957 46.85786848
47.41514739 47.94920635 48.48326531 48.99410431 49.50494331
50.03900227 50.54984127 51.08390023 51.61795918 52.10557823
52.61641723 53.17369615 53.7077551 54.24181406 54.77587302
55.28671202 55.82077098 56.35482993 56.91210884 57.4461678
58.00344671 58.56072562 59.09478458 59.62884354 60.18612245
60.72018141 61.27746032 61.81151927 62.32235828 62.83319728
63.36725624 63.90131519 64.43537415 64.94621315 65.45705215
65.99111111 66.50195011 67.03600907 67.57006803 68.10412698
68.63818594 69.1722449 69.72952381 70.28680272 70.84408163
71.40136054 71.98185941 72.56235828 73.14285714 73.70013605
74.28063492 74.83791383 75.37197279 75.90603175 76.50975057
77.04380952 77.62430839 78.1815873 78.73886621 79.29614512
79.85342404 80.38748299 80.92154195 81.47882086 82.05931973
82.66303855 83.26675737 83.87047619 84.45097506 85.07791383
85.6584127 86.26213152 86.84263039 87.44634921 88.02684807
88.63056689 89.21106576 89.76834467 90.34884354 90.9293424
91.48662132 92.06712018 92.64761905 93.20489796 93.76217687
94.34267574 94.89995465 95.48045351 96.03773243 96.59501134
97.15229025 97.70956916 98.26684807 98.82412698 99.3814059
99.93868481 100.47274376 101.05324263 101.58730159 102.16780045
102.70185941 103.25913832 103.81641723 104.37369615 104.93097506
105.48825397 106.04553288 106.60281179 107.1600907 107.71736961
108.25142857 108.80870748 109.36598639 109.92326531 110.48054422
111.03782313 111.59510204 112.15238095 112.70965986 113.24371882
113.80099773 114.3814966 114.93877551 115.47283447 116.03011338
116.58739229 117.1446712 ]
212
"""
三、高级用法
在这里,我们将介绍一个更高级的示例,集成谐波打击分离、多频谱特征和节拍同步特征聚合。
# 特征提取示例
import numpy as np
import librosa
# 加载示例剪辑
y, sr = librosa.load(librosa.ex('nutcracker'))
print(y)
print(sr)
"""
[ 2.2716861e-06 5.3327208e-06 -7.2473290e-06 ... 1.1170751e-05
1.2871889e-06 5.4120628e-06]
22050
"""
print('---------1')
# 设置跳跃长度;在22050 Hz时,512个样本~=23ms
hop_length = 512
# 将谐波和打击音分离为两种波形
# 这条线的结果是时间序列y被分成两个时间序列,包含信号的谐波(音调)和打击(瞬态)部分。每个y_harmonic和y_percussive具有与y 相同的形状和持续时间。
# 这种操作的动机有两个:第一,打击乐元素往往是节奏内容的更强指标,可以帮助提供更稳定的节拍跟踪结果;其次,敲击元素可以通过在所有频带上贡献能量来污染音调特征表示(例如色度),所以没有它们我们会更好。
y_harmonic, y_percussive = librosa.effects.hpss(y)
print(y_harmonic)
print(y_percussive)
"""
[ 9.6558847e-07 1.9192130e-06 -2.4968756e-06 ... 7.1187296e-06
-5.8214446e-06 1.4830528e-06]
[ 1.3060979e-06 3.4135082e-06 -4.7504536e-06 ... 4.0520222e-06
7.1086342e-06 3.9290112e-06]
"""
print('---------2')
# 打击信号的节拍
tempo, beat_frames = librosa.beat.beat_track(y=y_percussive,
sr=sr)
print(tempo)
print(beat_frames)
"""
107.666015625
[ 51 74 100 124 149 173 198 221 246 270 295 319 344 367
393 415 439 461 485 507 531 554 577 600 623 646 669 692
716 739 762 785 807 831 855 877 900 923 946 969 993 1015
1038 1061 1085 1107 1131 1155 1178 1201 1225 1248 1272 1296 1320 1344
1368 1392 1414 1437 1460 1483 1505 1527 1550 1573 1595 1618 1641 1664
1688 1712 1735 1758 1782 1806 1829 1852 1876 1900 1924 1947 1971 1994
2018 2041 2064 2087 2110 2132 2155 2177 2200 2222 2244 2266 2289 2312
2335 2357 2380 2404 2427 2451 2474 2498 2521 2544 2568 2592 2615 2638
2661 2684 2706 2728 2752 2775 2797 2819 2842 2864 2887 2910 2933 2955
2978 3001 3024 3050 3075 3100 3125 3150 3174 3199 3223 3246 3269 3295
3317 3340 3362 3385 3409 3432 3456 3480 3508 3533 3560 3585 3612 3637
3663 3688 3714 3740 3766 3791 3816 3841 3866 3890 3915 3940 3965 3989
4014 4038 4063 4087 4111 4135 4159 4183 4208 4231 4255 4279 4304 4327
4351 4374 4399 4422 4447 4471 4495 4519 4543 4567 4590 4614 4638 4662
4686 4709 4734 4758 4781 4805 4829 4853 4877 4901 4925 4949 4973 4997
5021]
"""
print('---------3')
# 从原始信号计算MFCC特征,引入特征模块并从原始信号中提取y梅尔频率倒谱系数
# 这个函数的输出是矩阵mfcc,它是一个numpy.ndarray形状(其中T表示以帧为单位的轨道持续时间)。请注意,我们在这里使用与节拍跟踪器中相同的hop_length值,因此检测到的 beat_frames值对应于mfcc
mfcc = librosa.feature.mfcc(y=y, sr=sr, hop_length=hop_length, n_mfcc=13)
print(mfcc)
"""
[[-602.36005 -602.36005 -602.36005 ... -602.36005 -602.36005 -602.36005]
[ 0. 0. 0. ... 0. 0. 0. ]
[ 0. 0. 0. ... 0. 0. 0. ]
...
[ 0. 0. 0. ... 0. 0. 0. ]
[ 0. 0. 0. ... 0. 0. 0. ]
[ 0. 0. 0. ... 0. 0. 0. ]]
"""
print('---------4')
# 介绍的第一种特征操作是delta,它计算输入列之间的(平滑的)一阶差分,生成的矩阵mfcc_delta与输入具有相同的形状mfcc。
mfcc_delta = librosa.feature.delta(mfcc)
print(mfcc_delta)
"""
[[-1.4463899e-14 -1.4463899e-14 -1.4463899e-14 ... -6.2357583e-03
-6.2357583e-03 -6.2357583e-03]
[ 0.0000000e+00 0.0000000e+00 0.0000000e+00 ... -3.2735986e-03
-3.2735986e-03 -3.2735986e-03]
[ 0.0000000e+00 0.0000000e+00 0.0000000e+00 ... 6.3850912e-03
6.3850912e-03 6.3850912e-03]
...
[ 0.0000000e+00 0.0000000e+00 0.0000000e+00 ... -6.9502019e-03
-6.9502019e-03 -6.9502019e-03]
[ 0.0000000e+00 0.0000000e+00 0.0000000e+00 ... -7.6169395e-03
-7.6169395e-03 -7.6169395e-03]
[ 0.0000000e+00 0.0000000e+00 0.0000000e+00 ... 1.2936007e-03
1.2936007e-03 1.2936007e-03]]
"""
print('---------5')
# 第二种类型的特征操作是sync,它在样本索引(例如,节拍帧)之间聚合其输入的列
# 在节拍事件之间堆叠和同步,使用平均值(默认值)而不是中值
# 在这里,我们将mfcc和mfcc_delta矩阵垂直堆叠在一起。此操作的结果是一个beat_mfcc_delta行数与其输入相同的矩阵,但列数取决于beat_frames. 每列beat_mfcc_delta[:, k] 将是beat_frames[k]和beat_frames[k+1]之间的输入列 的平均值。(beat_frames将扩展到[0, T]整个范围,以便考虑所有数据。)
beat_mfcc_delta = librosa.util.sync(np.vstack([mfcc, mfcc_delta]),
beat_frames)
print(beat_mfcc_delta)
"""
[[-5.96049988e+02 -4.71975800e+02 -4.18740723e+02 ... -2.30209213e+02
-1.81633041e+02 -4.22515228e+02]
[ 5.29752207e+00 1.19491829e+02 1.19481026e+02 ... 6.63411026e+01
6.66919479e+01 7.45729675e+01]
[ 1.79374278e+00 5.01075478e+01 1.31605749e+01 ... -6.48235626e+01
-6.93393173e+01 -2.06293182e+01]
...
[-6.54890239e-02 -1.46449849e-01 5.33927456e-02 ... -1.69990078e-01
6.22177720e-01 1.29084542e-01]
[-2.32196320e-02 -1.37379706e-01 -1.14388270e-02 ... -2.49835134e-01
2.49134526e-01 8.30472354e-03]
[ 2.86480300e-02 -2.01024413e-01 -5.54224029e-02 ... 7.50199929e-02
-6.15619719e-01 7.62829408e-02]]
"""
print('---------6')
# 根据谐波信号计算色度特征
# 在这一行之后,chromagram将是一个(12, T)numpy.ndarray形状,并且每一行对应一个音高等级(例如,C、C#等)。chromagram的每一列 都按其峰值进行归一化,尽管可以通过设置norm参数来覆盖此行为。
chromagram = librosa.feature.chroma_cqt(y=y_harmonic,
sr=sr)
print(chromagram)
"""
[[0.39842078 0.72821146 0.5112 ... 0.07674009 0.1826097 0.21996354]
[0.184021 0.2362303 0.20697293 ... 0.14807418 0.12667468 0.12313929]
[0.26100114 0.47968242 0.3257294 ... 0.50196356 0.3805346 0.3323997 ]
...
[0.43242434 1. 0.36311993 ... 0.08561122 0.11927649 0.1906719 ]
[0.5385497 0.75896347 0.5056572 ... 0.2465618 0.19920714 0.25050488]
[1. 0.9247911 1. ... 0.97489566 0.87546647 1. ]]
"""
print('---------7')
# 一旦我们有了色度图和节拍帧列表,我们再次同步节拍事件之间的色度:
# 节拍事件之间的聚合色度特征
# 我们将在拍帧之间使用每个特征的中值
# 这一次,我们用中位数替换了默认的聚合操作( average,如上用于 MFCC)。一般来说,这里可以提供任何统计汇总函数,包括np.max()、np.min()、np.std()等。
beat_chroma = librosa.util.sync(chromagram,
beat_frames,
aggregate=np.median)
print(beat_chroma)
"""
[[0.30175975 0.03334792 0.10535411 ... 0.15082903 0.07464597 0.07904111]
[0.26126412 0.04063718 0.08386499 ... 0.09641555 0.12792844 0.09272036]
[0.46405286 0.0580609 0.09553827 ... 0.44566268 0.1866724 0.1327422 ]
...
[0.24895 0.01804281 0.03957673 ... 0.18349287 0.9024316 0.03978507]
[0.209619 0.01893757 0.05923 ... 0.14936522 0.17757306 0.05588835]
[0.28115574 0.04807906 0.35781693 ... 0.40019333 0.2977572 0.35058373]]
"""
print('---------8')
# 最后,将所有节拍同步特征叠加在一起
# 产生一个beat_features形状(12 + 13 + 13, # beat intervals) 的特征矩阵。
beat_features = np.vstack([beat_chroma, beat_mfcc_delta])
print(beat_features)
"""
[[ 0.30175975 0.03334792 0.10535411 ... 0.15082903 0.07464597
0.07904111]
[ 0.26126412 0.04063718 0.08386499 ... 0.09641555 0.12792844
0.09272036]
[ 0.46405286 0.0580609 0.09553827 ... 0.44566268 0.1866724
0.1327422 ]
...
[-0.06548902 -0.14644985 0.05339275 ... -0.16999008 0.6221777
0.12908454]
[-0.02321963 -0.1373797 -0.01143883 ... -0.24983513 0.24913453
0.00830472]
[ 0.02864803 -0.20102441 -0.0554224 ... 0.07501999 -0.6156197
0.07628294]]
"""
print('---------9')