前言

LibROSA 是一个用于音频分析的 Python 库,特别擅长音乐信号处理和音频特征提取。它提供了广泛的工具来处理音频文件,包括加载、变换、特征提取、可视化等功能。LibROSA 在音乐信息检索(MIR)、机器学习中的音频预处理和音频信号处理等领域被广泛使用。

本教程将带你从基础的音频加载到高级的音频特征提取与分析。你将学会如何使用 LibROSA 处理音频数据、提取特征(如 MFCC、频谱图等),并进行常见的音频操作。


目录

  1. LibROSA 基础

  2. 安装 LibROSA
  3. 加载音频文件
  4. 音频基本操作(播放、裁剪、变速)
  5. 音频处理

  6. 计算短时傅里叶变换(STFT)
  7. 频谱图与梅尔频谱图
  8. 音频过滤与降噪
  9. 特征提取

  10. 提取 MFCC 特征
  11. 提取零交叉率
  12. 提取色度特征
  13. 提取音调与和声特征
  14. 可视化音频特征

  15. 绘制波形图
  16. 绘制频谱图与梅尔频谱图
  17. 可视化 MFCC 特征
  18. 音频分析与处理应用

  19. 音乐节奏检测
  20. 音频分类
  21. 自动和弦检测


1. LibROSA 基础

安装 LibROSA

首先,你可以通过 pip 安装 LibROSA:

pip install librosa

LibROSA 依赖于 NumPy、SciPy 和 Matplotlib,所以确保这些库已经安装。

加载音频文件

LibROSA 提供了方便的 librosa.load() 函数来加载音频文件,它会返回音频信号和采样率。

import librosa

