【Python百日进阶-Web开发-音频】Day703 - librosa快速入门


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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岳涛@心馨电脑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值