# 加载音频文件
audio_path = 'audio_file.wav'
y, sr = librosa.load(audio_path, sr=None)  # sr=None 保持原采样率
  • y:包含音频信号的数据。
  • sr:音频的采样率(如 22050 Hz)。
  • 音频基本操作

  • 播放音频:你可以使用 IPython.display 来播放音频。
  • import IPython.display as ipd
    
    # 播放音频
    ipd.Audio(y, rate=sr)
    
  •  变速操作:通过 librosa.effects.time_stretch() 可以改变音频的播放速度。
  • # 加速音频
    y_fast = librosa.effects.time_stretch(y, rate=1.5)
    ipd.Audio(y_fast, rate=sr)
    
  •  裁剪音频:你可以使用数组切片来裁剪音频信号。
  • # 裁剪前 10 秒
    y_trimmed = y[:10 * sr]
    ipd.Audio(y_trimmed, rate=sr)
    

    2. 音频处理

    计算短时傅里叶变换(STFT)

    短时傅里叶变换(STFT) 是音频信号处理中的基础操作,用于分析信号的频谱随时间的变化。

    import librosa.display
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 计算 STFT
    D = librosa.stft(y)
    
    # 转换为幅度谱
    D_abs = np.abs(D)
    
    # 绘制 STFT
    plt.figure(figsize=(10, 6))
    librosa.display.specshow(librosa.amplitude_to_db(D_abs, ref=np.max), sr=sr, x_axis='time', y_axis='log')
    plt.colorbar(format='%+2.0f dB')
    plt.title('STFT (Short-time Fourier Transform)')
    plt.show()
    

    频谱图与梅尔频谱图

    LibROSA 可以轻松计算并绘制 频谱图梅尔频谱图

  • 频谱图
  • # 绘制频谱图
    S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
    S_dB = librosa.power_to_db(S, ref=np.max)
    
    plt.figure(figsize=(10, 6))
    librosa.display.specshow(S_dB, sr=sr, x_axis='time', y_axis='mel')
    plt.colorbar(format='%+2.0f dB')
    plt.title('Mel Spectrogram')
    plt.show()
    

    音频过滤与降噪

    你可以通过应用滤波器来降低音频中的噪音,或者提取特定频段的信号。LibROSA 提供了 librosa.effects 模块来实现这些功能。

  • 应用高通滤波器
  • # 应用高通滤波器去除低频噪声
    y_filtered = librosa.effects.preemphasis(y, coef=0.97)
    

    3. 特征提取

    LibROSA 提供了丰富的工具来提取音频特征,这些特征常用于音频分类、语音识别、音乐推荐等任务。

    提取 MFCC 特征

    MFCC(梅尔频率倒谱系数) 是常用的音频特征,特别在语音识别中广泛使用。

    # 计算 MFCC
    mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
    
    # 绘制 MFCC
    plt.figure(figsize=(10, 6))
    librosa.display.specshow(mfccs, sr=sr, x_axis='time')
    plt.colorbar()
    plt.title('MFCC')
    plt.show()
    

    提取零交叉率

    零交叉率 用于衡量信号穿过零值的频率,通常用于分析音调特性。

    # 计算零交叉率
    zero_crossings = librosa.feature.zero_crossing_rate(y)
    
    plt.figure(figsize=(10, 4))
    plt.plot(zero_crossings[0])
    plt.title('Zero Crossing Rate')
    plt.show()
    

    提取色度特征

    色度特征 是表示音调强度的常用特征,特别适合分析音乐中的和弦和音调。

    # 计算色度特征
    chroma = librosa.feature.chroma_stft(y=y, sr=sr)
    
    # 绘制色度图
    plt.figure(figsize=(10, 6))
    librosa.display.specshow(chroma, sr=sr, x_axis='time', y_axis='chroma')
    plt.colorbar()
    plt.title('Chroma Feature')
    plt.show()
    

    提取音调与和声特征

    你可以使用 LibROSA 提取音频的音调、和声成分等特征。

    # 提取和声成分
    harmonic, percussive = librosa.effects.hpss(y)
    
    # 提取音调
    pitch, mag = librosa.core.piptrack(y=harmonic, sr=sr)
    

    4. 可视化音频特征

    绘制波形图

    你可以使用 librosa.display.waveplot() 绘制音频的波形图。

    plt.figure(figsize=(10, 4))
    librosa.display.waveshow(y, sr=sr)
    plt.title('Waveform')
    plt.show()
    

    绘制频谱图与梅尔频谱图

    通过 librosa.display.specshow(),你可以绘制频谱图、梅尔频谱图等音频特征图。

    # 绘制频谱图
    plt.figure(figsize=(10, 6))
    librosa.display.specshow(S_dB, sr=sr, x_axis='time', y_axis='mel')
    plt.colorbar(format='%+2.0f dB')
    plt.title('Mel Spectrogram')
    plt.show()
    

    可视化 MFCC 特征

    同样可以通过 librosa.display.specshow() 可视化 MFCC 特征。

    plt.figure(figsize=(10, 6))
    librosa.display.specshow(mfccs, sr=sr, x_axis='time')
    plt.colorbar()
    plt.title('MFCC')
    plt.show()
    

    5. 音频分析与处理应用

    音乐节奏检测

    LibROSA 支持自动检测音频中的节拍,可以帮助你进行节奏分析。

    tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
    print(f"Estimated Tempo: {tempo} BPM")
    

    音频分类

    通过提取音频特征,你可以将这些特征输入机器学习模型(如 Scikit-learn)来进行音频分类任务。

    from sklearn.svm import SVC
    from sklearn.model_selection import train_test_split
    
    # 使用 MFCC 特征作为输入
    X = mfccs.T
    y = [0 if i < len(X) // 2 else 1 for i in range(len(X))]  # 假设这是二分类数据
    
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    # 使用支持向量机 (SVM) 进行分类
    clf = SVC()
    clf.fit(X_train, y_train)
    
    # 预测与评估
    y_pred = clf.predict(X_test)
    accuracy = sum(y_pred == y_test) / len(y_test)
    print(f"分类准确率: {accuracy:.2f}")

    在这个例子中,使用 MFCC 特征来训练一个支持向量机(SVM)分类器。你可以根据数据集修改标签 y 并添加更多的特征,以便更好地训练模型。

    自动和弦检测

    通过使用色度特征和其他频率特征,LibROSA 可以帮助检测音频文件中的和弦。

    # 自动和弦检测
    import librosa.display
    
    # 提取色度特征
    chroma = librosa.feature.chroma_cqt(y=y, sr=sr)
    
    # 检测节奏
    tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)
    
    # 使用节拍同步色度特征
    chroma_sync = librosa.util.sync(chroma, beat_frames, aggregate=np.median)
    
    # 绘制节拍同步的色度图
    plt.figure(figsize=(10, 6))
    librosa.display.specshow(chroma_sync, sr=sr, x_axis='time', y_axis='chroma')
    plt.colorbar()
    plt.title('Chord Detection (Chroma Features)')
    plt.show()
    

    这个例子展示了如何使用 色度特征节拍同步 来检测音频中的和弦。


    结论

    通过本详细的 LibROSA 教程,你已经学会了如何使用 LibROSA 进行音频信号的加载、处理、特征提取和分析。从基础的音频文件操作到高级特征提取如 MFCC频谱图色度特征,LibROSA 提供了一套完整的工具,特别适合音乐信息检索、语音处理和音频分类等任务。

    LibROSA 的灵活性和强大的音频分析功能,使其成为音频数据处理和音乐信号分析中的重要工具。无论是在研究、开发音乐相关应用程序,还是在机器学习中的音频预处理,你都可以依赖 LibROSA 来轻松完成复杂的音频分析任务。

    如果你有更多的问题或者希望深入探讨,欢迎随时联系我!

    作者:可愛小吉

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 课程23-LibROSA

    发表回复